at&t 汇编代码 ebp 注册未定义行为
Posted
技术标签:
【中文标题】at&t 汇编代码 ebp 注册未定义行为【英文标题】:at&t assembly code ebp register undefined behavior 【发布时间】:2014-05-02 05:10:51 【问题描述】:自从大约一个月前开始学习 at&t 汇编以来,我被告知 %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 的正确版本吗?
我觉得这个问题可能有一个直观的答案,但我只是没有看到它,也无法在网上找到任何关于它的资源。
【问题讨论】:
请注意,ebp
并没有什么特别之处,它在某些代码中起作用的唯一原因是因为它是由函数序言设置的,用于存储堆栈指针(众所周知的 push %ebp; mov %esp, %ebp
序列)。这不是强制性的,您可以使用ebp
作为通用寄存器。事实上,最近的gcc
版本在优化时默认会这样做。
【参考方案1】:
0x10
是四的倍数。这是一个十六进制数,等于十进制中的 16,最后我研究了这个问题,等于4x4
。我老了,但我很确定自从我上学以来,数学并没有发生太大的变化 :-)
在任何情况下,堆栈上的东西都不需要在四字节边界上对齐。对齐可能会加快某些操作,但是:
这在 x86 平台上不是强制性的(在 一些 平台上,访问未对齐的数据会导致引发错误);和 对齐方式倾向于匹配参数大小(例如一个两字节值“需要”两字节对齐)。【讨论】:
我现在感觉自己像个白痴。代码开始模糊在一起,出于某种原因,我不认为 0x10 是十六进制值。我的大脑只是希望它是 %ebp-10 而不是 %ebp-16 。感谢您的明确答复!以上是关于at&t 汇编代码 ebp 注册未定义行为的主要内容,如果未能解决你的问题,请参考以下文章