我一直是高层次的编码器,以及架构是相当新的给我,所以我决定在这里阅读关于大会教程:对齐堆栈是什么意思?
http://en.wikibooks.org/wiki/X86_Assembly/Print_Version
远了教程,如何转换的说明你好,世界!程序
#include <stdio.h>
int main(void) {
printf("Hello, world!\n");
return 0;
}
成等价的汇编代码被给和产生以下情况:
.text
LC0:
.ascii "Hello, world!\12\0"
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
call __alloca
call ___main
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
对于线中的一条,
andl $-16, %esp
的解释是:
该代码“和”ESP与0xFFFFFFF0, 将堆栈与下一个 最低的16字节边界对齐。对Mingw的源代码 的检查揭示,这可能是针对出现在“_main” 例程中的SIMD 指令,其仅在对齐的 地址上操作。由于我们的例程不包含 包含SIMD指令,此行 是不必要的。
我不明白这一点。有人能给我一个解释,说明将堆栈与下一个16字节边界对齐的意义,以及为什么它是必需的? andl
如何实现这一目标?
http://en.wikipedia.org/wiki/Data_structure_alignment – chrisaycock 2010-11-13 23:33:57
在没有启用优化器的情况下查看机器代码没什么意义。 – 2010-11-14 01:23:31