无条件转移指令--jmp
格式:
jmp <地址> #pc无条件跳转到<地址>
<地址>可以由常数直接给出:jmp 5
<地址>可以来自于寄存器:jmp eax
<地址>可以来自于主存 :jmp [999]
<地址>可以用“标号”锚定:jmp NEXT
100 mov eax,7
104 mov ebx,6
108 jmp 116
112 mov ecx,ebx
116 mov ecx,eax
如果用以上的方法直接jmp,如果地址不再从100开始,而是从200开始,就会导致程序报错
因此我们设置一个锚点 NEXT:
mov eax,7mov ebx,6jmp NEXTmov ecx,ebxNEXT: #如果再汇编语言里看到这个冒号,名字是可以自己取的mov ecx,eax
条件转移指令
功能 | 汇编指令 | 解释 |
---|---|---|
相等时跳转 | je <地址> | Jump when equal 当a==b时跳转 |
不相等时跳转 | jne <地址> | Jump when not equal 当a !=b时跳转 |
当大于时跳转 | jg <地址> | jump when greater than |
当大于等于时跳转 | jge <地址> | jump when greater than or equal to |
当小于时跳转 | jl <地址> | jump when less than |
当小于等于时跳转 | jle <地址> | jump when less than or equal to |
使用上面任意一条指令之前,一般都会先使用cmp指令
功能 | 汇编指令 | 解释 |
---|---|---|
比较a和b当大小 | cmp a,b | Compare |
先对比这两个值,如果【】那么进行跳转
if (a>b)
{c=a;
}
else{c=b;
}
mov eax,7 #把数字7放入寄存器
mov ebx,6
cmp eax,ebx #比较7和6的大小
jg NEXT #如果7大于6 那么转到next
mov ecx,ebx #否则把b的值赋给c
jmp END #立刻无条件结束,防止走到next
NEXT:
mov ecx,eax #当7大于6的时候 让把a的值赋给c
END:
cmp指令的底层原理
硬件视角:通过cmp指令 比较a和b,实际上是用a-b
相减的结果会记录在程序状态字寄存器中(PSW) 标志寄存器
PSW有几个比特位记录上次的运算结果,
进位/借位标志CF,最高位有进位/错位时CF=1
零标志ZF,运算结果为0时,ZF=1
符号标志SF,运算结果为负,SF=1
溢出标志OF,运算结果有溢出,OF=1
功能 | 汇编指令 | 解释 | 标识 |
---|---|---|---|
相等时跳转 | je <地址> | Jump when equal 当a==b时跳转 | zf==1 |
不相等时跳转 | jne <地址> | Jump when not equal 当a !=b时跳转 | zf==0 |
当大于时跳转 | jg <地址> | jump when greater than | zf==0&&sf==of |
当大于等于时跳转 | jge <地址> | jump when greater than or equal to | sf==of |
当小于时跳转 | jl <地址> | jump when less than | sf!=of |
当小于等于时跳转 | jle <地址> | jump when less than or equal to | Sf!=of||zf==1 |