Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly %ebp应采用什么初始值?_Assembly_X86_Abi - Fatal编程技术网

Assembly %ebp应采用什么初始值?

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 -

我有一个简单的汇编程序,它试图通过在内存中存储一个临时变量来返回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它自己的堆栈吗?

在程序启动时,
%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”。