了解GDB基本C程序中的asm指令

时间:2019-04-19 07:29:00

标签: c assembly arm

在尝试理解过程中的内存布局并学习汇编的过程中,我已经在Pi3(ARM)上编写了一个基本的C程序,并使用GDB对其进行了反汇编,但是由于我是新手,因此我需要帮助来理解它。

本质上,我试图理解并发现在程序集中存储变量(BSS,DATA,TEXT内存段)的地方,并且还理解并遵循堆栈框架。

我只显示了主要功能-调试屏幕上还有其他部分,所以让我知道它们是否也有帮助!

我了解大部分说明在做什么,但是我想知道的是:

  1. 前3行与堆栈指针有关,这是为主要功能设置堆栈框架吗?

  2. 在x0x10414处,它使用age的值,这是将局部变量作为主要功能框架的一部分弹出到堆栈上吗?

  3. 在x0x1041c处,我假设返回值也作为帧的一部分被压入堆栈了吗?

  4. 函数末尾在哪里刷新堆栈?

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   

1 个答案:

答案 0 :(得分:3)

  1. 是的,你是对的。寄存器r11用作帧指针。该帧指针用作本地变量在堆栈上存储位置的参考。请注意,来自调用方的原始帧指针必须保留(以便以后保存和还原)。
  2. 差不多。它发生在一行之后,将其存储在[r11-8]的堆栈中。 请记住,r11是帧指针,所有东西都是相对于它的尊重。
  3. 它没有被压入堆栈。它只是在寄存器r0中返回。 在许多平台上,通常都使用通用寄存器。这样,堆栈就不必用于简单和简单的返回值(例如您的整数)。我想这是出于性能原因,因为寄存器比内存访问要快。
  4. 我不知道你用同花顺表示什么。这里发生的事情是该函数按照自己喜欢的方式进行设置,然后还原这些更改。堆栈的内容可能仍包含该函数使用的值。只是将指针重置为其原始位置。首先,在函数开始处,原始帧指针(r11)被保存/推入堆栈。 然后,堆栈指针的值成为新的帧指针。 在函数结束时,堆栈指针返回到原来的位置(通过用r11覆盖它),最后r11本身也通过将其弹出堆栈而被恢复。