Ответ: >А ассемблер является ЯВУ? Нет? Прекрасно! Тогда наберите "CALL 3" в ИАРовском ассемблере?
Вообще-то в языке ассемблера во избежание подобных недоразумений существуют метки. И в этом смысле он язык более высокого уровня чем машинные коды. Вот в кодах - пожалуйста, 940E 0003 совершенно однозначно.
>А зачем тогда патч?
Видимо чтобы подобная команда в исходнике не приводила к исключению в процессе компиляции, а вызывала лишь сообщение об ошибке.
> Я не стал лезть в описательство, а просто попросил - "народ, у кого есть иар 4.20А, наберите CALL 3?".
IAR 4.10B
CALL 4 - компилится в 940E 0002
CALL 3 - Error[411]: Address must be even.
Что я делаю неправильно?
>Т.е. проблема _САМОГО_ компилятора или осталась, или была исправлена? Вот и все!
Если вы про Error[411] - то это не проблема компилятора, а ошибка в вашей программе.
>Меня гораздо больше достает то, что, прицепив к Меге128 внешнюю память, я не могу организовать ее в виде единого массива или структуры
Тут согласен, но это тема для отдельной ветки. Указатели и адресная арифметика тоже не помогают (просто не приходилось с такими объемами цельных данных работать)?
>Я думаю, что эмбеддерщик все-таки должен знать камень, для которого пишет, периодически просматривать ассемблерные листинги
А в листингах абсолютных адресов нет, только имена меток. А просматривать конечно нужно, но с пониманием. И "Матчасть учить", как вы нам советовали:
Labels
Both the Atmel AVR Assembler and the AVR IAR Assembler treat all labels, except labels in code segments, as byte addresses. Code that works with labels in data segments does not have to be altered. Notice however that the Atmel AVR Assembler treats labels
in code segments as word addresses whereas the AVR IAR Assembler treats them as byte addresses. It is therefore important to remember to alter the code to reflect this; see the example below.
Atmel AVR Assembler example:
.CSEG
start:
LDI R30,low(2*code_pointer)
LDI R31,high(2*code_pointer)
LPM
MOV R16,R0
ADIW R30,1
LPM
MOV R31,R0
MOV R30,R16
ICALL
RJMP start
func:
LDI R16,0
RET
code_pointer:
DW func
AVR IAR Assembler example:
MODULE Example
RSEG SEGMENT_NAME:CODE
start:
LDI R30,low(code_pointer)
LDI R31,high(code_pointer)
LPM
MOV R16,R0
ADIW R30,1
LPM
MOV R31,R0
MOV R30,R16
ICALL
RJMP start
RSEG SEGMENT_NAME:CODE
func:
LDI R16,0
RET
RSEG SEGMENT_NAME:CODE
code_pointer:
DW func/2
Теперь вам очевидно что "адресация в словах" это всего-лишь костыли, непонятно почему придуманые писателями документации на AVR чтобы избежать термина "выравние на четный адрес".