|

楼主 |
发表于 2022-10-16 17:42:02
|
显示全部楼层
如果改为
ldrb r1,=data2
ldrb r2,=data1
则反汇编之后主要代码:
Disassembly of section .text:
30000000 <_start-0x1c>:
30000000: e59f0014 ldr r0, [pc, #20] ; 3000001c <_start>
30000004: e28f0010 add r0, pc, #16 不管链接地址与执行地址相不相同,都是位置无关定位
30000008: e59f0010 ldr r0, [pc, #16] ; 30000020 <_start+0x4>
3000000c: e5df1010 ldrb r1, [pc, #16] ; 30000024 <_start+0x8> 对应指令ldrb r1,=data2其实是一个绝对地址定位,并不是相对地址定位
30000010: e5df2010 ldrb r2, [pc, #16] ; 30000028 <_start+0xc>
30000014: e1a00000 nop ; (mov r0, r0)
30000018: e1a0f00e mov pc, lr
3000001c <_start>:
3000001c: e1a00000 nop ; (mov r0, r0)
30000020: 3000001c andcc r0, r0, ip, lsl r0
30000024: 4000000b andmi r0, r0, fp
30000028: 40000000 andmi r0, r0, r0
Disassembly of section .data: 注意:我们编译时用的是:arm-none-eabi-ld -Ttext=0x30000000 -Tdata=0x40000000 -Map ldrard.map -o ldradr.elf $^,所以数据段基址是0x40000000
40000000 <__data_start>:
40000000: 6c6c6568 cfstr64vs mvdx6, [ip], #-416 ; 0xfffffe60 data1的数据,从右到左对应的ascii码为字母:“hell”
40000004: 6f77206f svcvs 0x0077206f 从右到左对应的ascii码为字母:“o空格wo”
40000008: 61646c72 smcvs 18114 ; 0x46c2 从右到左对应的ascii码为字母:“rlda” 其实我们希望rld之后是C语言中对应的字符串结束符 \0
4000000b <data2>:
4000000b: 206d7261 rsbcs r7, sp, r1, ror #4 data2的数据,从右到左对应的ascii码为字母:“arm空格”
4000000f: 69727473 ldmdbvs r2!, {r0, r1, r4, r5, r6, sl, ip, sp, lr}^ 从右到左对应的ascii码为字母:“stri”
40000013: Address 0x40000013 is out of bounds. 因为不是ARM指令,所了本行在反汇编中看不到,但用winhex查看可以看到有字母:“ng"
|
|