at& t汇编代码ebp寄存器未定义的行为

时间:2014-05-02 05:10:51

标签: assembly gdb att

自从大约一个月前开始学习组装以来,我被告知%ebp寄存器从%ebp-4开始并且向下(例如-8 / -12)是局部变量。现在我正在深入集会,虽然我注意到对%ebp-10和其他非倍数4的调用。我想知道这是如何工作的以及它的意义是什么。

0x08048e2b <+6>:    lea    -0x10(%ebp),%eax

0x08048e2b <+6>:    lea    -0x10(%ebp),%eax

以上是我现在正在使用gdb拆解程序的两个例子。如果正如我推断的那样,这个数据只是通过变量或假设数据的一半,那么这个数据是如何正确使用的。 %ebp-8或%ebp-12不是正确的版本而不是%ebp-10吗?

我觉得这个问题可能有一个直观的答案,但我只是没有看到它,也无法在网上找到任何关于它的资源。

1 个答案:

答案 0 :(得分:2)

0x10 是四的倍数。它是一个十六进制数,等于十进制数16,最后我调查了这个问题,等于4x4。我已经老了,但我很确定自从我上学以来,数学并没有改变 : - )

在任何情况下,堆栈上的东西都不是必需在四字节边界上对齐。对齐可能会加快某些操作,但是:

  • 它不是x86平台上的必需品(在某些平台上,访问未对齐的数据会导致出现故障);和
  • 对齐倾向于匹配参数大小(例如两个字节的值&#34;需要&#34;两个字节的对齐)。