微机原理与接口技术-第3章6 控制转移指令

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

JG JO JNS NONNEG:
TOO_HIGH: OVERFLOW: EXIT:
MOV AX, X CMP AX, 50
TOO_HIGH SUB AX, Y
OVERFLOW NONNEG NEG AX
MOV RESULT, AX ……
JMP EXIT …… JMP EXIT ……
MOV AX,4C00H INT 21H
例:、 是双精度数,分别存于 DX,AX 及 BX,CX 中, > 时转 X ,否则转Y
CMP JG JL CMP JA Y: ……
JMP
X: ……
EXIT: MOV INT
DX, BX X Y AX, CX X
EXIT
AX,4C00H 21H
循环结构
用转移指令实现循环结构:
AGAIN:
code2 segment subp proc far
…… ret subp endp code2 ends
段间调用和返回
1、CALL 调用指令
(1)段内直接近调用:CALL DST 执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP) (IP) ← (IP) + 16位位移量
当CPU响应一次中断时,也要和调用子程序时类似地把(IP)和 (CS)保存入栈。除此之外,为了能全面地保存现场信息,以便 在中断处理结束时返回现场,还需要把反映现场状态的(PSW) 保存入栈,然后才能转到中断例行程序去执行。当然从中断返回时, 除要恢复(IP)和(CS)外,还需要恢复(PSW)。
条件转移指令根据执行指令前标志位的状态而决定是否发 生控制转移的指令。
每一种条件转移指令有它的测试条件,满足测试条件则转 移到由指令指出的目标地址去执行那里的程序;如不满足条件 则顺序执行下一条指令。
条件转移指令只能使用段内直接短转移,即目标地址应在 本条转移指令下一条指令地址的-128—+127个字节的范围之内
MOV CX,N …… …… …… DEC CX JNZ AGAIN
3 循环指令:
LOOP OPR LOOPZ / LOOPE OPR LOOPNZ / LOOPNE OPR
执行步骤: (1) (CX) ← (CX) - 1 (2) 检查是否满足测试条件, 如满足则(IP) ← (IP) + 8位位移量,实行循环; 不满足则 IP 不变,退出循环。
LOOP AGAIN
DEC CX JNZ AGAIN
例:
例:求首地址为 ARRAY 的 M 个字之和,
结果存入 TOTAL
MOV MOV MOV AGAIN: ADD ADD LOOP MOV
CX, M AX, 0 SI, AX
AX, ARRAY[SI] SI, 2 AGAIN TOTAL, AX
无条件转移指令
无条件转移指令的格式及执行的操作:
段内直接短转移:JMP SHORT OPR 执行操作:(IP) ← (IP) + 8位位移量
段内直接近转移:JMP NEAR PTR OPR 执行操作:(IP) ← (IP) + 16位位移量
段内间接转移: JMP WORD PTR OPR 执行操作: (IP) ← (EA)
* TYPE (0~255) 是中断类型号, 隐含的类型号为3
(2)溢出中断指令:INTO
执行操作:
若OF=1,(SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (FLAGS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (CS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP) (IP) ← (10H) (CS) ← (12H)
SFOF = 0
≤ JLE (JNG) OPR (SFOF)∨ZF = 1
> JNLE (JG) OPR (SFOF)∨ZF = 0
(4) 测试 CX 的值为 0 则转移
格式 JCXZ OPR
测试条件 (CX)=0
例:如果 X>50,转到TOO_HIGH; 否则 |X-Y| → RESULT, 如果溢出转 到 OVERFLOW,
OPR
JNP
OPR
JC
OPR
JNC
OPR
ZF = 1 ZF = 0 SF = 1 SF = 0 OF = 1 OF = 0 PF = 1 PF = 0 CF = 1 CF = 0
(2) 比较两个无符号数,并根据比较结果转移*
格式 < JB (JNAE,JC) OPR
≥ JNB (JAE,JNC) OPR
即: 当满足条件时: (IP)←(IP)+符号扩展到16位后的位移量D8 如不满足测试条件: 则(IP)不变。
另外, 所有的条件转移指令都不影响条件标志位。
(1) 根据单个条件标志的设置情况转移
格式
测试条件
JZ(JE) OPR
JNZ(JNE) OPR
JS
OPR
JNS
OPR
JO
OPR
JNO
OPR
JP
中断的过程
主程序
中断服务程序
中断请求
断点
IRET
中断请求可以来自处理器外部的中断源, 也可以由处理器执行指令引起: 例如执行INT i8指令。
(1)中断指令:
INT TYPE 或 INT 执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (FLAGS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (CS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP) (IP) ← (TYPE*4) (CS) ← (TYPE*4+2) INT指令设置IF和TF标志为0,不影响其它标志位
( (SP)+1,(SP) ) ← (CS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP) (IP) ← 偏移地址 (CS) ← 段地址
(4)段间间接远调用:CALL DST 执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (CS) (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP) (IP) ← (EA) (CS) ← (EA+2)
(SP) ← (SP) + 2 (CS) ← ( (SP)+1,(SP) ) (SP) ← (SP) + 2
(4)段间带立即数远返回:RET EXP 执行操作: (IP) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2 (CS) ← ( (SP)+1,(SP) ) (SP) ← (SP) + 2 (SP)←(SP)+D16
4 过程调用和返回指令
子程序结构相当于高级语言中的过程(procedure)。为便 于模块化程序设计,往往把程序中某些具有独立功能的部分编 写成独立的程序模块,称之为子程序。
程序中可由调用程序(或称主程序)调用这些子程序, 而在子程序执行完后又返回调用程序继续执行。
主程序调用子程序时使用CALL指令,由子程序返回主程 序时使用RET指令。由于调用程序和子程序可以在同一个代码 段中,也可以在不同的代码段中,因此,CALL指令和RET指 令也有近调用、近返回及远调用、远返回两类格式。
3.2.5 控制转移指令:
无条件转移指令
JMP
条件转移指令
JZ / JNZ 、 JE / JNE、 JS / JNS、 JO / JNO、 JP / JNP、 JB / JNB、 JL / JNL、 JBE / JNBE、 JLE / JNLE、 JCXZ
循环指令
LOOP、LOOPZ / LOOPE、LOOPNZ / LOOPNE
子程序调用和返回指令
CALL、RET
中断与中断返回指令
INT、INTO、IRET
1 无条件转移指令
JMP 跳转指令
无条件地转移到指令指定的地址去执行从该地址开 始的指令。可以看出JMP指令必须指定转移的目标地址 (或称转向地址)。
总的说来,转移可以分成两类:段内转移和段间转 移。段内转移是指在同一代码段的范围之内进行转移,此 时只需改变IP寄存器的内容,即用新的转移目标地址代替 原有的IP的值就可达到转移的目的。段间转移则是要转到 另一个代码段去执行程序,此时不仅要修改IP寄存器的内 容,还需要修改CS寄存器的内容才能达到目的,因此, 此时的转移目标地址应由新的段地址和偏移地址两部分组 成。
(2)段内间接近调用:CALL DST 执行操作: (SP) ← (SP) - 2
( (SP)+1,(SP) ) ← (IP) (IP) ← (EA) 其中EA是由DST的寻址方式所确定的有效地址。
1、CALL 调用指令
(3)段间直接远调用:CALL DST 执行操作: (SP) ← (SP) - 2
注意: * IRET 指令执行完,标志位由堆栈中取 出的值确定
≤ JBE (JNA)
OPR
> JNBE (JA)
OPR
测试条件 CF = 1 CF = 0 CF∨ZF = 1 CF∨ZF = 0
* 适用于地址或双精度数低位字的比较
(3) 比较两个带符号数,并根据比较结果转移
格式 < JL (JNGE) OPR
测试条件 SFOF = 1
≥ JNL (JGE) OPR
循环指令
注意: * CX 中存放循环次数 *只能使用段内直接寻址的8 位位移量 * 不影响条件标志位
循环指令:
循环指令:LOOP OPR 测试条件:(CX) 0
为零或相等时循环指令:LOOPZ(LOOPE) OPR 测试条件:ZF=1 且 (CX) 0
不为零或不相等时循环指令:LOOPNZ(LOOPNE) OPR 测试条件:ZF=0 且 (CX) 0
无条件转移指令
段间直接远转移:JMP FAR PTR OPR(例) 执行操作:(IP) ← OPR 的段内偏移地址
(CS) ← OPR 所在段的段地址
段间间接转移: 执行操作:
JMP DWORD PTR OPR
(IP) ← (EA) (CS) ← (EA+2)
说明: JMP指令不影响条件标志位。
2 条件转移指令
INTO指令设置IF和TF标志为0,不影响其它标志位
(3)从中断返回指令:IRET
执行操作: (IP) ← ( (SP)+1,(SP) ) (SP) ← (SP) + 2 (CS) ← ( (SP)+1,(SP) ) (SP) ← (SP) + 2 (FLAGS) ← ( (SP)+1,(SP) ) (SP) ← (SP) + 2
子程序调用和返回指令:
code segment main proc far
…… call subp …… ret main endp
subp proc near …… ret
subp endp code ends
段内调用和返回
code1 segment main proc far
…… call far ptr subp …… ret main endp code1 ends
2、RET 返回指令
(1)段内近返回:RET 执行操作: (IP) ← ( (SP)+1,(SP) )
(SP) ← (SP) + 2
(2)段内带立即数近来自百度文库回:RET EXP 执行的操作:(IP)←((SP)+1,(SP))
(SP)←(SP)+2 (SP)←(SP)+D16
2、RET 返回指令
(3)段间远返回:RET 执行操作: (IP) ← ( (SP)+1,(SP) )
CALL指令和RET指令都不影响条件码。
5 中断指令
有时当系统运行或者程序运行期间在遇到某些特殊情况时,需要计 算机自动执行一组专门的例行程序来进行处理。这种情况称为中断 (Interrupt),所执行的这组程序称为中断例行程序(Interrupt routine)或中断子程序。中断分为内部中断和外部中断两类。内部 中断(软件中断)包括象除法运算中遇到需要除以0时所产生的中断, 或者程序中为了作某些处理而设置的中断指令等。外部中断(硬件 中断)则主要处理I/O设备与CPU之间的通信。
相关文档
最新文档