我正在尝试编译一个最小的ARM cortex M3示例,并且我发现在我的代码的符号表和字节代码似乎跳转到的地址之间我不明白的差异。< / p>
Startup.s (我的最小汇编代码)
.cpu cortex-m3
.thumb
.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.thumb_func
reset:
mov r0, #6
mov r1, #7
test.ld
MEMORY
{
rom : ORIGIN = 0x00000000, LENGTH = 0x1000
}
SECTIONS
{
.text : { *(.text*) } > rom
.rodata : { *(.rodata*) } > rom
}
如果我拿这两个文件然后编译得到elf
和bin
文件:
arm-none-eabi-as -mcpu=cortex-m3 startup.s -o startup.o
arm-none-eabi-ld -o test.elf -T test.ld startup.o
arm-none-eabi-objcopy test.elf test.bin -O binary
然后,用
查看我的符号表$ arm-none-eabi-nm test.elf
00000008 t reset
00000000 t stacktop
00000000 T _start
这是有道理的,因为我希望reset
位于地址0x8
,因为它是堆栈指针stacktop
之前的唯一内容。
然而,看一下二进制的hexdump:
$ hexdump -C test.bin
00000000 00 10 00 20 09 00 00 00 06 20 07 21 |... ..... .!|
0000000c
我不明白为什么第5个字节是0x09
。不应该是0x08
吗?实际上,reset
(mov r0 #6
)的第一个命令出现在0x08
,那么为什么编译器会告诉CPU跳转到0x09
?显然,有一些基本的东西,我不理解!
根据要求,objdump
的输出:
$ arm-none-eabi-objdump -d test.elf
test.elf: file format elf32-littlearm
Disassembly of section .text:
00000000 <_start>:
0: 20001000 .word 0x20001000
4: 00000009 .word 0x00000009
00000008 <reset>:
8: 2006 movs r0, #6
a: 2107 movs r1, #7