×
嵌入式 > 技术百科 > 详情

第14章 有条件跳转(X86汇编教程)

发布时间:2020-06-10 发布时间:
|
本X86汇编教程目录 http://www.51hei.com/mcu/2619.html
        一阵疯狂的游戏后,我又回来了....还记得无条件跳转吗?这回我将讲解有条件跳转.
        什么是有条件跳转呢?那就是,必须达成某某条件才能跳转,比如说必须数字1和数字2一样才跳转,或者数字1比数字2大才跳转,如果条件没有实现则不跳转,相当于跳转指令不存在.也许你想到了高级语言的IF语句,没错,IF语句也是用有条件跳转实现的.
        判断的过程是分两步进行的.先把2个数值运算一下,得出哪个数大哪个小或者是否等于.然后才是有条件跳转指令
        前边说过,当我们使用计算指令的时候标志寄存器会随着计算结果改变,所以,从标志寄存器可以知道上一次计算出来的结果是负数还是正数之类的信息.通过这些信息我们就知道上次计算哪个数字比哪个大(前提是上次计算是使用减法计算),所以,判断的第一步,运算,一般用减法来做,SUB AX,BX这样就能根据有条件跳转指令知道AX和BX哪个大.有时候我们希望进行一次SUB计算,但不希望某个数值被改变,这种时候,就用CMP指令吧.它会进行一次减法运算,只改变寄存器,不保存结果

指令名                :CMP
指令说明             :一切用法和SUB减法指令一样.但是计算后计算结果不会保存下来.只会改变标志寄存器,用来判断2个数值的大小 就用这个! 
然后有条件跳转指令,这些指令的使用方法和JMP一样,所以不详细介绍,只简短说明.


指令名                :JE
指令说明             :一切用法和JMP跳转指令一样,见下边:
指令 要跳转的位置
与JMP不同的是上次计算结果为0才会跳转(想想用减法指令计算什么数字结果会为0?)没错,这条指令一般是判断2个数字是否相同用的,一个数字减去自己结果当然为0(当然,没说一定要这样,只要上次计算结果是0就能跳转,自己发挥智力开发其它用途吧). 

指令名                :JNE
指令说明             :和上个指令相反,上次计算结果不为0就跳转, 也就是减法计算两个数字不同的情况下 

指令名                :JB
指令说明             :溢出则跳转,什么是溢出呢?当计算(我这里就假设为是减法计算了) 结果超过存放计算结果的寄存器,也就是计算结果为17位,但存放计算结果的寄存器为16位(放不进去)的时候就会溢出(这种情况在加法和乘法中会出现)还有就是计算结果为小于0的数值(负数啊) ,想想减法计算什么情况下会出现负数呢?当然是被减数小于减数的时候.所以这个可以判断出第一个数字是否比第二个数字小.

指令名                :JNB
指令说明             :和JB指令相反,没有溢出和跳转.... (注意,计算结果为0也会跳转),也就是减法计算第1个数字不低于第2个数字的情况下

指令名                :JA
指令说明             :上次数学计算(我这里就假设为是减法计算了),结果不是0(那么2个数字不相同)并且没溢出(那就不可能是负数),也就是被减数比减数大才跳转

指令名                :JNA
指令说明             :溢出或者计算结果相同则跳转, 也就是减法计算第1个数字不高于第2个数字的情况下(包括2个数字相同哟!)
实例:
 
MOV AX,1000HMOV BX,2000HCMP AX,BX ;CMP指令能虚拟一次减法运算.只改变标志寄存器.JA DaYu ;如果被减数比减数大就跳转(很显然跳转不了啊..)MOV BX,3000HDaYu:CMP BX,AXJA DaYu2 ;如果被减数比减数大就跳转(这回能跳了)MOV AX,1500HDaYu2:MOV AX,4C00H
顺带一提,有条件跳转指令和CMP可以隔开几行...只要中间没有会改变标志寄存器的指令(哪些指令会改标志寄存器请自行查询,一般只有计算指令才会改.)

作业:写篇代码,把所有判断指令用一次!
 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil5(MDK5)在调试(debug)过程中遇到的问题