assembly - 错误的装配逻辑?
问题描述
我正在尝试为我的自定义语言编写编译器,输出是 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”时,它神奇地按预期工作。这令人困惑。
解决方案
推荐阅读
- swift - 使用 SwiftJSON 将 Alamofire 结果 JSON 加载到表视图中
- json - 是否可以为 jsonSchema 规范定义一个 jsonSchema ?
- javascript - 在函数上切换背景颜色 - ReactJS
- python - 在python中覆盖@classmethods的__str__方法
- google-cloud-platform - Google Datastore 祖先查询返回的数据太低了
- python - PIP3 安装总是试图从 git-lfs 目录中获取包
- c# - uwp 项目名称不能以“<”字符开头
- excel - 如何获取从第一行以外的行开始的数据透视表的行数?
- laravel - 如何切换 laravel 队列的运行与否
- reactjs - 当我在 url 中指定页面时,React-Router 返回 404