2009-11-19 1 views
2

У меня есть двоичный файл, который я разобрал, используя avr-objcopy. Таблица векторов прерываний выглядит так:Как я могу прыгать относительно ПК с помощью ассемблера gnu для AVR?

 
00000000 : 
    ; VECTOR TABLE 
    0: 13 c0   rjmp .+38  ; 0x28, RESET 
    2: b8 c1   rjmp .+880  ; 0x374, INT0 
    4: fd cf   rjmp .-6   ; 0x0 
    6: fc cf   rjmp .-8   ; 0x0 
    8: fb cf   rjmp .-10  ; 0x0 
    a: fa cf   rjmp .-12  ; 0x0 
    c: f9 cf   rjmp .-14  ; 0x0 
    e: f8 cf   rjmp .-16  ; 0x0 
    10: f7 cf   rjmp .-18  ; 0x0 
    12: c7 c1   rjmp .+910  ; 0x3a2, TIMER1 OVF 
    14: f5 cf   rjmp .-22  ; 0x0 
    16: f4 cf   rjmp .-24  ; 0x0 
    18: f3 cf   rjmp .-26  ; 0x0 
    1a: f2 cf   rjmp .-28  ; 0x0 
    1c: 2b c2   rjmp .+1110  ; 0x474, ADC conversion complete 
    1e: f0 cf   rjmp .-32  ; 0x0 
    20: ef cf   rjmp .-34  ; 0x0 
    22: ee cf   rjmp .-36  ; 0x0 
    24: ed cf   rjmp .-38  ; 0x0 
    26: 00 00   nop 
    ; START 
    28: f8 94   cli 
(snip)

Я хочу собрать этот файл с несколькими изменениями. Я переформатировал его, удалив первые 2 столбца, чтобы он был обычным файлом сборки. то есть:

 
.org 0 
    rjmp .+38   ; 0x28, RESET 
    rjmp .+880   ; 0x374, INT0 
(snip)

Однако, когда я бегу

$ avr-as -mmcu=atmega8 test.asm

, а затем разобрать полученный файл. (С использованием objcopy -S a.out) Выход выглядит следующим образом:

00000000 : 
    0: 00 c0   rjmp .+0    ; 0x2 
    2: 00 c0   rjmp .+0    ; 0x4 
    4: 00 c0   rjmp .+0    ; 0x6 
    6: 00 c0   rjmp .+0    ; 0x8 
    8: 00 c0   rjmp .+0    ; 0xa 
    a: 00 c0   rjmp .+0    ; 0xc 
    c: 00 c0   rjmp .+0    ; 0xe 
    e: 00 c0   rjmp .+0    ; 0x10 
    10: 00 c0   rjmp .+0    ; 0x12 
    12: 00 c0   rjmp .+0    ; 0x14 
    14: 00 c0   rjmp .+0    ; 0x16 
    16: 00 c0   rjmp .+0    ; 0x18 
    18: 00 c0   rjmp .+0    ; 0x1a 
    1a: 00 c0   rjmp .+0    ; 0x1c 
    1c: 00 c0   rjmp .+0    ; 0x1e 
    1e: 00 c0   rjmp .+0    ; 0x20 
    20: 00 c0   rjmp .+0    ; 0x22 
    22: 00 c0   rjmp .+0    ; 0x24 
    24: 00 c0   rjmp .+0    ; 0x26 
    26: 00 00   nop 
    28: f8 94   cli 
(snip) 

Так как я могу получить АРНА-как уважать PC-относительные прыжки?

ответ

6

Я нашел ответ!

Я собирался, но не связывался. Таким образом, ассемблер заполнял все относительные прыжки/вызовы/ветви с. + 0.

Чтобы исправить это мне нужно, чтобы создать пользовательский компоновщика сценарий я назвал linker.x, который содержит следующее:

 
SECTIONS 
{ 
    . = 0x0; 
    .text : { *(.text) } 
} 

Это говорит компоновщик начать секции .text по адресу 0.

Тогда я мог бы связать код с помощью:

$ avr-ld -mavr4 -Tlinker.x a.out -o output.o 

После связывания с использованием указанных выше команд все из +-были заполнены с их соответствующими значениями.!

Причина этого заключается в том, что до стадии компоновки, поскольку/gcc не знают, что еще собирается включить в двоичный файл. Это компоновщик, который принимает все отдельные объектные файлы и объединяет их в один. Поэтому, если этап компоновщика никогда не запускается, нет возможности заполнить относительные прыжки с помощью абсолютных прыжков.

Ассемблер AVR выполняет сборку и соединение. Но ассемблер gnu более общий, поэтому вам нужно связать отдельно.

0

Я предполагаю, что rjmp PC+2 не работает в avr-as? Вот как я сделал это в AVR Studio ...

+0

Спасибо за подсказку. Я попробовал, но это не сработает. :( Фактически, единственный раз, когда я смог разобрать его на что-то другое, кроме «rjmp. + 0», я использую литерал. Но тогда он уже не относительный, а абсолютный. – kroylar

Смежные вопросы