首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分段问题NASM

分段问题NASM
EN

Stack Overflow用户
提问于 2015-04-30 09:12:02
回答 1查看 48关注 0票数 0

我正在处理C程序到NASM的转换,在程序运行后,我遇到了分段错误的问题。它将做它应该做的事情,但将在它的末尾提供一条分段故障消息。

代码是:

代码语言:javascript
复制
segment .data

out_less    db "Z is less than 20.", 10, 0
out_greater    db "Z is greater than 20.", 10, 0
out_equal    db "Z is equal to 20! Yeah Z!", 10, 0

segment .bss

segment .text

global     main
extern printf
ret
main:

    mov    eax, 10
    mov    ebx, 12

    mov    ecx, eax

    add    ecx, ebx    ;set c (ecx reserved)

    mov    eax, 3
    mov    ebx, ecx
    sub    ebx, eax    ;set f (ebx reserved)

    mov    eax, 12
    mul    ecx
    add    ecx, 10        ;(a+b*c) (ecx reserved)

    mov    eax, 6
    mul    ebx
    mov    eax, 3
    sub    eax, ebx
    mov    ebx, eax    ;(d-e*f) (ebx reserved) reassign to ebx to keep eax open for manipulation

    mov    eax, ecx
    div    ebx
    mov    ecx, eax
    add    ecx, 1        ;(a+b*c)/(d-e*f) + 1

    cmp    ecx, 20
    jl    less
    jg    greater
    je    equal

mov    eax, 0
ret

less:

    push    out_less
    call    printf
    ret
    jmp    end

greater:

    push    out_greater
    call    printf
    ret
    jmp    end

equal:

    push    out_equal
    call    printf
    ret
    jmp     end

end:

    mov    eax, 0
    ret

我不确定是什么导致了错误,因为程序确实正确运行了,有什么想法吗?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-04-30 10:44:08

更新-这似乎起作用了:

代码语言:javascript
复制
segment .data

out_less     db "Z is less than 20.", 10, 0
out_greater  db "Z is greater than 20.", 10, 0
out_equal    db "Z is equal to 20! Yeah Z!", 10, 0

segment .bss

segment .text

        global  main
        extern  printf

main:
        mov    eax, 10
        mov    ebx, 12
        mov    ecx, eax
        add    ecx, ebx    ;set c (ecx reserved)
        mov    eax, 3
        mov    ebx, ecx
        sub    ebx, eax    ;set f (ebx reserved)
        mov    eax, 12
        mul    ecx
        add    ecx, 10     ;(a+b*c) (ecx reserved)
        mov    eax, 6
        mul    ebx
        mov    eax, 3
        sub    eax, ebx
        mov    ebx, eax    ;(d-e*f) (ebx reserved) reassign to ebx to keep eax open for manipulation
        mov    eax, ecx
        div    ebx
        mov    ecx, eax
        add    ecx, 1      ;(a+b*c)/(d-e*f) + 1
        cmp    ecx, 20
        jl    less
        jg    greater
        jmp   equal

less:
        push    out_less
        call    printf
        add     esp,4
        jmp     exit

greater:
        push    out_greater
        call    printf
        add     esp,4
        jmp     exit

equal:
        push    out_equal
        call    printf
        add     esp,4
exit:
        mov    eax, 0
        ret

        end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29957359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档