配色: 字号:
第3章_5 控制转移
2012-05-16 | 阅:  转:  |  分享 
  
课后作业3.42,3.44~3.48中断指令(4条)中断指令可以引起CPU中断,这种由指令引起的中断称为软中断中断指令与过程调用
指令有些类似,都是将断点地址先入栈,然后转移到子程序过程调用可以是NEAR或FAR,能直接或间接调用,而中断只能利用存储器间接
转移到它的服务程序,服务程序的入口地址从中断向量表获得过程调用只保护断点地址进栈,而中断指令还要保护标志寄存器进栈9、中断调
用指令INT格式:INTn功能:调用类型号为n的中断服务程序,n为0~255。操作: SP←SP-2
[SP]←FR ;PUSHF IF←0 ;CLI TF←0 SP←SP-2 [SP]←CS ;PUS
HCS SP←SP-2 [SP]←IP ;PUSHIP CS←(0000H:[n×4+2]) IP←(0
000H:[n×4])IPCSXXXXXXXXSPXXXXSPFR【例】INT21H ;调用类型号为21H的
中断服务程序11、溢出中断指令INTO格式:INTO功能:若OF=1则进入类型号为4的溢出中断服务程序
说明:相当于执行指令INT4H INTO指令一般放在算术运算指令之后,若运算结果使溢出标志OF=1,则执行INTO指令时
便会产生溢出中断,使程序转入类型号为4的溢出中断服务程序,否则不产生中断。【例】 ADD AL,BL INTO ;若ADD指令
运算结果有溢出(OF=1),则进入类型号为4的溢出中断服务程序10、中断指令INT3格式:INT3功能:
同INT03H12、中断返回指令IRET格式:IRET功能:从中断服务子程序中返回到主程序(原程
序)说明:IRET指令与RET指令相类似,都是使控制返回到主程序,但IRET指令除从栈中弹出两个字分别送IP、CS外,还弹出
第三个字送标志寄存器FR。IPCSXXXXXXXXSPSPXXXXCSFRFRIP第三章指令系
统三峡大学陈慈发0717-6394358,13972597617chcf0415@126.com128086CPU的
指令格式8086CPU的指令系统38086CPU的寻址方式指令系统指令分类数据传送指令算术运算指令逻辑运算与
移位指令串操作指令控制转移指令处理机控制指令程序控制指令用来控制程序的执行顺序,用于实现分支、循环、过程调用/返回
、中断调用/返回等程序结构CS:IP总是指向下一条即将执行的指令的地址,通过改变IP和CS的值,可以改变程序的执行顺序,但程序
中不能使用MOV指令直接改变CS和IP的值,只能通过程序控制指令实现段间转移段内转移同时改变CS和IP的值,又称远转移,目标
属性为FAR。可转移到1MB地址空间的任一位置只改变IP的值,不改变CS的值,又称近转移/短转移,目标属性为NEAR/SHORT
,只能在代码段内转移近转移短转移转移距离用1个字表达,转移范围为代码段内相对当前指令地址-32768~+32767,转移类型
为NEARPTR转移距离用1个字节表达,转移范围为代码段内相对当前指令地址-128~+127,转移类型为SHORT转移类型
实际编程时,汇编程序会根据目标地址的属性,自动处理成短转移、近转移或远转移。程序员可用操作符short、nearptr或
farptr强制成为需要的转移类型。直接转移:在转移指令中直接指明目标地址间接转移:转移的目标地址间接存储于某寄存器或
存储器单元中相对转移:把当前的IP值增加或减少某一个值,也就是以当前指令为中心往前或往后转移一个距离(位移量)绝对转移:以
新的值完全代替当前的IP值或CS:IP值所有段内直接转移都是相对转移所有段内间接转移都是绝对转移所有段间转移都是绝对转
移转移类指令的目标地址通常采用标号,由汇编程序自动计算目标地址无条件转移指令(3条)1、无条件转移指令JMP(JuMP)
格式:JMPd功能:程序无条件转移到目标地址d去执行说明:目标地址d常常用标号表示,标号是目标地址的符号表示
。有6种目标地址寻址方式。①段内直接转移(短转移):是相对转移,位移量在指令中占1个字节,转移范围不超过-128~+127字节
。格式: JMPSHORT标号 JMP标号(汇编程序自动计算转移距离生成短转移指令)操作: IP←IP+2±
位移量(8位)【例】 JMPSTART或JMPSHORTSTART ;IP←IP+2+START②段内直
接转移(近转移):是相对转移,位移量在指令中占2个字节,转移范围是段内任何地方(-32768~+32767)。格式: JMP
有效地址EA JMPNEARPTR标号 JMP标号(汇编程序自动计算转移距离生成近转移指令)操作: IP←I
P±位移量(16位)【例】 JMPSTART或JMPNEARPTRSTART;IP←IP±START JM
P2000H ;③段内间接转移(寄存器间接):是绝对转移,目标地址在16位的通用寄存器中,转移范围是段内任何地方(0~655
35)。格式: JMPr16操作: IP←r16【例】 JMPSI ;IP←SI④段内间接转移(存储器间接):
是绝对转移,目标地址在存储器中占2个字节,转移范围是段内任何地方(0~65535)。格式: JMPWORDPTR[mem
]操作: IP←[mem]16说明: 段寄存器搭配关系同寻址方式,即BP同SS搭配,其它均同DS搭配。【例】 JMPW
ORDPTR[1000H] ;IP←DS:[1000H] JMPWORDPTR[SI] ;IP←DS:[SI] JMP
WORDPTR[BP] ;IP←SS:[BP]⑤段间直接转移(远转移):是绝对转移,目标地址在指令中占4个字节(2字节I
P,2字节CS),转移范围是存储器任何地方。格式: JMP逻辑地址 JMPFARPTR标号操作: IP←目标地址
的2字节偏移地址,CS←目标地址的2字节段地址【例】 JMPFARPTRpnt ; JMP2000H:3000H
;CS←2000H,IP←3000H ⑥段间间接转移(存储器间接):是绝对转移,目标地址在存储器中占4个字节(2字节IP,2
字节CS),转移范围是存储器任何地方。格式: JMPDWORDPTR[mem]操作: IP←[mem]16,CS←[m
em+2]16说明: 段寄存器搭配关系同寻址方式,即BP同SS搭配,其它均同DS搭配。【例】 JMPDWORDPTR[
1000H];IP←DS:[1000H],CS←DS:[1002H] JMPDWORDPTR[SI] ;IP←DS:[S
I],CS←DS:[SI+2] JMPDWORDPTR[BP] ;IP←SS:[BP],CS←SS:[BP+2]2、子
程序(过程)调用指令CALL格式:CALLd功能:程序无条件转移到子程序(过程)地址d去执行并保护断点地址
说明:CALL指令与JMP指令不同点在于CALL指令包含了保护断点地址的操作,即将断点处的IP(段内调用)值或CS、IP(段间调
用)值压入堆栈(PUSHIP或PUSHCS;PUSHIP)。CALL指令应同子程序(过程)返回指令RET搭配使用。
CALL指令与JMP指令类似,也分为段内调用、段间调用、直接调用、间接调用、相对调用、绝对调用等5种调用地址寻址方
式,但没有短调用。系统设计中把同一代码段(CS)内调用的过程称为“近过程”,用NEAR表示;而把调用其他代码段(即段间)的过程称为
“远过程”,用FAR表示。调用的目标地址通常用“过程名”表示,是一种符号地址。①段内直接调用(近过程):是相对调用,位移量在指
令中占2个字节。格式: CALL有效地址EA CALLNEAR过程名 CALL过程名(过程名是已定义过的近过程
名)操作: SP←SP-2 [SP]←IP IP←有效地址EA或IP←IP±位移量(16位)说明: 只在堆栈
中保护IP,CS保持不变【例】 CALLNEARproc1 ;IP←IP+proc1 CALLproc2
;IP←IP+proc2 CALL1000H ;IP←1000HIPXXXXXXXXXXXXSPSP
②段内间接调用(寄存器间接):是绝对调用,子程序地址在16位的寄存器中。格式: JMPr16操作: SP←SP-2
[SP]←IP IP←r16说明: 只在堆栈中保护IP,CS保持不变【例】 CALLBX ;IP←BX CALL
SI ;IP←SIIPXXXXXXXXXXXXSPSP③段内间接调用(存储器间接):是绝对调用,子程序地址在存储器
中占2个字节。格式: CALLWORDPTR[mem]操作: SP←SP-2 [SP]←IP IP←[mem]16
说明: 只在堆栈中保护IP,CS保持不变。 段寄存器搭配关系同寻址方式,即BP同SS搭配,其它均同DS搭配。【例】 CAL
LWORDPTR[1000H] ;IP←DS:[1000H] CALLWORDPTR[SI] ;IP←DS:[SI
] CALLWORDPTR[BP] ;IP←SS:[BP]IPXXXXXXXXXXXXSPSP④段间直接
调用(远过程):是绝对调用,子程序地址在指令中占4个字节(2字节IP,2字节CS)。格式: CALL逻辑地址 CALL
FARPTR过程名 CALL过程名(过程名是已定义过的远过程名)操作: SP←SP-2 [SP]←CS SP←SP
-2 [SP]←IP IP←逻辑地址之偏移地址或子程序地址的2字节偏移地址 CS←逻辑地址之段地址或子程序地址的2字
节段地址说明: 在堆栈中先压入CS,再压入IP。【例】 CALLproc3 ; CALL1000H:2000H ;C
S←1000H,IP←2000H IPCSXXXXXXXXSPXXXXSP⑤段间间接调用(存储器间接):是绝对调
用,子程序地址在存储器中占4个字节(2字节IP,2字节CS)。格式: CALLDWORDPTR[mem]操作: SP←
SP-2 [SP]←CS SP←SP-2 [SP]←IP IP←[mem]16 CS←[mem+2]16说明: 在堆栈
中先压入CS,再压入IP。 段寄存器搭配关系同寻址方式,即BP同SS搭配,其它均同DS搭配。【例】 CALLproc3
; CALLDWORDPTR[2000H] ;IP←[2000H],CS←[2002H] IPCSXXXXXXX
XSPXXXXSP3、子程序(过程)返回指令RET(RETurn)格式: RET RETn功能:无
条件从子程序返回说明:返回指令RET执行与CALL指令相反的操作,RET指令安排在子程序中,实现从子程序返回到主程序断点处继
续执行。如果子程序被定义的是一个NEAR(段内)过程,则RET实现段内返回,即恢复断点时将栈顶的字内容弹出到IP,然后将SP
+2→SP;如果子程序被定义的是一个FAR(段间)过程,则RET实现段间返回,即再次将栈顶的字内容弹出到CS,并再次将SP+2→
SP。最后,检查RET指令中是否带有参数n(n可以是0~FFFFH中的任一偶数),如果没有,操作结束;如果有,则把这个n加到SP
中,以便丢弃一些在执行CALL指令前入栈的参数。段内(近过程)返回指令(与段内调用相呼应):RET ;IP←(S
P),SP←SP+2IPXXXXXXXXXXXXSPSPIP段间(远过程)返回指令(与段间调用相呼应):R
ET ;IP←(SP),SP←SP+2,CS←(SP),SP←SP+2IPCSXXXXXXXXSPSPIP
XXXXCS段间返回指令带参数:RETn;IP←(SP),SP←SP+2,CS←(SP),SP←SP+2,SP←S
P+nIPCSXXXX...SPSPIPXXXXCSSPXXXXXXXXn个字节条件转移指令(18条)
4、条件转移指令格式:J条件标号功能:若满足条件,则程序转移到标号地址去执行,否则继续执行下一条指令说
明:条件转移指令是以标志位的状态,或者是以标志位的逻辑运算结果作为转移依据的。如果满足转移条件,则程序转移到指定的目标地址,否则,
继续执行下一条指令。 条件转移都是短转移,转移距离只能在(-128~+127)内完成。简单转移:条件是由标志寄存器中的标志的状
态决定的转移。复杂转移:条件是由有符号数和无符号数比较大小决定的转移。A:Above 高于 N:Not 非、无B:Belo
w 低于 O:Overflow 溢出C:Carry 进位 S:Sign 符号E:Equal 等于 Z:Zero 零G:G
reat 大于 PE:ParityEven 偶校验L:Less 小于 PO:ParityOdd 奇校验条件字母简单转移
指令(10条)FRJC标号;CF=1有进位,则转移到标号所在地址JNC标号;CF=0无进位,则转移
到标号所在地址CFJZ/JE标号;ZF=1结果为零,则转移到标号所在地址JNZ/JNE标号;ZF=0结果为
非零,则转移到标号所在地址ZFJS标号;SF=1结果为负,则转移到标号所在地址JNS标号;SF=0结果
非负,则转移到标号所在地址SFJP标号;PF=1结果1的个数为偶数个,则转移JNP标号;PF=0结果
1的个数为奇数个,则转移PFJO标号;OF=1结果溢出,则转移到标号所在地址JNO标号;OF=0结果
未溢出,则转移到标号所在地址OF简单转移:条件是由标志寄存器中的标志的状态决定的转移。复杂转移指令(8条)复杂转移:条件是
由有符号数和无符号数比较大小决定的转移。无符号数转移指令:比较两个无符号数,并根据比较结果转移 JA 标号 ;两数比较,高于则
转移(JNBE) JNA 标号 ;两数比较,不高于则转移(JBE) JB 标号 ;两数比较,低于则转移(JNAE) JNB
标号 ;两数比较,不低于则转移(JAE)有符号数转移指令:比较两个有符号数,并根据比较结果转移 JG 标号 ;两数比较,大于则
转移(JNLE) JNG 标号 ;两数比较,不大于则转移(JLE) JL 标号 ;两数比较,小于则转移(JNGE) JNL
标号 ;两数比较,不小于则转移(JGE)循环控制指令(4条)循环控制指令用来控制程序段循环执行的次数,循环次数必须放在CX寄
存器中循环控制指令是段内短距离相对转移指令,转移距离为-128~+1275、循环指令LOOP格式:LOOP标
号功能:将CX←CX-1,若CX≠0则转到标号地址去执行,否则执行下一条指令说明:LOOP指令相当于下面两条指令的组合
: DEC CX JNZ 标号 但LOOP指令不影响标志位。 LOOP指令可以控制程序段无条件循环执行CX指定的次数,
通常放在循环体末尾。 MOV CX,100 ;指定循环100次AGAIN: ∶ ;循环体入口 ∶ ;循环体 LOOP
AGAIN ;CX←CX-1,若CX≠0则转到AGAIN ∶ ;循环结束6、循环指令LOOPZ/LOOPE格式:
LOOPZ/LOOPE标号功能:若ZF=1且CX-1→CX≠0则转到标号地址去执行,否则执行LOOPE后面的指令说
明:LOOPE指令需要同时满足两个条件才进行循环转移。注意指令中检测的ZF是前面指令影响的结果,不是本指令CX-1的结果 LO
OPE指令常用于在一个数据区中寻找内容与规定字符不相同的单元。 SUB DI,BX INC DI MOV CX,DI ;字节
数即循环次数送CX DEC BXNEXT: INC BX CMP BYTEPTR[BX],0 ;与0相比较 LOOPE
NEXT ;若ZF=1且CX-1→CX≠0则循环转到NEXT JNE FOUND ;若ZF=0,表示找到非0字节,转FOUND处理 ∶ ;ZF=1,未找到,作未找到处理FOUND:∶【例】要在某存储区中查找第一个非0字节,可用以下程序实现,假定该存储区首地址在BX中,末地址在DI中。7、循环指令LOOPNZ/LOOPNE格式:LOOPNZ/LOOPNE标号功能:若ZF=0且CX-1→CX≠0则转到标号地址去执行,否则执行LOOPNE后面的指令说明:该指令与LOOPZ指令仅ZF条件标志不同。 LOOPNE指令常用于在一个数据区中寻找内容与规定字符相同的单元。8、CX是0则转移指令JCXZ格式:JCXZ标号功能:若CX=0则转到标号地址去执行,否则执行JCXZ后面的指令说明:JCXZ指令与LOOP指令相比,都是根据CX的内容决定是否转移,但不同点是JCXZ指令不包含CX减1操作,另外转移条件是CX=0,而不是CX≠0。相当于: CMP CX,0 JZ 标号
献花(0)
+1
(本文系依米荷阳首藏)