%ebp需要的初始值是多少?

时间:2014-07-23 22:23:13

标签: assembly x86 abi

我有一个简单的汇编程序,试图通过在内存中存储一​​个临时变量来返回3:

.text
    .global _start

_start:
    movl    $2, %ebx
    mov     %ebx, -0x4(%ebp)
    movl    $1, %ebx
    add     -0x4(%ebp), %ebx
    movl    $1, %eax
    int     $0x80

但是,当我运行它时,这会给我一个分段错误:

$ as out.s -o out.o
$ ld -s -o out out.o
$ ./out
segmentation fault

我认为这是因为我从不初始化%ebp。如果我只使用寄存器而不访问相对于%ebp的主存储器,我的程序运行正常。

应该初始化什么值?程序malloc应该在启动时拥有自己的堆栈吗?

1 个答案:

答案 0 :(得分:5)

在程序启动时,%esp寄存器初始化到堆栈顶部(记住它向向下),但%ebp未初始化。所以你必须这样做。

_start:
    movl     %esp, %ebp
    subl     $4, %esp
    ... rest of your code

为本地变量保留4个字节,由偏移量-4(%ebp)访问。