控制转移类指令
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
控制转移类指令
✧用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令.
✧控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变
说明
✧只有中断返回指令(IRET)改变控制标志位
✧许多转移指令受状态标志位的影响
1.无条件转移指令(JMP 操作数;程序转向label标号指定的地址)
◆寻址方式:
直接寻址方式
转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式
间接寻址方式
转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式
◆目标地址范围
✓段内(注意转移范围是+ -,即前后都可以转移!当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负)
✡段内转移——近转移(near)
⏹转移范围用二个字节表达,在当前代码段64KB范围内转移(±32KB范围)
⏹不需要更改CS段地址,只要改变IP偏移地址,由16位带符号数给出。
✡段内转移——短转移(short)
⏹转移范围用一个字节表达,在当前代码段256B范围内转移(-128~+127范围),
只改变IP的值,由8位带符号数给出。
✓段间
段间转移——远转移(far)
从当前代码段跳转到另一个代码段,可以在1MB范围
需要更改CS段地址和IP偏移地址
目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址。段间间接转移指令中,目的地址存放在连续4个存储单元字节中,低字节两个单元的内容代替IP,高字节两个单元的内容代替CS。
注:实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移程序员可用操作符short、near ptr或far ptr强制.
✌思考:
如果转移超过16BIT,怎么办?
答:变成段间转移。
JMP 1234H 这个指令对否?JMP 12345678H呢?
2、条件转移指令(Jcclable;条件满足,发生转移:IP←IP+8位位移量;条件不满足,顺序执行)
注意:1.Jcc本身不是一条指令,它是条件转移指令的统称。
2.操作数label是采用短转移,条件转移只能是短转移。
3.8位位移量是相对于当前IP的,相对寻址方式。
4.Jcc指令为2个字节,条件不满足时的顺序执行,就是当前指令偏移指针IP加。
5.不影响标志,但要利用标。
16条指令分成4种情况:
⑴判断单个标志位状态
⑵比较无符号数高低
⑶比较有符号数大小
⑷判断计数器CX 为0
指令应用示例:
例1.计算|X -Y|(绝对值)
;X 和Y 为存放于X 单元和Y 单元的16位操作数
;结果存入result
movax,X
subax,Y
jnsno_neg neg ax ;neg 是求补指令
No_neg: movresult,ax
例2.设字符的ASCII 码在AL 寄存器中,在字符ASCII 码中为“1”的个数已为奇数时,则令其最高位为“0”;否则令最高位为“1”。
and al,7fh ;最高位置“0”,同时判断“1”的个数 jnp next
;个数已为奇数,则转向next
or al,80h ;否则,最高位置“1”
next: ...
例3.记录BX 中1的个数
方法一:xoral,al ;AL =0,CF =0
again: test bx,0ffffh ;等价于
cmp bx,0
jz next ; ZF=1,去next
shl bx,1
jnc again
inc al
jmp again
next: ... ;AL保存1的个数
方法二:xoral,al ;AL=0,CF=0
again: cmp bx,0
jz next
shl bx,1 ;也可使用shr bx,1 Array adc al,0
jmp again
next: ... ;AL保存1的个数
例4.无符号数比较高低
补充知识:
无符号数的大小用高(Above)低(Below)表示
利用CF确定高低、利用ZF标志确定相等(Equal)
两数的高低分成4种关系:
⑴低于(不高于等于):JB(JNAE)
⑵不低于(高于等于):JNB(JAE)
⑶低于等于(不高于):JBE(JNA)
⑷不低于等于(高于):JNBE(JA )
比较之前一定要做可以改变标志位的减法,才能通过标志位来确定两数的高低大小关系。
比较两数大小,并将较大的数保存在AX里。
cmpax,bx ;比较ax和bx
jnb next ;若ax≥bx,转移
xchgax,bx ;若ax<bx,交换
next: ...
例5.比较有符号数大小
有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)
两数的大小分成4种关系:
⑴小于(不大于等于):JL(JNGE)
⑵不小于(大于等于):JNL(JGE)
⑶小于等于(不大于):JLE(JNG)
⑷不小于等于(大于):JNLE(JG )
尝试将例4程序段改成有符号数比较大小。
答:即把JNB改成JNL.
3.循环指令(loop)
LOOP label ;CX←CX-1,
;CX≠0,循环到标号label, CX=0,顺序执行
LOOPZ label ;CX←CX-1,