【问题标题】:Understanding asm instructions in basic C program in GDB理解 GDB 中基本 C 程序中的 asm 指令
【发布时间】:2019-04-19 07:28:59
【问题描述】:

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

基本上,我试图了解和发现程序集中存储变量的位置(BSS、DATA、TEXT 内存段),并了解并遵循堆栈帧。

我只显示了主要功能 - 调试屏幕上还有其他部分,所以如果他们也有帮助,请告诉我!

我了解各个指令的大部分内容,但我想知道的是:

  1. 前3行与栈指针有关,这是为main函数设置栈帧吗?

  2. 在 x0x10414 它使用年龄的值,这是局部变量作为主函数框架的一部分弹出到堆栈的地方吗?

  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   

【问题讨论】:

  • 堆栈没有“刷新”,这是一个相当普遍的误解。堆栈指针恢复到调用函数之前的值,函数在堆栈上创建的值被视为垃圾,可能/将被进一步的代码执行覆盖。
  • 这里使用了帧指针,因此堆栈指针仅用于保存帧指针。调用者假设帧指针将保持原样,因此我们必须保留并恢复它。我们还必须保留堆栈指针并将其恢复为其原始值,但堆栈本身我们不需要。

标签: c assembly arm


【解决方案1】:
  1. 是的,你是对的。寄存器r11 用作帧指针。此帧指针用作对局部变量在堆栈中存储位置的引用。请注意,必须保留来自调用者的原始帧指针(以便稍后保存和恢复)。
  2. 几乎。它在一行之后发生,它将它存储在堆栈中的 [r11 - 8] 处。 请记住,r11 是帧指针,一切都是相对的。
  3. 它没有被压入堆栈。它只是在寄存器r0 中返回。 在许多平台上使用通用寄存器很常见。然后堆栈不需要用于简单和普通的返回值(比如你的整数)。我想这是出于性能原因,因为寄存器比内存访问快。
  4. 我不知道你说的脸红是什么意思。这里发生的是函数按照它喜欢的方式进行设置,然后恢复这些更改。堆栈的内容可能仍包含函数使用的值。只是指针被重置到其原始位置。首先在函数的开头,原始帧指针 (r11) 被保存/推送到堆栈上。 然后堆栈指针的值成为新的帧指针。 在函数结束时,堆栈指针返回到原来的位置(通过用r11 覆盖它),最后r11 本身也通过从堆栈中弹出来恢复。

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 2017-11-16
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2011-02-10
    • 2012-05-09
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多