我有一个C程序,保存在delay.c
文件中:
void delay(int num)
{
volatile int i;
for(i=0; i<num; i++);
}
然后我在 ARM 模拟器(更具体地说是 armel)上使用 gcc 4.6.3 编译该程序,并使用以下命令 gcc -g -O1 -o delay.o delay.c
。在 delay.o
中的汇编代码如下:
00000000 <delay>:
0: e24dd008 sub sp, sp, #8
4: e3a03000 mov r3, #0
8: e58d3004 str r3, [sp, #4]
c: e59d3004 ldr r3, [sp, #4]
10: e1500003 cmp r0, r3
14: da000005 ble 30 <delay+0x30>
18: e59d3004 ldr r3, [sp, #4]
1c: e2833001 add r3, r3, #1
20: e58d3004 str r3, [sp, #4]
24: e59d3004 ldr r3, [sp, #4]
28: e1530000 cmp r3, r0
2c: bafffff9 blt 18 <delay+0x18>
30: e28dd008 add sp, sp, #8
34: e12fff1e bx lr
我想通过调试信息来确定变量 i
在函数 delay
的堆栈上的位置。以下是在 .debug_info
部分中关于 delay
和 i
的信息:
<1><25>: Abbrev Number: 2 (DW_TAG_subprogram)
<26> DW_AT_external : 1
<27> DW_AT_name : (indirect string, offset: 0x19): delay
<2b> DW_AT_decl_file : 1
<2c> DW_AT_decl_line : 1
<2d> DW_AT_prototyped : 1
<2e> DW_AT_low_pc : 0x0
<32> DW_AT_high_pc : 0x38
<36> DW_AT_frame_base : 0x0 (location list)
<3a> DW_AT_sibling : <0x59>
...
<2><4b>: Abbrev Number: 4 (DW_TAG_variable)
<4c> DW_AT_name : i
<4e> DW_AT_decl_file : 1
<4f> DW_AT_decl_line : 3
<50> DW_AT_type : <0x60>
<54> DW_AT_location : 0x20 (location list)
这表明 i
的位置在位置列表中。所以我输出了位置列表:
Offset Begin End Expression
00000000 00000000 00000004 (DW_OP_breg13 (r13): 0)
00000000 00000004 00000038 (DW_OP_breg13 (r13): 8)
00000000 <End of list>
00000020 0000000c 00000020 (DW_OP_fbreg: -12)
00000020 00000024 00000028 (DW_OP_reg3 (r3))
00000020 00000028 00000038 (DW_OP_fbreg: -12)
00000020 <End of list>
从地址4到38,delay
的帧基应为r13 + 8
。所以从地址c到20和从地址28到38,i
的位置是r13 + 8 - 12 = r13 - 4
。
然而,从汇编代码中可以得知,并没有r13 - 4
这个位置,而i
的位置显然是在r13 + 4
。
我是否忽略了某些计算步骤?有人能解释一下调试信息和汇编代码中i
位置的差异吗?
先谢谢!
i
在sp(0) - 12
,但汇编显示它在sp(0) - 4
。 - Robert Harrisi
位于SP中,并带有+4的偏移量([...显然在位置'r13 + 4'...]),但是Dwarf报告说i
是SP的偏移量为-4([... 'i'的位置为'r13 + 8-12 = r13-4' ...])。在我看来,矮人的分析是有道理的(0 + 8-12,偏移是-4),但汇编的分析则不是。我很可能是错的,但我找不到OP说Dwarf报告SP - 12的地方。 - Josei
的位置表示为相对于“帧基址”的偏移量。例如,在delay+0x18处,它比帧基址的当前值低12个字节。然而,对于这个PC,帧基址比r13的当前值高8个字节;实际上,对于OP的情况,帧基址是一个固定值,等于进入函数时的堆栈指针。因此,在delay+0x18处,DWARF给出了i
的位置,即相对于r13原始值低12个字节,即比r13的当前值低4个字节。汇编显示,i
比r13的当前值高4个字节。 - Robert Harrisi
的位置是(在delay+0x18处r13的值)+8-12=sp(0)-12=sp-4。 - Robert Harris