跳转指令的学习

CMP
该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。只是根据相减的结果来改变零标志位的,当两个操作数相等

的时候,零标志位置1。
零标志位z

JZ指令,如果Z标志被置为1,就跳转,否则,就不跳转。

符号标志位s 比较第一个操作数是否大于第二个操作数 正数为0 负数为1
cmp eax,ecx eax>ecx
eax = 02
ecx = 01
执行过后z = 0 说明两个数不相等
s = 0 说明eax > ecx

TEST(逻辑比较)
该指令在一定程序上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位(比如说,SF,ZF,PF标志位),
程序可以根据结果来决定是否跳转到相应的分支。
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0
所以test eax,eax = 0只有一种情况 就是eax = 0;
eax = 0
test eax,eax
最后z标志位 = 1 说明eax = 0

所有的跳转指令都会指向程序将会跳转到的地址。我们在下面的列表中可以看到各种不同类型的跳转指令。
JMP – 跳转
JE, JZ – 结果为零则跳转
JNE, JNZ – 结果不为零则跳转
JS – 结果为负则跳转
JNS – 结果不为负则跳转
JP, JPE – 结果中1的个数为偶数则跳转
JNP, JNPE – 结果为1的个数为奇数则跳转
JO – 结果溢出了则跳转
JNO – 结果没有溢出则跳转
JB, JNAE – 小于则跳转 (无符号数)
JNB, JAE – 大于等于则跳转 (无符号数)
JBE, JNA – 小于等于则跳转 (无符号数)
JNBE, JA – 大于则跳转(无符号数)
JL, JNGE – 小于则跳转 (有符号数)
JNL, JGE – 大于等于则跳转 (有符号数)
JLE, JNG – 小于等于则跳转 (有符号数)
JNLE, JG – 大于则跳转(有符号数)

JMP
这是一个无条件跳转指令,即总是跳转到指定的地址。
je或jz
z 为1的时候 即比较结果为0的时候跳转
cmp eax,ecx eax=ecx 的时候z为1
test eax,eax eax=0时候跳转 z为1

JNE或JNZ
这条指令与上面一个指令刚好相反:如果零标志位Z为0则跳转,即,要求操作的结果非零。

js比较结果为负的时候跳转 此时符号标志位s=1
eax = 1
ecx = 2
cmp eax,ecx s = 1
此时
js指令跳转

JP或JPE
这个跳转指令时当奇偶标志位P置1的时候才会发生,也就是比较的结果中1的个数要是偶数。
eax = 3
ecx = 1
cmp eax,ecx = 2 二进制位 10
此时p=0 不跳转
eax = 4
ecx = 1
cmp eax,ecx = 3 二进制11
此时p = 1
执行跳转指令

NP 或JNPE
这条指令刚好与上一条指令刚好相反,当奇偶标志位P为0的时候跳转。即结果中1的个数为奇数的时候。在上面的例子中,当结果为2的时候发生跳转,当结果为

3的时候不会发生跳转。

JO
当发生溢出时,即溢出标志位O置1的时候跳转。
eax = 7fffffff
ecx = 1
add eax,ecx
o置1
跳转

JNO
跟上一条指令相反,这里是当溢出标志位O为0时跳转,即溢出没有发生时。

JB
如果第一个操作数小于第二个操作数的时候跳转。
此时c标志位置1
c标志位是进位/借位标志位置1,当两个操作数的差值为负的时候,该标志位将被置1,这里我们将可以得出EAX小于ECX。

JNB
和JB指令相反,这个指令是当进位/借位标志位c为0的时候跳转,也就是说,结果为正的时候跳转。在前面的例子中,因为EAX小于ECX,所以不会发生跳转。

JBE
这个指令时小于或者等于的时候跳转,这是判断两个标志位的,当进位/借位标志位c置1或者零标志位Z置1的时候将发生跳转,也就是说,EAX要小于或者等于ECX

才会发生跳转。
eax = 1
ecx = 1
cmp eax,ecx = 0 此时z = 1跳转
或者
eax =1
ecx = 2
cmp eax,ecx = -1 c = 1 跳转

JNBE
这个指令跟JBE刚好相反,当进位/借位标志位C与零标志位Z都为0时候才会发生跳转。

JL
这个指令当小于的时候跳转,但是与前面的JB稍微有点不同。这个指令时根据符号标志位S来决定是否跳转。
eax = 1
ecx = 0
cmp eax,ecx = 1
此时s= 0不跳转

eax = 2
ecx = 3;
cmp eax,ecx = -1 s = 1此时跳转

eax =fffffff7
ecx = 00000001
cmp eax,ecx
jb 不跳转
jl 跳转
因为JB比较两个数的时候,将它们两个都看做是正数,即认为它们是无符号数,但是JL指令要考虑符号,这就是这两条指令的主要区别。

跳转分为两类 有符号跳转和无符号跳转
JA,JB,JBE,JAE的两个操作数都是正数(无符号数),而JG,JL,JLE,JGE把两个操作数都看成有符号数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值