程序集中的局部变量存储分配

时间:2009-04-28 08:15:56

标签: assembly

当说为局部变量分配存储时,经常使用以下代码段

addl $8,%esp  //allocate 8-byte storage

push %ebx     //store some value onto the stack

为什么不简单地将值推入堆栈,而是预先分配一些空间?

2 个答案:

答案 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个字节局部变量的函数。