第03章8控制转移指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JLE/JNG
(SF⊕OF)∨ZF=1
小于或等于/不大于
22
例:
数据段RESULT开始的30个单元中存放着某班30
个同学的某门课程的考试成绩。要求统计成绩在
80分以上的学生人数,将其存放在BL中。
23
¦ MOV AL,80 LEA DI,RESULT MOV CX,30 MOV BL,0 AGN:CMP AL,[DI] NEXT:INC DI DEC CX JNZ AGN HLT ;停机
段内直接近转移
段内间接转移
段间直接远转移
段间间接转移
5
(1)、段内直接短转移 格式: JMP SHORT 目的地址标号
;(IP)←当前(IP)+disp8
6
注意:
双字节指令,机器码: E8 KK
KK为disp8,带符号数的补码,范围-128~+127。
目的地址的偏移地址
=当前(IP)+disp8=跳转指令地址+2+disp8
JNC
CF=0
25
3)、判CX转移指令
助记符
JCXZ
转移条件
CX=0
既是一条转移指令,也可用来控制循环,但循
环控制条件与LOOP相反。
26
2、循环控制指令 三种:
计数器 循环次数
LOOP
LOOPE/LOOPZ LOOPNE/LOOPNZ
循环体
计数器
计数器-1
N
计数器=0? Y
图 4.7
循环结构示意图
9
next:
(2)、段内直接近转移 格式: JMP NEAR PTR 目的地址标号 ;(IP)←当前(IP)+disp16
10
注意:
三字节指令,机器码: E8 KK JJ
JJKK为disp16,带符号数补码,范围-32768~+32767
目的地址的偏移地址
=当前(IP)+disp16=跳转指令地址+3+disp16
助记符 转移条件
JA/JNBE
JAE/JNB/JNC JB/JNAE/JC JBE/JNA
CF∨ZF=0
CF=0 CF=1 CF∨ZF=1
高于/不低于等于
高于或等于/不低于/无进位 低于/不高于等于/有进位 低于或等于/不高于
两个带符号数比较的结果作为转移条件
助记符 JG/JNLE JGE/JNL JL/JNGE (SF⊕OF)∨ZF=0 SF⊕OF=0 SF⊕OF=1 转移条件 大于/不小于等于 大于或等于/不小于 小于/不大于等于
比较转移指令
判位转移指令 均采用相对短转移,即: (IP)←当前(IP)+disp8 转移范围:
从当前(IP)所指单元开始-128~+127。
20
1)、比较转移指令 根据前一条比较指令结果(对标志位 的影响)作测试条件。决定是否转移。 分为: 无符号数比较转移指令 带符号数比较转移指令。
21
无符号数比较的结果作为转移条件
段间转移:目标地址不在当前段内
属性为FAR
转移指令修改
(CS)和(IP)
2
直接转移和间接转移 直接转移:目标地址直接
出现在指令中
间接转移:目标地址间接存储
于寄存器或存储单元中
除中断指令,其它指令均不影响标志位 。
3
1、转移指令 两种:
JMP
JCC
无条件转移指令
条件转移指令
4
1)、JMP无条件转移指令 五种格式: 段内直接短转移
JMP
WORD PTR [BP][DI]
转移范围:当前段
14
(4)、段间直接转移 格式: JMP FAR PTR 目的地址标号 ;(IP)←目的地址标号的偏移地址 (CS)←目的地址标号的段地址
15
例:
¦ JMP FAR PTR NEXT ¦ NEXT : MOV AL,[SI] ¦
EA BC JMP指令 9A 78 56 1122H:1234H 目的地址的 偏移地址 目的地址的 段地址
(CS)←(EA+2)
40
例: CALL DWORD PTR [SI]
41
2)、
RET返回
RET返回指令有4种:
段内返回 段间返回
段内带立即数返回 放在子程序的末尾
段间带立即数返回
子程序执行完后返回调用程序继续执行。
42
(1)、段内返回:
格式:
RET;
机器码: C3H或者C2H 执行操作:(IP)←((SP)+1,(SP)) (SP)←(SP)+2
(IP)=3700H
……
RET
PRO-C ……
……
RET
45
4、中断和中断返回指令 以后学习
46
37
(3)、
格式:
段间直接调用
CALLHale Waihona Puke BaiduFAR PTR 子程序名
(SP)←(SP)-2
((SP)+1,(SP))←(CS)
(SP)←(SP)-2 ((SP)+1,(SP))←(IP) (IP)←入口偏移地址(指令第2,3字节 ) (CS)←DST段地址(指令中第4,5字节 )
38
例:
CSEG1 α:
(SP)=0100H
MAIN …… …… CALL far ptr PRO-A
(CS)=0500H (IP)=1000H
另一个代码段 PRO-A PRO-B …… …… CALL near ptr PRO-B CALL near ptr PRO-C (IP)=2500H (IP)=4000H …… …… CALL near ptr PRO-C RET
…
SEGMENT subp ;α处的CS:IP入栈;转subp … …
CALL FAR PTR
CSEG1 CSEG2
ENDS SEGMENT …
subp
PROC … RET
subp CSEG2
ENDP ENDS
39
(4)、段间间接调用:
格式:
CALL DWORD PTR OPR
(SP)←(SP)-2 ((SP+1),(SP))←(CS) (SP)←(SP)-2 ((SP+1),(SP))←(IP) (IP)←(EA)
NEXT
5678H:9ABCH
16
转移范围:整个存储器1M空间
17
(5)、段间间接转移 格式: JMP DWORD PTR OPR ;(IP)←OPR低16位 (CS)←OPR高16位
18
例: JMP DWORD PTR [BP][DI]
转移范围:整个存储器1M空间
19
2、条件转移指令 两种:
子程序调用和返回 调用: 返回: CALL RET
32
1)、
CALL调用
CALL调用指令有4种:
段内直接调用 段间直接调用
段内间接调用
段间间接调用
CALL指令出现在主程序中
33
(1)、
格式: CALL
段内直接调用
子程序名 ; (SP)←(SP)-2, ((SP)+1,(SP))←(IP)
; (IP) ← (IP)+D16
28
只允许段内直接短转移方式,跳转范围-128~127 都用CX作为循环计数器
29
MOV DX,0
LEA SI,DATA MOV CX,30 NEXT:ADD DL,BYTE PTR [SI] ADC DH,0 INC SI LOOP NEXT
MOV CL,30
MOV AX,DX
DIV CL
30
43
(2)、段间返回:
格式: RET;
机器码: CBH或CAH
执行操作: (IP)←((SP)+1,(SP))
(SP)←(SP)+2 (CS)←((SP)+1,(SP)) (SP)←(SP)+2
44
例:
主程序 MAIN在一个代码段中 子程序 PRO-A PRO-B PRO-C 在另一个代码段
程序调用关系:
JA NEXT
INC BL
24
2)、判位转移指令 根据当前某标志位的状态来决定是否进行转移
助记符 转移条 助记符 转移条件 件 ZF=1 JNZ/JNE ZF=0 SF=1 OF=1 PF=1 JNS JNO JNP/JPO SF=0 OF=0 PF=0
JZ/JE
JS JO JP/JPE
JC
CF=1
§ 3.4.5 控制转移指令(Control transfer instructions)
专用于控制程序执行流程。通过对(CS) 和(IP)的修改来改变程序执行的流程。
包括四种:
转移指令 循环控制指令 过程调用指令
中断指令
1
注意:
段内转移和段间转移 段内转移:目标地址在当前段内
属性为NEAR 转移指令修改(IP)
D8=50H=1050H-1000H
3000:1050H
OP 03H
(IP)=(IP)当前+D8
...
8
8位位移量D8的范围在(-128 ~ 127)之间,否则出错。
源程序 :
next : -128 条件转移指令:
+127
... ... ... ... JMP SHORT next ... ... ... ... MOV AL,03H
转移范围:从当前 IP 位置开始,向前128(减
80H)个字节,向后127(加7FH)个字节。
7
例: JMP SHORT NEXT
内存
... 源程序 : 条件转移指令:JMP SHORT next ... ... ... next: MOV AL,03H OP
(IP)当前 3000:1000H
50H ... ...
3、过程( 子程序 )调用指令 子程序—具有独立功能的独立程序模块。
子程序(过程)定义格式:
子程序名 PROC 类型
……
子程序名 子程序调用和返回 调用: CALL
31
ENDP
返回:
RET
过程与调用语句间的位置,有两类:
NEAR类:调用指令与过程在同一个段中
FAR类:调用指令与过程不在同一个段中
27
格式: LOOPxx 符号地址
执行操作 :
①(CX) ← (CX)- 1 此操作不影响标志 ② 检查转移条件xx,满足转向目标地址去执行; 不满足执行LOOPxx后一条指令
助记符
LOOP LOOPZ LOOPNZ
转移条件
CX≠0 CX≠0且ZF=1 CX≠0且ZF=0
不转移条件
CX=0 CX=0或ZF=0 CX=0或ZF=1
D16 — 机器指令中的位移量,目的地址和当 前(IP)地址之差
第一步,断点入栈保护 第二步,装入子程序入口地址
34
例: NEAR 类型过程
code SEGMENT … ;code段
CALL
XXX:YYY …
subp
; D16 =subp- XXX
…
subp
PROC NEAR … RET
;过程定义
11
转移范围:从当前IP位置开始,向前32768 (
减8000H)个字节,向后32767 (加7FFFH)个
字节。 但不超出本段。
12
(3)、段内间接转移 格式: JMP WORD PTR OPR
OPR —为16位寄存器、存储器
;(IP) (EA) 或(IP) (reg16)
13
例: JMP AX
;返回
subp
code
ENDP
35
ENDS
(2)、
格式:
段内间接调用:
CALL WORD PTR OPR ; (SP)←(SP)-2, ((SP)+1,(SP))←(IP)
;(IP)← OPR的值
OPR —为16位寄存器,或存储器
第一步,断点入栈保护 第二步,装入子程序入口地址(操作数的值)
36
例: CALL WORD PTR [SI] CALL BX