Ответ: >А ассемблер является ЯВУ? Нет? Прекрасно! Тогда наберите "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 чтобы избежать термина "выравние на четный адрес".