与符号表相比,ARM函数调用偏移1

时间:2017-08-22 06:47:24

标签: assembly arm

我正在尝试编译一个最小的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
}

如果我拿这两个文件然后编译得到elfbin文件:

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吗?实际上,resetmov 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

0 个答案:

没有答案