ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
61462 Топик полностью
Сергей Борщ (26.06.2006 23:52, просмотров: 1) ответил Павел В. на Тут вот в чем дело
Ответ: >А ассемблер является ЯВУ? Нет? Прекрасно! Тогда наберите "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 чтобы избежать термина "выравние на четный адрес".