我有一个简单的汇编程序,试图通过在内存中存储一个临时变量来返回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
应该在启动时拥有自己的堆栈吗?
答案 0 :(得分:5)
在程序启动时,%esp
寄存器初始化到堆栈顶部(记住它向向下),但%ebp
未初始化。所以你必须这样做。
_start:
movl %esp, %ebp
subl $4, %esp
... rest of your code
为本地变量保留4个字节,由偏移量-4(%ebp)
访问。