Как задать константы через .EQU?

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 57
Зарегистрирован: Сб фев 28, 2009 19:25:24
Откуда: MSK

Сообщение Vlad399 »

Уважаемые Гуру! Плз подскажите начинающему в чем ошибка:
пытаюсь в AVR Studio 4 задать константы через директиву .EQU. Результат виден на картинке - max вместо 0х64 равен 0xFF, а maxD2 - вместо 0х32 - нулю! Так же неправильные значения эти константы имеют и в процессе эмуляции. Подозреваю, что и зашьются в МК они такими же. Ни через Help, ни методом "тыка" решения проблемы пока не нашел.
Кто-нибудь с подобным сталкивался? Как на ассемблере сделать константу "max" = десятичной сотне? Что я неправильно делаю?
Спасибо
P.S: Извиняюсь, файл с первого раза не прицепился. Теперь, надеюсь, проблема виднее.
Вложения
pic2.JPG
(31.13 КБ) 569 скачиваний
Последний раз редактировалось Vlad399 Чт дек 27, 2012 06:26:39, всего редактировалось 1 раз.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....

Сообщение Meteor »

.EQU data = 0x23; например
А еще, в той же студии был волшебный хелп. Если в нем задать equ, то на экране появится примерчик!
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Vlad399 писал(а):Кто-нибудь с подобным сталкивался? Как на ассемблере сделать константу "max" = десятичной сотне? Что я неправильно делаю?
Спасибо
В ассемблере у всех дробных констант дробная часть теряется из-за того, что в регистры можно загрузить только целые числа. Если нужна константа с сотыми дробями можно её просто умножить на сто и работать с ней как с целым числом, но иметь ввиду, что точку нужно ставить перед двумя младшими разрядами при выводе результата.
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Vlad399 писал(а):Результат виден на картинке - max вместо 0х64 равен 0xFF, а maxD2 - вместо 0х32 - нулю!
Определение через equ не производит никаких действий, так сказать. Это константа для ассемблера и чтобы её увидеть реально её надо где-то использовать. Например ldi r0, max будет преобразовано ассемблером в команду, которая загрузит 0x64 в регистр r0.
А то что у вас на картинке показано, так это отладчик "предположил", что эти константы это смещение в памяти. Значение 0x32 трактуется как адрес и попадает в область регистров вводв/вывода (I/O Register). И соответственно значение содержащееся в этой ячейке памяти (регистре в/в) 0x00. На второй картинке адрес попадает в область SRAM.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 57
Зарегистрирован: Сб фев 28, 2009 19:25:24
Откуда: MSK

Сообщение Vlad399 »

Kavka, спасибо, но я это уже пробовал. На верхней картинке значение maxD2 до симуляции, на нижней - при симуляции после первого использования. Но, похоже, Студия действительно "путается в показаниях" - если в EQU последовательно задавать 7 значений maxD2 от 94 до 100, то показываемый адрес размещения константы меняется от 0х5Е до 0х64 ( 0х5Е=94 дес. 0х64=100 дес.). При этом значение maxD2 будет 2 раза ноль, 4 раза - 255, и последнее - 49 !?. Ну ладно, я надеялся, что это известная проблема и мне сразу подскажут её решение. Ну, нет, так нет. Кстати, сегодня переустановил Студию - безрезультатно. Буду копать дальше.
Вложения
pic3.JPG
(12.9 КБ) 599 скачиваний
Реклама
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

По мне, Вы нашли проблему где ее нет. Ниже результат работы студии.
СпойлерИзображение
EQU.GIF
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 57
Зарегистрирован: Сб фев 28, 2009 19:25:24
Откуда: MSK

Сообщение Vlad399 »

Да, пожалуй, вы правы. Всем спасибо за участие. Тема закрыта.
С наступающим Новым Годом всех котов-форумчан.
Владимир
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Vlad399 писал(а):если в EQU последовательно задавать 7 значений maxD2 от 94 до 100, то показываемый адрес размещения константы меняется от 0х5Е до 0х64 ( 0х5Е=94 дес. 0х64=100 дес.).
Это не адрес размещения константы! Это просто константа для транслятора/ассемблера. По equ не резервируется никакая память в МК (ни флэш, ни EEPROM, ни RAM), и, тем более, ничего туда не заносится. Если вам надо, чтобы константа хранилась в памяти, то используйте .db и т.п. (и метку, чтобы сослаться на соответствующую ячейку памяти).
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Ответить

Вернуться в «AVR»