在尝试运行某些已编译的程序集时,我收到错误“Segmentation fault(core dumped)”。导致程序崩溃的代码如下:
.global tiny
.type tiny, @function
tiny:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
# Compiling A1MINUS
movl $3, %eax
negl %eax
movl %eax, -4(%ebp)
# Compiling A0
movl -4(%ebp), %eax
movl %eax, -8(%ebp)
# Compiling A0
movl $7, %eax
movl %eax, -12(%ebp)
movl -8(%ebp), %eax
cmp %eax, -12(%ebp) // Error
movl $1, %eax // Error
movl %eax, %ebx //Error
movl $0, %eax //Error
cmovl %eax, %ebx // Error
movl %eax, -16(%ebp) // Error
# IF
movl -16(%ebp), %eax
cmp %eax , 0
jz lbl_3
movl -8(%ebp), %eax
pushl %eax
call print_int
addl $4, %esp
jmp lbl_4
lbl_3:
movl -12(%ebp), %eax
pushl %eax
call print_int
addl $4, %esp
lbl_4:
movl %ebp, %esp
popl %ebp
ret
我不知道我的错误是什么,感谢任何帮助。
错误的代码( cmovl )应该在 -16(%ebp)中放置0或1,具体取决于 CMP 即可。 (破碎的代码是'低于'语句的翻译。)
如评论中所述,cmovl显然无法使代码崩溃。现在我更加无能为力了。
答案 0 :(得分:3)
我非常确定行cmp %eax, 0
会导致崩溃,因为在{& t}语法中0
有一个内存引用,一个NULL
指针。大概你想比较eax到0,在这种情况下你需要cmp $0, %eax
。
学习使用调试器。