4

我一直在研究 x86 上的 Linux elf 可执行文件,主要使用 IDA,但也使用 gdb。我注意到的一件事是函数总是在字对齐的地址处加载?有谁知道其中的原因?我不知道 x86 指令从对齐地址开始的任何要求。并且不能由于页面对齐导致页面边界仍然可以在函数内的任何位置。

我将不胜感激。

谢谢。

4

2 回答 2

6

你是对的,指令不需要对齐。在 x86 处理器上,汇编指令使用从 1 到至少 15 个字节的可变长度代码进行编码。

但是指令是从通常以 64 字节对齐的缓存中读取的,当代码正确对齐时,执行管道的某些部分运行得更快:解码、循环、分支预测等。

最好的信息来源是 Agner Fog 的文档:http ://www.agner.org/optimize/

于 2010-05-19T07:54:23.503 回答
1

对于某些架构,数据的对齐方式决定了每次操作可以复制的数据量。例如,尝试从地址 0x4000 复制 32 位可能需要一次 32 位移动操作,而从 0x4001 复制 32 位可能需要 4 次 8 位移动操作。此外,对未对齐的地址使用 32 位移动指令可能会触发硬件异常。硬件异常通过一次复制 8 位来处理,但比从对齐地址复制要慢。

编辑:

这适用于所有数据,而不仅仅是将要执行的数据。因此,函数入口点与切换目标、字符串常量、全局变量和其他数据对齐。

于 2010-05-19T07:29:05.583 回答