选择语句的机器级表示

无条件转移指令--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,7
 mov ebx,6
 jmp NEXT
 mov ecx,ebx
 NEXT:  #如果再汇编语言里看到这个冒号,名字是可以自己取的
 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
posted @ 2025-09-16 17:39  是我,米老鼠  阅读(9)  评论(0)    收藏  举报