Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/33: Рейтинг темы: голосов - 33, средняя оценка - 4.85
Hykhtomdir

STM8S, IAR и умножение 16х16

26.06.2014, 02:21. Показов 6463. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, коллеги.

Делаю сейчас довольно тривиальную и по смыслу и по содержанию железяку, но совершенно неожиданно для себя наступил с размаху на грабли там, где их, по закону жанра, менее всего ожидалось. В общем, имеем примерно такой код:
Code
1
2
3
4
const uc16 MaxVal=4200;
static u32 testval;
......
testval = MaxVal * MaxVal;
Ну вот казалось бы, 2*2=4, что тут думать? Ан нет, фигушки. После выполнения получаем testval=10816, вместо 4200*4200=17640000. Почему так, ясно из дизассемблера. 10816=0x2A40, 17640000=0x010D2A40. То есть, два старших байта просто обнулены. Дизассемблированный кусок:
Code
1
2
3
4
5
6
7
8
9
10
11
    109              testval=(u32)(MaxVal * MaxVal);
\   000027 CE ....      LDW       X, L:MaxVal
\   00002A 90CE ....    LDW       Y, L:MaxVal
\   00002E BF ..        LDW       S:?w0, X
\   000030 93           LDW       X, Y
\   000031 CD ....      CALL      L:?mul16_x_x_w0
\   000034 BF ..        LDW       S:?w1, X
\   000036 5F           CLRW      X
\   000037 BF ..        LDW       S:?w0, X
\   000039 AE ....      LDW       X, #??testval
\   00003C CD ....      CALL      L:?tood32_0x_l0
Видно, что вызывается процедура шестнадцатибитного умножения. Может, просто у IAR нету тридцатидвухбитного? Фигушки, есть! Если трошки порыться в потрохах, можно даже увидеть, что называется она ?mul32_l0_l0_dl.
Собственно, вопрос заключается в том, как заставить компилятор перемножать числа правильно.
Кстати, если вместо приведённого примера написать
Code
1
testval=4200*4200;
-те же яйца, вид сбоку (оптимизация отключена). Если в дебагере руками присвоить переменной testval правильное значение (0x010D2A40)-всё ок. Бьюсь башкой об клаву уже полдня-не могу перемножить два целых положительных числа правильно... ППЦ.

Проц STM8S103F3, IAR 1.40.1. Придайте мне, плиз, пинок в нужном направлении...
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.06.2014, 02:21
Ответы с готовыми решениями:

Подключение к STM8S-Discovery и IAR
Уже несколько недель пытаюсь разобраться с данным микроконтроллером, но пока что всё безуспешно. Может кто подсказать, как подключить к...

const data в IAR для STM8S
Господа, не могу поместить под IAR в память программ STM8S инициализированные данные, например const char vrsnDate = __DATE__; ...

IAR stm8s - просьба пнуть в нужном направлении
С STM только начинаю разбираться. Выбран stm8s103k3. Суть проблемы - в дебаггере не работает ни одно периферийное устройство (не...

8
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
26.06.2014, 07:21
Всё должно быть просто. Скорее всего не объявлен тип u32, и IAR по умолчанию делает его 16-ти битным. Проверь объявления типов.
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 3,097
26.06.2014, 10:16
Цитата Сообщение от Highlomder
Видно, что вызывается процедура шестнадцатибитного умножения.
Если оба операнда 16 бит, то и результат операции будет 16 бит...
Надо как то так
testval = (u32)MaxVal * MaxVal;
0
Hykhtomdir
26.06.2014, 12:55
Цитата Сообщение от SOVO
Всё должно быть просто. Скорее всего не объявлен тип u32, и IAR по умолчанию делает его 16-ти битным. Проверь объявления типов.
Если бы всё было так просто! :)
Файл stm8s_type.h:
Code
1
2
3
typedef unsykned long  u32;
typedef unsykned short u16;
typedef unsykned char  u8;
Я об этом забыл написать, но я пробовал переобъявлять testval и как long, и как long long... Результат тот же. :(
Hykhtomdir
26.06.2014, 13:12
Цитата Сообщение от яверт
Если оба операнда 16 бит, то и результат операции будет 16 бит...
Ммм... Стоп, что-то я упустил этот момент из виду, не наступал на него до этого ни разу, если точнее. 0хFFFF * 0xFFFF = FFFE001, что явно больше 16 бит. Результат как раз для u32. Или Вы имеете в виду, что компилятор, перемножая два шестнадцатибитных числа, результат обрезает тоже до 16 бит? Это только IAR или.... ?

Цитата Сообщение от яверт
Надо как то так
testval = (u32)MaxVal * MaxVal;
ЙЕссс, вот оно! Спасибо Вам огромное! Значит, я был на верном пути, когда писал testval=(u32)(MaxVal*MaxVal), но надо было не результат преобразовывать, а один из операндов..Спасибо огромное!!
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
26.06.2014, 18:04
Все правильно. При (u32)(MaxVal*MaxVal) перемножаются два 16 битных числа, результат тоже 16 битный и он затем приводится к 32. А при (u32)MaxVal * MaxVal первое сначала приводится к 32-х битному и затем умножается, результат будет как у числа с максимальной разрядностью, т.е. 32-х битное.
0
Hykhtomdir
26.06.2014, 18:48
Это я уже понял, спасибо. Всегда ли надо так делать, или это особенность конкретно IAR? Программируя для РС, ни разу не наступал на такие грабли...
omphosys
27.06.2014, 10:49
Цитата Сообщение от Highlomder
Это я уже понял, спасибо. Всегда ли надо так делать, или это особенность конкретно IAR? Программируя для РС, ни разу не наступал на такие грабли...
Это стандартное поведение для C/C++, тип результата операции соответствует типу ее операндов, а типы операндов могут быть неявно преобразованы вот таким образом http://texproc.ru/index.php/pr... si?stort=2 пункт 1.3.1
То что результат операции может не поместиться в тип операнда не является поводом производить неявное приведение типов.
Hykhtomdir
27.06.2014, 12:56
О, теперь понял. :)

Всем огромное спасибо!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.06.2014, 12:56
Помогаю со студенческими работами здесь

STM8s отладка кода в IAR в режиме Simulator
Уважаемые, объясните, почему при отладке кода в режиме Simulator счетчик таймера не изменяется? Какие существенные недостатки, если они...

LCD 1202 (nokia) +STM8S003f3p6 STM8S103f3p6 STM8S (IAR)
Без графики,текст только выводится. https://vk.com/izhadaptir?w=wall-73481857_493

[TI C6000] Умножение 16х16 старших бит двух чисел
Добрый день, господа. Сегодня решил разобрать еще одну простенькую задачку на ассемблере. В конечном счете пришел к такому вот...

IAR Internal Error: нужна помощь по IAR и по C++
Просьба к тем, у кого есть IAR AVR версии выше, чем 5.11B/W32 (5.11.2.5): не могли бы вы скомпилировать ниже преведенный код, и сказать,...

О симметриях в квадрате 16х16
Представьте квадрат в клеточку 16х16, где произвольно закрашены некоторые клетки. Левая верхняя клетка имеет координаты {x=0;y=0},...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru