Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Из одного ASM в другой
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Oleg_IT
Есть ASM текст, скорей всего на AVR Studio (не написано ни чего об этом). Нужно перевести в IAR-овский.
Почти всё понятно, но есть но…

Исходный текст
.def temp0 =R20 ;temporary register
………
push temp0
………
in temp0,UDR ;put to temp0 received data from UART
………

Переведённый. Пользовался документацией от IAR (Версия 4.11)
#define temp0 R20 ;temporary register
push temp0 Ошибки нет
………
in temp0,UDR ;put to temp0 received data from UART Ошибка Error[43]: Illegal effective address …\Test\Test.asm 253

Если ставлю вместо temp0 R20, т.е.
in R20,UDR ;put to temp0 received data from UART
всё нормально.
Похоже в некоторых командах дефайн компилятор не видит.

Этих tempX очень много и перебивать все не хочется.
Что делать?
IV_K
после дефайна не ставьте комментарии или ставьте сишный коммент "//", иар в асме их ест, а переводите ручками или пишите конвертор, я как-то перекидывал проект, но небольшой, а конверторов не видел...
Oleg_IT
Спасибо, сишные комментарии помогли.
Oleg_IT
Прошу прощения ещё две ошибки не понятные мне

Определение

RAMEND128 EQU 96+127
MAXUSBBYTES EQU 14
…………………….
OutputBufferBegin EQU RAMEND128-MAXUSBBYTES-2 //;compare of transmitting buffer
AckBufferBegin EQU OutputBufferBegin-3 //;compare of transmitting buffer Ack

При использовании
sts ACKBufferBegin+0,temp0 ;SOP byte

Дает ошибку
Error[50]: Undefined symbol:'ACKBufferBegin' …\Test\ Test.asm 703
Почему?

Вторая ошибка
ldi temp0,E2END+1 ;number my byte answers to temp0 - entire length of EEPROM

Определение из iom32.h
#define E2END 0x03FF

Ошибка
Error[403]: Number out of range. Valid range is -128 (-0x80) to 255 (0xFF). …\Test\ Test.asm 1335

А тут что не так?
defunct
Цитата
Ошибка
Error[403]: Number out of range. Valid range is -128 (-0x80) to 255 (0xFF). …\Test\ Test.asm 1335


В 8-ми битный регистр нельзя запихать число больше 255.
ldi temp0, high( E2END + 1)


Насчет первой ошибке попробуйте вручную цифрой прописать чему равен AckBufferBegin.
Если не поможет - разместить переменные в .dseg, вместо использования адресных констант.
Oleg_IT
Цитата(defunct @ Jan 31 2006, 17:29) *
Насчет первой ошибке попробуйте вручную цифрой прописать чему равен AckBufferBegin.
Если не поможет - разместить переменные в .dseg, вместо использования адресных констант.


Увы. Прописал
AckBufferBegin EQU 204 //; OutputBufferBegin-3 //;compare of transmitting buffer Ack
не помогло.

По первой ошибке
ldi temp0, high( E2END + 1)
Почему high, а не low? И почему в AVR Studio (уточнил, оттуда этот код) всё хорошо? high сработало.
defunct
Цитата(Oleg_IT @ Jan 31 2006, 16:43) *
Увы. Прописал
AckBufferBegin EQU 204 //; OutputBufferBegin-3 //;compare of transmitting buffer Ack
не помогло.


А так:
.equ ACKBufferBegin 204 // ...


Цитата
По первой ошибке
ldi temp0, high( E2END + 1)
Почему high, а не low? И почему в AVR Studio (уточнил, оттуда этот код) всё хорошо? high сработало.


Потому что, low от E2END + 1 всегда = 0. $3FF + 1= $400. Я так понял там проверялась граница EEPROM'а, значит, нужно проверять значущую часть.
А AVRStudio такой код мог компилироваться только для контроллера у которого длина EEPROM меньше 256.. Возможно, что тупое использование high() не поможет..
Oleg_IT
Цитата(defunct @ Jan 31 2006, 17:54) *
А так:
.equ ACKBufferBegin 204 // ...


Нет, так не пройдет, эту запись IAR не поймёт.
Из документа
AVR IAR Assembler
Reference Guide

Atmel AVR Assembler format
.EQU label = expression

AVR IAR Assembler format Comments
label EQU expression

Самое странное, что в других местах, с другими label всё нормально. Но разницы в использовании я не вижу.
defunct
Цитата(Oleg_IT @ Feb 1 2006, 08:22) *
Самое странное, что в других местах, с другими label всё нормально. Но разницы в использовании я не вижу.


Раз такое поведение только с именем одной константы, значит можно предположить, что что-то не так именно с ее именем. Либо в объявлении, либо при использовании. Проверьте что
A ) все символы константы заданы в английской раскладке.
B ) регистр символов в объявлении константы был таким же как при ее использовании. (AVR-IAR-Asm чувствителен к регистру т.е. Aa <> AA)

Если не поможет, тогда пробуйте:
1) переписать имя константы,
2) сократить длину имени (ACKbuffer или AckBuf)..

В качестве крайней меры имя константы можно заменить цифрой (адресом) в теле программы, что не есть хорошо.

PS: переменные лучше бы определять как переменные через db, dw и т.п., использование адресных констант imho дурной тон, который влечет к разного рода ошибкам.
Oleg_IT
Я слепой!!!:)
И правда регистр символов изменён. В эту сторону даже и не думал смотреть.
Наверное, для чистого ASM-а это не важно, а для сишного - смотри в оба.
Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.