【发布时间】:2011-05-09 16:25:41
【问题描述】:
我一直是一名高级编码员,架构对我来说相当新,所以我决定在这里阅读关于组装的教程:
http://en.wikibooks.org/wiki/X86_Assembly/Print_Version
在教程的最后,关于如何转换 Hello World 的说明!程序
#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
解释是:
这段代码“和”s ESP 与 0xFFFFFFF0, 将堆栈与下一个对齐 最低 16 字节边界。一个 Mingw的源代码检查 表明这可能适用于 SIMD “_main”中出现的说明 例程,仅在对齐时运行 地址。因为我们的例程没有 包含 SIMD 指令,这一行 是不必要的。
我不明白这一点。有人可以解释一下将堆栈与下一个 16 字节边界对齐意味着什么以及为什么需要它吗? andl 是如何做到这一点的?
【问题讨论】:
标签: c assembly gcc x86 memory-alignment