最近在看c_backtrace,我把里面计算pc offset的代码抠出来在arm上实验
asm_test:
stmfd sp!, {R0-R9,lr}
1: stmfd sp!, {pc}
ldr r0, [sp], #4
adr r1, 1b
sub r2, r0, r1
b printr;
ldmfd sp!, {R0-R9,pc}
void printr(unsigned int x0,unsigned int x1,unsigned int x2)
{
printf("R0 0x%X R1 0x%X R2 0x%X\n",x0,x1,x2);
}
但是打印的结果R0 0x84E4 R1 0x84D8 R2 0xC,为什么偏移量是12不是8呢
objectdump之后的结果
000084d4 <asm_test>:
84d4: e92d43ff push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, lr}
84d8: e92d8000 push {pc}
84dc: e49d0004 pop {r0} ; (ldr r0, [sp], #4)
84e0: e24f1010 sub r1, pc, #16 ; 0x10
84e4: e0402001 sub r2, r0, r1
84e8: eaffffc9 b 8414 <printr>
84ec: e8bd83ff pop {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, pc}
根据objdump来看 pc在压栈的时候世纪已经指向+12的偏移了 |