好的,这是一个文件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
指令的描述中。