3.8 控制转移指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
13
2. 条件转移指令
格式: Jcc label 功能:条件满足,转移到目的地址label 去执行;条件不满足,顺序执行下一条指令, 不影响标志位。
14
Jcc指令的分类
Jcc指令不影响标志,但要利用标志
位。根据利用的标志位不同,16条指 令分成3种情况: (1)判断单个标志位状态
(2)比较无符号数高低 (3)比较有符号数大小
17
例:JZ/JNZ指令
test al,80h jz next1 mov ah,0ffh jmp done mov ah,0 ... ;测试AL的最高位 ;D7=0(ZF=1),转移 ;D7=1,顺序执行 ;无条件转向
next1: done:
test al,80h ;测试最高位 jnz next2 ;D7=1(ZF=0),转移
以上3种转移方式均为段内转移,指令执行时,用指令 提供的信息修改指令指针IP的内容,CS的值不变。
11
(4)段间直接转移
格式及操作:
JMP FAR PTR Label ;IP←目标标号的偏移地址, ; CS←目标标号所在段的段基址 FAR PTR为属性运算符,表示转移是在段间进行。目标 标号在其他代码段中,指令中直接给出目标标号的段基 址和偏移地址,分别取代当前IP及CS的值,从而转移 到另一代码段中相应的位置去执行(同理,FAR PTR在 指令中也可不写出来)。
⑶ 段间转移、直接寻址;⑷ 段间转移、间接寻址
① JMP SHORT HELLO ;转移到目标地址是
;HELLO,IP被修改了 ② JMP [NEAR PTR] ABC ;转移到目标地址ABC, ;IP被修改了
6
1 无条件转移指令
无条件转移指令包括:JMP、子程序的调用和 返回指令、中断的调用和返回指令等。下面只 介绍无条件转移指令JMP。 JMP指令可以将程序从当前执行的地方无条件 转移到另一个地方执行。转移的范围分为短 (short)转移(偏移量在[-128,127]范围内), 近(near)转移(偏移量在[-32K,32K]范围内) 或远(far)转移(在不同的代码段之间转移)。
例:JP/JNP指令
;设字符的ASCII码在AL寄存器中
;若该字符ASCII码中为“1”的个数已为奇数时 ; 则令其最高位为“0”;否则令最高位为“1” ;将字符加上奇校验位
数
and al,7fh ;最高位先置“0”,并判断“1”的个
jnp next ;个数已为奇数,则转向next or al,80h ;否则,最高位置“1” next: ...
结果:AX保存较大的有符号数
next:
28
例、分析下列程序段,程序如何执行? ADD AX, BX JNO L1 JNC L2 L1: SUB AX, BX L2: JMP SHORT L5
29
① AX = B568H,BX = 54B7H
解: 第一条:ADD AX, BX
AX=B568H
BX=54B7H
Fra Baidu bibliotek
例:JC/JNC指令
;记录BX中1的个数——方法1
xor al , al again: cmp bx , 0 jz next shl bx , 1 ADC al , 0 jmp again next: ...
;AL=0,CF=0
;也可使用 shr bx , 1 ;AL=AL+(CF) ;AL保存1的个数
BBB:
CCC:
例:X>50,转到TOO_HIGH; 计算X-Y: 溢出转到OVERFLOW, 否则 |X-Y|→RESULT
MOV AX, X CMP AX, 50 JG TOO_HIGH SUB AX, Y JO OVERFLOW JNS NONNEG NEG AX NONNEG: MOV RESULT, AX TOO_HIGH: … OVERFLOW: …
25
Jcc M,N
M N < (¬ >=) <= (¬>) > (¬<=) >= (¬<) = ≠
无符号数(A,B) 有符号数(G,L)
JB(JNAE) JL(JNGE) JBE(JNA) JLE(JNG) JA(JNBE) JG(JNLE) JNB(JAE) JNL(JGE) JE/JZ JNE/JNZ
复习
1、逻辑运算指令: AND OR XOR NOT TEST 2、移位指令:
移位指令小结
指 令 逻辑左移指令SHL 逻辑右移指令SHR 算术左移指令SAL 算术右移指令SAR 循环左移指令ROL 循环右移指令ROR 带进位位循环左移指令RCL 带进位位循环右移指令RCR 主要作用 将操作数乘以2的CL次。 将操作数除以2的CL次。
next:
例:JO/JNO指令
;X和Y为存放于X单元和Y单元的字操作数 ;计算X-Y ;若溢出,则转移到overflow处理 lea si , X lea di , Y mov ax , [si] sub ax , [di] jo overflow ... ;无溢出,结果正确 overflow: ... ;有溢出,出错处理
基本相同(同理,属性运算符NEAR PTR在指 令中可以省略)。
10
(3)段内间接转移
格式及操作:
JMP WORD PTR OPD ;IP←(EA)
该指令将转移的目标地址预先存放在某寄存器或存储器 的两个连续单元中,指令中只需给出该寄存器号或存储 单元地址,OPD可为存储器或寄存器操作数。OPD为 寄存器时,不加WORD PTR。
12
(5)段间间接转移
格式及操作: JMP DWORD PTR OPD
;IP←(EA),CS←(EA+2)
该转移指令的执行不影响任何标志位。 指令中由操作数OPD的寻址方式确定一个有效地址EA,指向存放 转移地址的偏移地址和段基址的单元,根据寻址方式求出EA后, 访问相邻的4B单元,低位字单元的16位数据送到IP寄存器,高位 字单元中的16位数据送到CS寄存器,得到要转移去的目标地址, 实现段间间接转移的目的。其中, OPR只能是存储器操作数。例如: JMP DWORD PTR LPA[BP][DI]
将操作数乘以2的CL次。 将补码数除以2的CL次。 将操作数的高低4位或8位 (字节)数据相交换。 保存其它指令移入CF的值
2
试分析下面的程序段完成什么功能? MOV CL,04H ;04H→ CL ;DX逻辑左移4位,相当于DX SHL DX,CL ;低4位清零,DX = ×××0H MOV BL,AH SHL AX,CL SHR BL,CL OR DL,BL ;AH→BL ;AX逻辑左移4位,相当于AX低4位 ;清零,AX = ×××0H ;BL逻辑右移4位,相当于AH=0×H ;现DL的高4位是原来DL的低4位, ;现DL的低4位是原AH的高4位
所以,完成将DX,AX组成的双字逻辑左移4位。
3.8 控制转移类指令
1、无条件转移指令 2、条件转移指令 3、循环控制指令 4、中断指令
4
用于实现分支、循环、过程等程序结构 常用指令 重点掌握:JMP/Jcc/LOOP CALL/RET 一般了解: INT n/IRET INTO LOOPZ / LOOPNZ
26
例:比较无符号数
cmp ax , bx ;比较ax和bx jnb next ;若ax≥bx,转移 xchg ax , bx ;若ax<bx,交换 ...
结果:AX保存较大的无符号数
next:
27
例:比较有符号数
cmp ax,bx ;比较ax和bx jnl next ;若ax≥bx,转移 xchg ax,bx ;若ax<bx,交换 ...
1011 0101 0110 1000
0101 0100 1011 0111
AX=0A1FH
0000 1010 0001 1111
所以,CF = 1 ,OF = 0 第二条:JNO L1 ;OF=0,满足条件,转去L1执行
30
② AX = 42C8H,BX = 608DH
解: 第一条:ADD AX, BX AX=42C8H 0100 0010 1100 1000 BX=608DH 0110 0000 1000 1101 AX=A355H 1010 0011 0101 0101 所以,CF = 0,OF = 1 第二条:JNO L1 ;OF=1,不满足条件,顺序执行 第三条:JNC L2 ;CF=0,满足条件,转去L2执行
记录BX中“1”的个数——方法2
xor al , al
again:
;AL=0,CF=0 test bx , 0ffffh ;等价于 cmp bx , 0 ;若bx=0,转到next jz next
shl bx , 1
jnc again inc al jmp again next: ...
;否则,bx逻辑左移1位
24
(3)比较有符号数大小
有符号数的大小用 大(Greater)小(Less)表示 利用ZF标志确定相等(Equal)
两数的大小分成4种关系: ⑴ 小于(不大于等于):JL(JNGE) ⑵ 不小于(大于等于):JNL(JGE) ⑶ 小于等于(不大于):JLE(JNG) ⑷ 不小于等于(大于):JNLE(JG )
16
(1)判断单个标志位状态
条件转移指令 功 能 JS dst 结果为负数转移 JNS dst 结果为正数转移 JZ dst JNZ dst JP dst JNP dst JC dst JNC dst JO dst JNO dst 结果为零转移 结果不为零转移 奇偶校验结果为偶转移 奇偶校验结果为奇转移 结果有进位(借位)转移 结果无进位(借位)转移 结果溢出转移 结果不溢出转移 转移条件 SF=1 SF=0 ZF=1 ZF=0 PF=1 PF=0 CF=1 CF=0 OF=1 OF=0
31
举例:比较AL、BL、CL中带符号数的大小,将 最小数放在AL中。 CMP AL,BL JNG BBB XCHG AL,BL CMP AL,CL JNG CCC XCHG AL,CL HLT
;AL和BL比较
;若AL≤BL,则转 ;若AL>BL,则交换 ;AL和CL比较 ;若AL≤CL,则转 ;若AL>CL,则交换
mov ah,0
jmp done next2: done: mov ah,0ffh ...
;D7=0,顺序执行
;无条件转向
例:JS/JNS指令
X和Y为存放于X单元和Y单元的16位操作数
计算|X-Y|(绝对值) 结果存入result单元 lea si , X lea di , Y mov ax , [si] sub ax , [di] jns next neg ax ;neg是求补指令:0-ax mov result , ax
7
1 无条件转移指令(续)
短转移和近转移属于段内转移,JMP指令只把 目标指令位置的偏移量赋值给指令指针寄存器 IP,从而实现转移功能。而远转移是段间转移, JMP指令不仅会改变指令指针寄存器 IP的值, 还会改变代码段寄存器CS的值。 根据转移目标地址的位置与寻址方式的不同, 有5种基本指令格式。
控制转移类指令通过改变 IP (和 CS ) 值,实现程序执行顺序的改变
5
1 无条件转移指令
指令格式: JMP label ;程序转向label标号指定的地址 指令功能:使程序转到指定的目标地址处,并从该 处开始继续执行,操作数label是要转移到的目标地 址(目的地址、转移地址)执行JMP ⑴ 段内转移、直接寻址;⑵ 段内转移、间接寻址
;CF=0,转到again
;CF=1,al加1
;无条件转到again ;AL保存1的个数
23
(2)比较无符号数高低
无符号数的大小用 高(Above)、低(Below) 表示,利用CF确定高低 利用ZF标志确定相等(Equal )
两数的高低分成: 1) 低于(不高于等于):JB(JNAE/JC) 2) 不低于(高于等于):JNB(JAE/JNC) 3) 低于等于(不高于):JBE(JNA) 4) 不低于等于(高于):JNBE(JA ) 5) 相等(等于零):JE/JZ 6) 不相等(不等于零):JNE/JNZ
8
(2)段内直接近程转移
格式及操作:
JMP NEAR PTR Label ;IP←IP+D16
其中,NEAR PTR为近程转移的属性操作符。段内直 接近程转移指令控制转移的目标地址由当前 IP 值与指令 代码中16 位偏移量之和决定,偏移量的取值范围为- 32768~+32767。转移的过程和短程转移过程