在尝试理解过程中的内存布局并学习汇编的过程中,我已经在Pi3(ARM)上编写了一个基本的C程序,并使用GDB对其进行了反汇编,但是由于我是新手,因此我需要帮助来理解它。
本质上,我试图理解并发现在程序集中存储变量(BSS,DATA,TEXT内存段)的地方,并且还理解并遵循堆栈框架。
我只显示了主要功能-调试屏幕上还有其他部分,所以让我知道它们是否也有帮助!
我了解大部分说明在做什么,但是我想知道的是:
前3行与堆栈指针有关,这是为主要功能设置堆栈框架吗?
在x0x10414处,它使用age的值,这是将局部变量作为主要功能框架的一部分弹出到堆栈上吗?
在x0x1041c处,我假设返回值也作为帧的一部分被压入堆栈了吗?
函数末尾在哪里刷新堆栈?
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
答案 0 :(得分:3)
r11
用作帧指针。该帧指针用作本地变量在堆栈上存储位置的参考。请注意,来自调用方的原始帧指针必须保留(以便以后保存和还原)。r11
是帧指针,所有东西都是相对于它的尊重。r0
中返回。
在许多平台上,通常都使用通用寄存器。这样,堆栈就不必用于简单和简单的返回值(例如您的整数)。我想这是出于性能原因,因为寄存器比内存访问要快。r11
)被保存/推入堆栈。
然后,堆栈指针的值成为新的帧指针。
在函数结束时,堆栈指针返回到原来的位置(通过用r11
覆盖它),最后r11
本身也通过将其弹出堆栈而被恢复。