判断语句 & 跳转语句
判断语句 & 跳转语句
使用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 ; 等于的话执行movcmovne rax, rbx ; 不等于执行movcmovge rax, rbx ; 大于等于执行movcmovg rax, rbx ; 大于执行movcmovle rax, rbx ; 小于等于执行movcmovl 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
最后请练习完成中间的程序片段