3.5 控制转移指令

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.6 控制转移类指令
1、无条件转移指令 2、条件转移指令 3、循环控制指令 4、调用和返回指令
5
用于实现分支转移、循环控制、过程调用等
常用指令 重点掌握:JMP/Jcc/LOOP CALL/RET 一般了解: INT n/IRET INTO LOOPZ / LOOPNZ
控制转移类指令通过改变IP(和CS) 值,实现程序执行顺序的改变
lea si , X
lea di , Y mov ax , [si] sub ax , [di] jns next neg ax ;neg是求补指令:0-ax mov result , ax
BCD码:二进制编码的十进制数
BCD码是十进制数,而运算器对数据做加减运 算时,都是按二进制运算规则进行处理的(四位 二进制相加逢十六进一),而实际上是两个十进 制数相加,应该逢十进一.因此采用BCD码后,在 两数相加的和小于或等于9时,十进制运算的结 果是正确的;当大于9时,结果不正确,必须加6修 正后才能得出正确的结果.
MOV BL,AH ;AH→BL
SHL AX,CL ;AX逻辑左移4位,相当于AX低4位
;清零,AX = ×××0H
SHR BL,CL ;BL逻辑右移4位,相当于AH=0×H
OR DL,BL
;现DL的高4位是原来DL的低4位,
;现DL的低4位是原AH的高4位
所以,完成将DX,AX组成的双字逻辑左移4位。
BBB: CCC:
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,则交换
例:X>50,转到TOO_HIGH; 计算X-Y: 溢出转到OVERFLOW, 否则 |X-Y|→RESULT
again: next:
xor al , al
;AL=0,CF=0
test bx , 0ffffh ;等价于 cmp bx , 0
jz next
;若bx=0,转到next
shl bx , 1
;否则,bx逻辑左移1位
jnc again
;CF=0,转到again
inc al jmp again
;CF=1,al加1 ;无条件转到again
Βιβλιοθήκη Baidu
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执行
30
举例:比较AL、BL、CL中带符号数的大小,将 最小数放在AL中。
12
相对寻址方式
Jcc指令的操作数label是一个标号
条件转移指令的目的地址必须在现行的代码段内 一个8位位移量,表示Jcc指令后的那条指令的偏移 地址,到目标指令的偏移地址的地址位移 8位位移量是相对于当前IP的,且距当前IP地址- 128~+127个单元的范围之内,属于段内短距离转 移
Jcc指令为2个字节,条件不满足时的顺序执 行就是当前指令偏移指针IP加2
23
(3)比较有符号数大小
有符号数的大小用 大(Greater)小(Less)表示
利用ZF标志确定相等(Equal) 两数的大小分成4种关系:
⑴ 小于(不大于等于):JL(JNGE) ⑵ 不小于(大于等于):JNL(JGE) ⑶ 小于等于(不大于):JLE(JNG) ⑷ 不小于等于(大于):JNLE(JG )
OF=1 OF=0
15
例:JZ/JNZ指令
test al,80h ;测试AL的最高位 jz next1 ;D7=0(ZF=1),转移 mov ah,0ffh ;D7=1,顺序执行 jmp done ;无条件转向 next1: mov ah,0 done: ...
test al,80h ;测试最高位
结果为零转移 结果不为零转移
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
LOOP label ;CX←CX-1, ;CX≠0,循环到标号label
LOOPZ label ;CX←CX-1, ;CX≠0且ZF=1,循环到标号label
将操作数乘以2的CL次。 将补码数除以2的CL次。 将操作数的高低4位或8位 (字节)数据相交换。
保存其它指令移入CF的值
2
例题
1、以下指令序列,请问实现了什么功能?
MOV AL,08H ;08H → AL
SAL AL,1
;AL算术左移一位,AL=10H,
;相当于AL×2
MOV BL,AL MOV CL,2 SAL AL,CL
┊ HELLO:MOV AL,3

JMP指令 HELLO
代码段 E8 08
B0 03
0100H 0101H 0102H
位移量
010AH 010BH
10
段间直接转移
C1 SEGMENT
JMP指令

JMP FAR PTR NEXT_PROG
C1 ENDS
C1段
EA 50 02 00 20
新(IP)=0250H 新(CS)=2000H
24
Jcc M,N
MN < (¬ >=) <= (¬>) > (¬<=) >= (¬<) = ≠
无符号数(A,B) 有符号数(G,L)
JB(JNAE) JL(JNGE)
JBE(JNA)
JLE(JNG)
JA(JNBE)
JG(JNLE)
JNB(JAE) JNL(JGE)
JE/JZ
JNE/JNZ
25
例:比较无符号数
next:
cmp ax , bx ;比较ax和bx jnb next ;若ax≥bx,转移 xchg ax , bx ;若ax<bx,交换
...
结果:AX保存较大的无符号数
26
例:比较有符号数
next:
cmp ax,bx ;比较ax和bx jnl next ;若ax≥bx,转移 xchg ax,bx;若ax<bx,交换
(57.2)10=(01010111.0010)BCD
18
例:JO/JNO指令
;X和Y为存放于X单元和Y单元的字操作数
;计算X-Y ;若溢出,则转移到overflow处理
lea si , X lea di , Y mov ax , [si] sub ax , [di] jo overflow
... ;无溢出,结果正确 overflow: ... ;有溢出,出错处理
C2段 20000H
C2 SEGMENT … NEXT_PROG ADD AL,BL
C2 ENDS
NEXT_PROG
20250H
11
2. 条件转移指令
格式: Jcc label 功能:能够对一个或几个状态位进行测试,判 断是否满足转移条件条件满足,转移到目的 地址label去执行;条件不满足,顺序执行下 一条指令,不影响标志位。
例:JC/JNC指令
;记录BX中1的个数——方法1
xor al , al ;AL=0,CF=0
again: cmp bx , 0
jz next
shl bx , 1 ;也可使用 shr bx , 1
ADC al , 0 ;AL=AL+(CF)
jmp again
next: ...
;AL保存1的个数
记录BX中“1”的个数——方法2
jnz next2 ;D7=1(ZF=0),转移
mov ah,0 ;D7=0,顺序执行
jmp done ;无条件转向
next2: mov ah,0ffh
done: ...
例:JS/JNS指令
;X和Y为存放于X单元和Y单元的16位操作数
;计算|X-Y|(绝对值) ;结果存入result单元
next:
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: …
3. 循环指令(loop)
JCXZ label ;CX=0,转移到标号label
BX=54B7H
0101 0100 1011 0111
AX=0A1FH 0000 1010 0001 1111
所以,CF = 1 ,OF = 0
第二条:JNO L1 ;OF=0,满足条件,转去L1执行
29
② AX = 42C8H,BX = 608DH
解:
第一条:ADD AX, BX
AX=42C8H
复习
1、逻辑运算指令: AND OR XOR NOT TEST
2、移位指令:
移位指令小结
指令 逻辑左移指令SHL 逻辑右移指令SHR 算术左移指令SAL 算术右移指令SAR 循环左移指令ROL 循环右移指令ROR 带进位位循环左移指令RCL 带进位位循环右移指令RCR
主要作用 将操作数乘以2的CL次。 将操作数除以2的CL次。
...
结果:AX保存较大的有符号数
27
例、分析下列程序段,程序如何执行?
ADD AX, BX JNO L1 JNC L2 L1: SUB AX, BX L2: JMP SHORT L5
28
① AX = B568H,BX = 54B7H
解: 第一条:ADD AX, BX
AX=B568H
1011 0101 0110 1000
例:JP/JNP指令
;设字符的ASCII码在AL寄存器中
;若该字符ASCII码中为“1”的个数已为奇数时 则令其最高位为“0”;否则令最高位为“1”
;将字符加上奇校验位

next:
and al,7fh ;最高位先置“0”,并判断“1”的个
jnp next ;个数已为奇数,则转向next
or al,80h ;否则,最高位置“1” ...
j…m…p again again: dec cx
…… j…m…p output output: mov bl,al
;转向again处继续执行 ;标号again的指令 ;转向output ;标号output的指令
jmp 0120H ;直接转向CS:0120H单元
9
段内直接短转移
┊ JMP SHORT HELLO
13
Jcc指令的分类
Jcc指令不影响标志,但要利用标志 位。根据利用的标志位不同,16条指 令分成3种情况:
(1)判断单个标志位状态 (2)比较无符号数高低 (3)比较有符号数大小
14
(1)判断单个标志位状态
条件转移指令
功能
JS dst JNS dst
结果为负数转移 结果为正数转移
JZ dst JNZ dst
6
1 无条件转移指令
指令格式: JMP label ;程序无条件转向label标号指定的地址
指令功能:使程序转到指定的目标地址处,并从该 处开始继续执行,操作数label是要转移到的目标地 址(目的地址、转移地址)执行JMP
⑴ 段内转移、直接寻址;⑵ 段内转移、间接寻址
⑶ 段间转移、直接寻址;⑷ 段间转移、间接寻址
① JMP SHORT HELLO ;转移到目标地址是HELLO
; IP→IP+8位位移量
② JMP NEAR PTR ABC ;转移到目标地址ABC,
;IP被修改了,IP→IP+16位位移量 7
段内转移、直接寻址 实际为相对寻址
JMP label
;IP←IP+位移量
位移量是紧接着JMP指令后的那条指令的偏移地址到 目标指令的偏移地址的地址位移
ADD AL,BL
;AL → BL ;2 → CL ;AL算术再左移两位,AL=40H, ;相当于AL×4
;AL + BL→AL
整个过程相当于AL×10,AL = 50H
3
试分析下面的程序段完成什么功能?
MOV CL,04H ;04H→ CL SHL DX,CL ;DX逻辑左移4位,相当于DX
;低4位清零,DX = ×××0H
...
;AL保存1的个数
22
(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
相关文档
最新文档