链接两个.S文件时,avr-gcc不服从.org指令

时间:2017-06-26 00:51:48

标签: assembly avr-gcc

好的,这是一个文件tinyrom_2313.S

.text

.org 0
.global init

init:
    rjmp main

.org 0x0020
.global main

main:
    cli

    // Disable watchdog timer

    wdr
    ldi r16, 0x00
    out _SFR_IO_ADDR(MCUSR), r16
    in r17, _SFR_IO_ADDR(WDTCSR)
    ori r17, _BV(WDCE) | _BV(WDE)
    out _SFR_IO_ADDR(WDTCSR), r17
    out _SFR_IO_ADDR(WDTCSR), r16

    // Disable input pullups

    ldi r16, _BV(PUD)
    out _SFR_IO_ADDR(MCUCR), r16

    // Pin directions are all
    // inputs on reset.

    // Set pin directions:
    //   PA2 - PA0 are inputs
    //   PB7 - PB0 are inputs
    //   PD6 - PD0 are outputs

    ldi r16, 0xFF
    out _SFR_IO_ADDR(DDRD), r16

    // We store the data table at 0x0100.

    ldi ZH, 0x01
loop:
    in ZL, _SFR_IO_ADDR(PINB)
    lpm r0, Z
    out _SFR_IO_ADDR(PORTD), r0
    rjmp loop

这是第二个文件single_step_rom.S

.text
.org 0x0100
//          / N     H    C
//          H E     O S  U
//          O X     LRT  R
//          L T     DUE  R
//          D___    ANP ___
.byte 0b00000000 // 000 000
.byte 0b00001010 // 000 001
.byte 0b00000011 // 000 010
.byte 0b00000011 // 000 011
.byte 0b00001101 // 000 100
.byte 0b00001110 // 000 101
.byte 0b00001110 // 000 110
.byte 0b00000011 // 000 111
.byte 0b00000001 // 001 000
.byte 0b00000001 // 001 001
.byte 0b00000011 // 001 010
.byte 0b00000011 // 001 011
.byte 0b00001101 // 001 100
.byte 0b00001110 // 001 101
.byte 0b00001111 // 001 110
.byte 0b00001111 // 001 111
.byte 0b00000100 // 010 000
.byte 0b00001010 // 010 001
.byte 0b00000011 // 010 010
.byte 0b00000011 // 010 011
.byte 0b00000100 // 010 100
.byte 0b00001110 // 010 101
.byte 0b00001110 // 010 110
.byte 0b00000011 // 010 111
.byte 0b00000001 // 011 000
.byte 0b00000001 // 011 001
.byte 0b00000011 // 011 010
.byte 0b00000011 // 011 011
.byte 0b00000100 // 011 100
.byte 0b00001110 // 011 101
.byte 0b00001111 // 011 110
.byte 0b00001111 // 011 111
.byte 0b00000000 // 100 000
.byte 0b00001010 // 100 001
.byte 0b00001010 // 100 010
.byte 0b00000000 // 100 011
.byte 0b00001101 // 100 100
.byte 0b00001101 // 100 101
.byte 0b00001110 // 100 110
.byte 0b00000011 // 100 111
.byte 0b00000001 // 101 000
.byte 0b00000001 // 101 001
.byte 0b00001010 // 101 010
.byte 0b00000000 // 101 011
.byte 0b00001101 // 101 100
.byte 0b00001101 // 101 101
.byte 0b00001111 // 101 110
.byte 0b00001111 // 101 111
.byte 0b00000100 // 110 000
.byte 0b00001010 // 110 001
.byte 0b00001010 // 110 010
.byte 0b00000000 // 110 011
.byte 0b00000100 // 110 100
.byte 0b00001101 // 110 101
.byte 0b00001110 // 110 110
.byte 0b00000011 // 110 111
.byte 0b00000001 // 111 000
.byte 0b00000001 // 111 001
.byte 0b00001010 // 111 010
.byte 0b00000000 // 111 011
.byte 0b00000100 // 111 100
.byte 0b00001101 // 111 101
.byte 0b00001111 // 111 110
.byte 0b00001111 // 111 111

现在,我编译:

avr-gcc -nostartfiles -mmcu=attiny2313 -Wl,-Map,map.txt -o single_step_rom.elf single_step_rom.S tinyrom_2313.S

我发现它将single_step_rom正确放在0x0100,但随后tinyrom_2313卡在0x0140。换句话说,看起来avr-gcc完全忽略了.org中的tinyrom_2313.S指令。

交换.S文件的顺序会产生相反的问题:tinyrom_2313正好位于0x0000,但single_step_rom位于0x0142,就像avr- gcc使用.org 0x0100作为添加到上一个文件停止的位置。

.org的{​​{3}}是:

  

.org new-lc,fill :推进当前的位置计数器   部分到 new-lc new-lc 是绝对表达式或   与当前小节具有相同部分的表达式。

显然,我并不理解"提前到"是什么意思。也许他们的意思是"前进"。在任何情况下,如何让avr-gcc将代码放在指定的位置?我希望找到一个比定义脚本文件更简单的解决方案,并且必须通过-Wl,-T传递它。

我接受了一个"是的,如果没有脚本文件,你就无法接受#34;答案,只要有人可以向我解释"提前到"在.org指令的描述中。

0 个答案:

没有答案