分段故障cmovl

时间:2015-05-15 19:53:57

标签: linux assembly

在尝试运行某些已编译的程序集时,我收到错误“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显然无法使代码崩溃。现在我更加无能为力了。

1 个答案:

答案 0 :(得分:3)

我非常确定行cmp %eax, 0会导致崩溃,因为在{& t}语法中0有一个内存引用,一个NULL指针。大概你想比较eax到0,在这种情况下你需要cmp $0, %eax

学习使用调试器。