当说为局部变量分配存储时,经常使用以下代码段
addl $8,%esp //allocate 8-byte storage
push %ebx //store some value onto the stack
为什么不简单地将值推入堆栈,而是预先分配一些空间?
答案 0 :(得分:4)
如果你问为什么编译器不会为本地存储生成推送指令而不是直接操作堆栈指针,那就是效率问题。
自动变量(无论如何都是C)是未初始化的,所以代码序列将是(我将使用subl,因为我习惯于在内存中堆积成长):
C Code Actual assembly Your suggestion
void x(void) {
int a; subl 8,%esp push 0
int b; push 0
: : : blah blah blah blah
}
我的回答是在以下情况下这是不必要和低效的:
C Code Actual assembly Your suggestion
void x(void) {
int a[100]; subl 400,%esp push 0
push 0
push 0
: : :
push 0
: : : blah blah blah blah
你提出的建议可能对以下内容有意义:
C Code Your suggestion
void x(void) {
int a = 7; push 7
int b = 9; push 9
int c[4]; subl 16,%esp
: : : blah blah
}
答案 1 :(得分:0)
因此分配的空间是固定大小,这对于编译器来说是最简单的,因为可以使用“DWORD PTR [ebp +(offset)]”访问内存。 通常的功能序言如下:
(英特尔语法) 推ebp 添加ebp,8 mov ebp,esp
用于具有8个字节局部变量的函数。