首页 > 解决方案 > 错误的装配逻辑?

问题描述

我正在尝试为我的自定义语言编写编译器,输出是 NASM 汇编:

BITS 64
section .text
    global _start

_start:
    push rbp
    mov rbp,rsp

    ; --- (+) 1, 1 --- ;
    mov rax,1
    mov rbx,1
    add rax,rbx

    ; --- (if) rax --- ;
    cmp rax,0
    jz after_if_1

    ; --- (write) '3 --- ;
    mov ecx,str_3
    mov rdx,15
    mov rbx,1
    mov rax,4
    int 80h

    ; --- (+) 2, 2 --- ;
    mov rax,2
    mov rbx,2
    add rax,rbx

    ; --- (if) rax --- ;
    cmp rax,0
    jz after_if_2

    ; --- (write) '2 --- ;
    mov ecx,str_2
    mov rdx,15
    mov rbx,1
    mov rax,4
    int 80h

    ; --- (+) 3, 3 --- ;
    mov rax,3
    mov rbx,3
    add rax,rbx

    ; --- (if) rax --- ;
    cmp rax,0
    jz after_if_3

    ; --- (write) '1 --- ;
    mov ecx,str_1
    mov rdx,15
    mov rbx,1
    mov rax,4
    int 80h

after_if_3:
after_if_2:
after_if_1:
    pop rbp
    mov rax,1
    syscall

section .data
    str_1 db 33h,2bh,33h,20h,69h,73h,20h,6eh,6fh,74h,20h,7ah,65h,72h,6fh
    str_2 db 32h,2bh,32h,20h,69h,73h,20h,6eh,6fh,74h,20h,7ah,65h,72h,6fh
    str_3 db 31h,2bh,31h,20h,69h,73h,20h,6eh,6fh,74h,20h,7ah,65h,72h,6fh

我不是组装专家,为什么总是跳到最后?(即使 rax 不为零,jz after_if_1 也会被触发)这几乎可以肯定是我的错,但为什么呢?

注意:当我将第一个“cmp rax,0”更改为“cmp eax,0”时,它神奇地按预期工作。这令人困惑。

标签: assemblyx86logicx86-64nasm

解决方案


推荐阅读