在我尝试理解一个过程中的内存布局并学习汇编时,我已经在Pi3(ARM)上编写了一个基本的C程序,并用GDB对其进行了反汇编,但由于我是新手,我需要帮助理解它。
本质上,我试图理解并发现存储变量的汇编(BSS,DATA,TEXT内存段),并理解并遵循堆栈帧。
我只显示了主要功能 - 调试屏幕上还有其他部分,所以让我知道他们是否也会有所帮助!
我理解大部分指令在做什么,但我想知道的是:
int main () {
int age = 30;
int salary;
return 0;
}
0x10408 <main> push {r11} ; (str r11, [sp, #-4]!)
x0x1040c <main+4> add r11, sp, #0
x0x10410 <main+8> sub sp, sp, #12
x0x10414 <main+12> mov r3, #30
x0x10418 <main+16> str r3, [r11, #-8]
x0x1041c <main+20> mov r3, #0
x0x10420 <main+24> mov r0, r3
x0x10424 <main+28> add sp, r11, #0
x0x10428 <main+32> pop {r11} ; (ldr r11, [sp], #4)
x0x1042c <main+36> bx lr
r11
用作帧指针。此帧指针用作对局部变量存储在堆栈中的引用。请注意,必须保留来自调用者的原始帧指针(以便稍后保存和恢复)。r11
是帧指针,一切都是相对的。r0
中返回。在许多平台上使用通用寄存器是很常见的。然后堆栈不需要用于简单和普通的返回值(如整数)。我想这是出于性能原因,因为寄存器比内存访问更快。r11
)被保存/推入堆栈。然后堆栈指针的值成为新的帧指针。在函数结束时,堆栈指针返回到它所在的位置(通过用r11
覆盖它),最后r11
本身也通过从堆栈中弹出来恢复。