跳转到内容

判断语句 & 跳转语句

判断语句 & 跳转语句

使用cmp比较寄存器和另一个内容相不相等和大小

cmp rax, 200;

用完cmp会触发相关标志导致可以直接使用对应的跳转语句

jmp 直接跳转
je 等于跳转
jge 大于或等于跳转
jg 大于跳转
jle 小于或等于跳转
jl 小于跳转
jz ZF(零标志)跳转
jnz 无ZF跳转

cmp执行的是减法(sub)的动作,将两数相减但不保存,相等的话触发ZF,其他情况触发别的标志
所以实际上je完全等于jz

来看一段示例:

_start:
mov rax, 2
mov rbx, 2
cmp rax, rbx
je equal
; TODO: 输出不相等
jmp exit
equal:
; TODO: 输出相等
exit:
; TODO: 离开程式

条件成立的话跳转语句会跳到对应的label,但程式依旧会由上往下执行,即使下面是别的区块,所以要jmp至后面避免在不相等时执行到equal

CMOVcc

运行完cmp后除了接跳转语句,还有相当方便的cmov开头指令能用

cmove rax, rbx ; 等于的话执行mov
cmovne rax, rbx ; 不等于执行mov
cmovge rax, rbx ; 大于等于执行mov
cmovg rax, rbx ; 大于执行mov
cmovle rax, rbx ; 小于等于执行mov
cmovl rax, rbx ; 小于执行mov

跟跳转语句一样的结尾,实际上就是英文缩写
另外还有a结尾跟g一样表示大于,a的意思是高于,用在无符号数,而g用在有符号数
因为负数的二进制前面有个1,b则是无符号的低于,对应l有符号的小于

TEST

若要判断寄存器是否为零,最佳作法是

test rax, rax

使用test带入两个相同的寄存器,而不是cmp rax, 0,test实际上做了and运算但不保存结果,会触发ZF
当两个内容都是0时,and的结果才会是0,在检查零的情况使用test优于cmp

最后请练习完成中间的程序片段