Assembly %ebp应采用什么初始值?
我有一个简单的汇编程序,它试图通过在内存中存储一个临时变量来返回3:Assembly %ebp应采用什么初始值?,assembly,x86,abi,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 -
.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它自己的堆栈吗?在程序启动时,
%esp
寄存器被初始化到堆栈的顶部(记住它向下增长),但是%ebp
没有初始化。所以你必须这么做
_start:
movl %esp, %ebp
subl $4, %esp
... rest of your code
这为本地变量保留了4个字节,由偏移量
-4(%ebp)
访问。在程序启动时,%esp
寄存器被初始化到堆栈顶部(记住它向下增长),但%ebp
未被初始化。所以你必须这么做
_start:
movl %esp, %ebp
subl $4, %esp
... rest of your code
这为本地变量保留了4个字节,由偏移量
-4(%ebp)
访问。实际上,如果所有函数都使用%ebp
作为帧指针,那么它将被初始化为上一帧。但这当然是一种假设。8-)这仍然是错误movl%esp,%ebp
subl$4,%esp
movl%ebx,-4(%ebp)
您确定这些都是必需的吗?您的代码在哪条指令上发生了错误,以及当时相关寄存器的值是什么?啊哈,在具有32位内核的机器上运行32位代码似乎有问题。您的答案与32位内核完美配合。我感觉您打算在其中一个位置键入“64”。实际上,如果所有函数都使用%ebp
作为帧指针,那么它将被初始化为上一帧。但这当然是一种假设。8-)这仍然是错误movl%esp,%ebp
subl$4,%esp
movl%ebx,-4(%ebp)
您确定这些都是必需的吗?您的代码在哪条指令上发生了错误,以及当时相关寄存器的值是什么?啊哈,在具有32位内核的机器上运行32位代码似乎有问题。您的答案与32位内核完美配合。我感觉您打算在其中一个位置键入“64”。