1

我刚刚开始学习汇编。我一直在编写简单的 C 编码并将其编译为程序集。下面是一个非常简单的。

C 编码

int main(){
    int a;
    a = 25;
    return a;
}

集会

main:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $16, %esp
    movl    $25, -4(%ebp)
    movl    -4(%ebp), %eax
    leave
    ret

我不明白的是为什么从 %esp 中减去 16。

4

2 回答 2

4

这在堆栈上分配了 16 个字节。在 x86 架构上,堆栈从高地址到低地址。从堆栈指针中减去 16 会分配该内存以供您的函数使用。

于 2013-08-25T03:25:43.967 回答
2

它在堆栈上创建一些空间(称为函数堆栈框架)来存储局部变量,并且在您离开函数后立即被销毁。编译器生成的数字可能会有所不同,并且超出了函数的需要。

于 2013-08-25T03:28:12.653 回答