我一直是高级编码人员,而体系结构对我来说还很新,所以我决定在此处阅读有关Assembly的教程:
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
原因是:
此代码用0xFFFFFFF0“和” ESP,使堆栈与下一个最低的16字节边界对齐。对Mingw的源代码进行检查后发现,这可能适用于出现在“ _main”例程中的SIMD指令,该指令仅在对齐的地址上运行。由于我们的例程不包含SIMD指令,因此此行是不必要的。
我不明白这一点。有人可以给我解释一下将堆栈与下一个16字节边界对齐是什么意思,为什么要这样做?以及如何andl实现这一目标?
吃鸡游戏
慕妹3146593
相关分类