реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Из одного ASM в другой
Oleg_IT
сообщение Jan 31 2006, 08:38
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Есть 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 очень много и перебивать все не хочется.
Что делать?
Go to the top of the page
 
+Quote Post
IV_K
сообщение Jan 31 2006, 09:38
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 17-06-05
Пользователь №: 6 087



после дефайна не ставьте комментарии или ставьте сишный коммент "//", иар в асме их ест, а переводите ручками или пишите конвертор, я как-то перекидывал проект, но небольшой, а конверторов не видел...
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jan 31 2006, 10:52
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Спасибо, сишные комментарии помогли.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jan 31 2006, 13:23
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Прошу прощения ещё две ошибки не понятные мне

Определение

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

А тут что не так?
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 31 2006, 14:29
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
Ошибка
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, вместо использования адресных констант.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Jan 31 2006, 14:43
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(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 сработало.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 31 2006, 14:54
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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() не поможет..

Сообщение отредактировал defunct - Jan 31 2006, 15:01
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Feb 1 2006, 06:22
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(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 всё нормально. Но разницы в использовании я не вижу.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 1 2006, 07:02
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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


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

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

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

PS: переменные лучше бы определять как переменные через db, dw и т.п., использование адресных констант imho дурной тон, который влечет к разного рода ошибкам.

Сообщение отредактировал defunct - Feb 1 2006, 07:13
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Feb 1 2006, 07:27
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Я слепой!!!:)
И правда регистр символов изменён. В эту сторону даже и не думал смотреть.
Наверное, для чистого ASM-а это не важно, а для сишного - смотри в оба.
Спасибо!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th July 2025 - 07:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01446 секунд с 7
ELECTRONIX ©2004-2016