130 likes | 276 Views
五、控制转移类指令. 能够使程序的执行流程发生改变的指令。共有以下四类指令: 1. 无条件转移 ---JMP 转移地址 2. 条件转移 ---JCC 转移地址 3. 循环 —loop , loope,loopne 等 4. 子程序调用 ---call, ret. 1. 无条件转移 JMP 转移指令 操作:有以下几种类型 ⑴ 段内直接短转移 JMP SHORT opr ;(IP)←(IP) + Data8 Data8 是一个字节的补码数 范围:- 128 ~ +127. ⑵ 段内直接近转移 JMP NEAR PTR opr
E N D
五、控制转移类指令 能够使程序的执行流程发生改变的指令。共有以下四类指令: 1.无条件转移 ---JMP 转移地址 2.条件转移 ---JCC 转移地址 3.循环—loop,loope,loopne等 4.子程序调用---call, ret
1.无条件转移 JMP 转移指令 操作:有以下几种类型 ⑴ 段内直接短转移 JMP SHORT opr;(IP)←(IP) + Data8 Data8是一个字节的补码数 范围:-128~+127
⑵ 段内直接近转移 JMP NEAR PTR opr (IP)←(IP) + Data16 Data16是两个字节的补码数 范围:-32768~+32767 ⑶ 段内间接转移 JMP WORD PTR opr (IP)←寄存器或存储器操作数 ⑷ 段间直接转移 JMP FAR PTR opr 指令中用立即数的形式指出目标位置的段地址和偏移量
⑸ 段间间接转移 JMP DWORD PTR opr 目标位置的段地址和偏移量保存在存储器中 说明: ① 在汇编语言中通常使用标号表示要转移到的位置。 ② 在DEBUG环境中通常使用直接指出的是将要转移到的位置。 ③ 使用该指令,可以使程序流程改变到任何目标位置。
2.条件转移 根据判断条件是否成立决定是否转移。按照判断条件的不同分为以下类型:单个标志、无符号数判断、有符号数判断、CX寄存器。 条件转移都是段内直接短转移,即(IP)<=(IP)+Data8类型的转移。 ⑴ 判断单个标志 ZF: JZ(JE), JNZ(JNE) SF: JS, JNS OF: JO, JNO PF: JP, JNP CF: JC, JNC
⑵ 判断无符号数的大小 助记符中的意义: A:大于,B:小于,E:等于 JB(JNAE),JNB(JAE)同JC,JNC, JBE(JNA),JNBE(JA):判断CF and ZF ⑶ 判断有符号数的大小 助记符中的意义: G:大于,L:小于,E:等于 JL(JNGE): SF xor OF = 1 JNL(JGE): SF xor OF = 0 JLE(JNG):(SF xor OF) and ZF = 1 JNLE(JG):(SF xor OF) and ZF = 0 使用比较大小的指令时,必须区分是 有符号数还是无符号数。
⑷ 判断CX寄存器 JCXZ: CX=0 3.循环 循环指令的转移也都是段内直接短转移,即(IP)←(IP)+Data8类型的转移。 LOOP循环 判断CX是否等于零,不等于零则循环 LOOPZ(LOOPE)当为零或相等时循环 判断CX是否等于零,不等于零且ZF=1则循环 LOOPNZ(LOOPNE)当不为零或不相等时循环 判断CX是否等于零,不等于零且ZF=0则循环
操作: ① CX ←CX-1 ② 根据判断结果确定是否循环 说明: ① 循环指令不影响状态标志。 ② 如果目标位置的位移量超出Data8所能够表示的范围,则需要用JMP辅助来完成循环。
4.子程序调用 CALL 子程序调用指令 用法:CALL dst 说明:由编译程序自动匹配为某种寻址方式 RET 子程序返回指令 用法:RET 段内返回:IP ←[SP], SP ←SP + 2 段间返回:IP ←[SP], SP ←SP + 2, CS ←[SP], SP ←SP + 2 编译程序自动匹配为段内或段间的返回
RET Data16 在RET的基础上,把SP再加上一个字数据: SP ←SP + Data16 Li416.asm Li417.asm
六、处理器控制指令 1. 标志处理指令 CLC对CF清零, CF ← 0 STC对CF置位, CF ← 1 CMC 对CF取反,CF← CF CLD对DF清零,DF ← 0 STD对DF置位,DF ← 1 CLI对IF清零,IF ← 0 STI 对IF置位,IF ← 1
2. 外部同步指令 HLT (Halt) 停机 处理器停止工作,等到外部中断到来,中断结束后继续向下执行。 WAIT (Wait) 等待 处理器处于等待状态,等到外部的TEST引脚上的低电平到来。 ESC (Escape) 换码 该指令是一个交权的指令前缀,把指令给协处理处理。 一般和WAIT指令一起使用,通过TEST引脚和协处理器同步。
LOCK (Lock) 封锁 该指令是一个前缀,使得使用此前缀的指令执行时一直维持总线封锁状态。 3. 空操作指令 NOP (No Operation) 空操作 一个字节的机器码,不执行任何操作,常用在调试程序时使用。