调试C程序(int类型声明)(Debugging C program (int declaratio

2019-10-29 17:12发布

我还在学习汇编和C,但现在,我想了解编译器是如何工作的。 我这里有一个简单的代码:

int sub()
{
  return 0xBEEF;
}
main()
{
  int a=10;
  sub();
}

现在我知道了CPU已经是如何工作的,跳进框架和子程序等什么我不明白是程序“商店”的局部变量。 在这种情况下,在主要的框架?

下面是调试器主框架:

   0x080483f6 <+0>:     push   %ebp
   0x080483f7 <+1>:     mov    %esp,%ebp
   0x080483f9 <+3>:     sub    $0x10,%esp
=> 0x080483fc <+6>:     movl   $0xa,-0x4(%ebp)
   0x08048403 <+13>:    call   0x80483ec <sub>
   0x08048408 <+18>:    leave  
   0x08048409 <+19>:    ret 

我在 “INT A = 10;” 一个破发点,这就是为什么偏移6有一个箭头。 因此,主要的功能开始别人推EBP唧唧歪歪等,然后我不明白这一点:

  0x080483f9 <+3>: sub $0x10,%esp => 0x080483fc <+6>: movl $0xa,-0x4(%ebp) 

为什么在做ESP子? 为“a”的堆堆栈指针的偏移-0x4在变量?

刚刚在这里明确的想法:d

提前致谢!

Answer 1:

   0x080483f9 <+3>:     sub    $0x10,%esp

你会发现在每一个功能,这样的指令。 它的目的是创建适当大小的堆栈帧,这样的功能可以存储它的当地人(记住,栈落后的增长!)。
堆栈帧是在这种情况下有点大了。 这是因为gcc(从2.96开始)焊盘帧堆到16个字节边界默认以考虑用于需要包装的128位向量被对准为16个字节SSEX指令。 (参考这里 )。

=> 0x080483fc <+6>:     movl   $0xa,-0x4(%ebp)

这条线被初始化为正确的值(是0xA = 10D)。 当地人总是具有偏移相对于EBP,这标志着堆栈帧的开始(其因此被包括EBP之间和ESP)称为。



文章来源: Debugging C program (int declaration)