x86 程序集分段错误
x86 Assembly segmentation fault
我可以编译它,但是当我 运行 它时,我得到 "segmentation fault"。
如果有人解释原因,我会很高兴。
.section .data
digitformatstr:
.string "%d\n"
.section .text
.global main
main:
push 37
pop %eax
movl %eax, -4(%ebp)
push -4(%ebp)
push $digitformatstr
call printf
addl , %esp
您似乎在使用 GNU 汇编程序和 GCC 的 C 库来构建您的可执行文件。您的代码的主要问题是您在使用它之前没有设置 register %ebp 。通常使用 C
,您的函数首先设置本地堆栈帧,其中包括初始化 %ebp。要正确设置本地堆栈框架,并在返回之前清理堆栈,您可以使用如下代码:
.section .data
digitformatstr:
.string "%d\n"
.section .text
.global main
main:
push %ebp /* setup local stack frame */
mov %esp, %ebp
push 37
pop %eax
movl %eax, -4(%ebp)
push -4(%ebp)
push $digitformatstr
call printf
addl , %esp
leave /* remove local stack frame */
ret
可以找到栈帧和 32 位 C 调用约定的初学者指南 here。
关于您的代码的另一条评论。你这样做:
push 37
pop %eax
movl %eax, -4(%ebp)
push -4(%ebp)
push $digitformatstr
call printf
我不确定您尝试使用此代码做什么。看起来您似乎正试图将 1337 作为局部变量放在堆栈上(但 space 尚未在堆栈上分配用于局部变量)。由于您似乎只是想简单地调用 printf
,其中第二个参数是整数,因此您应该将该值 (1337) 压入堆栈。上面的所有代码应该只是:
push 37 /* 2nd argument to printf */
push $digitformatstr /* 1st argument to printf */
call printf /* call printf
main
的最终清理代码可能类似于:
main:
push %ebp /* setup local stack frame */
mov %esp, %ebp
push 37 /* 2nd argument to printf */
push $digitformatstr /* 1st argument to printf */
call printf /* call printf
addl , %esp /* cleanup the 2 32 bit arguments */
/* we pushed on the stack */
leave /* remove local stack frame */
ret
我可以编译它,但是当我 运行 它时,我得到 "segmentation fault"。
如果有人解释原因,我会很高兴。
.section .data
digitformatstr:
.string "%d\n"
.section .text
.global main
main:
push 37
pop %eax
movl %eax, -4(%ebp)
push -4(%ebp)
push $digitformatstr
call printf
addl , %esp
您似乎在使用 GNU 汇编程序和 GCC 的 C 库来构建您的可执行文件。您的代码的主要问题是您在使用它之前没有设置 register %ebp 。通常使用 C
,您的函数首先设置本地堆栈帧,其中包括初始化 %ebp。要正确设置本地堆栈框架,并在返回之前清理堆栈,您可以使用如下代码:
.section .data
digitformatstr:
.string "%d\n"
.section .text
.global main
main:
push %ebp /* setup local stack frame */
mov %esp, %ebp
push 37
pop %eax
movl %eax, -4(%ebp)
push -4(%ebp)
push $digitformatstr
call printf
addl , %esp
leave /* remove local stack frame */
ret
可以找到栈帧和 32 位 C 调用约定的初学者指南 here。
关于您的代码的另一条评论。你这样做:
push 37
pop %eax
movl %eax, -4(%ebp)
push -4(%ebp)
push $digitformatstr
call printf
我不确定您尝试使用此代码做什么。看起来您似乎正试图将 1337 作为局部变量放在堆栈上(但 space 尚未在堆栈上分配用于局部变量)。由于您似乎只是想简单地调用 printf
,其中第二个参数是整数,因此您应该将该值 (1337) 压入堆栈。上面的所有代码应该只是:
push 37 /* 2nd argument to printf */
push $digitformatstr /* 1st argument to printf */
call printf /* call printf
main
的最终清理代码可能类似于:
main:
push %ebp /* setup local stack frame */
mov %esp, %ebp
push 37 /* 2nd argument to printf */
push $digitformatstr /* 1st argument to printf */
call printf /* call printf
addl , %esp /* cleanup the 2 32 bit arguments */
/* we pushed on the stack */
leave /* remove local stack frame */
ret