【发布时间】:2014-06-25 23:32:08
【问题描述】:
我正在阅读本关于汇编的教程:http://orangejuiceliberationfront.com/intel-assembler-on-mac-os-x/,我遇到了这个基本的汇编代码:
.text
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $0, %eax
leave
ret
我对其中的大部分内容有点了解,但我不知道为什么会调用 subl $8, %esp。我知道它从 esp 中减去 8 个字节,但我不知道为什么这是必要的或为什么这样做。教程说它将堆栈平衡到 16 字节边界,但我不知道“平衡”堆栈是什么意思,也不知道为什么使用数字 8 会产生 16 字节边界。
本教程后面会展示如何定义一个函数,并像这样调用它:
.text
.globl _doSomething
_doSomething:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
nop
leave
ret
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $3, (%esp)
call _doSomething
movl $0, %eax
leave
ret
教程中有“8 对齐,16 用于我们的 4 字节参数和填充”:subl $24, %esp
但是如果有一个 4 字节的参数和填充,为什么我们使用数字 16?还有,什么参数?
我在 Intel Core mac 上,运行 OS X 10.9.3,使用 gcc -S -m32 编译。
我对组装很陌生,所以请让你的答案尽可能简单。谢谢!
【问题讨论】:
-
看看agner.org/optimize/optimizing_assembly.pdf。您现在可以跳过优化部分,但它也是关于调用约定和对齐等的非常好的文章。
-
谢谢!我会开始阅读这篇文章。