程序控制指令
能够使程序的执行流程发生改变的指令
1,转移指令
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
操作:目标位置的段地址和偏移量保存在存储器中。
说明:
① 在汇编语言中通常使用标号表示要转移到的位置。
② 使用该指令,可以使程序流程改变到任何目标位置。
2)条件转移JCC
根据判断条件是否成立决定是否转移。按照判断条件的不同分为以下类型:单个标志、无符号数判断、有符号数判断、CX寄存器。
条件转移都是段内直接短转移,即(IP)=(IP)+Data8类型的转移。
指令格式:Jcc short_label
“cc”表示条件
⑴ 判断单个标志
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) ? (OF) 且 (ZF)=0
JNL(JGE): (SF)= (OF)
JLE(JNG): (SF) ? (OF) 或 (ZF)=1
JNLE(JG): (SF)= (OF) 且 (ZF)=0
使用比较大小的指令时,必须区分是有符号数还是无符号数。
⑷ 判断CX寄存器
JCXZ: CX=0
2,循环控制指令
循环指令的转移也都是段内直接短转移,即(IP)←(IP)+Data8类型的转移。
LOOP 循环
判断CX是否等于零,不等于零则循环
LOOPZ(LOOPE) 当为零或相等时循环
判断CX是否等于零,不等于零且ZF=1则循环
LOOPNZ(LOOPNE) 当不为零或不相等时循环
判断CX是否等于零,不等于零且ZF=0则循环
说明:
① 循环指令不影响状态标志。
② 如果目标位置的位移量超出Data8所能够表示的范围,则需要用JMP辅助来完成循环。
3,过程调用与返回指令
如果有一段程序在不同的地方反复出现,则可以将这些程序设计称为过程,相当于子程序,当需要时即可调用。
1)过程调用指令CALL(Call a procedure)
说明:由汇编程序自动匹配为某种寻址方式。
RET 子程序返回指令
用法:RET
段内返回:(IP)←((SP)+1:(SP)),(SP)←(SP)+2
段间返回:(IP)←((SP)+1:(SP)),(SP)←(SP)+2,
(CS)←((SP)+1:(SP)),(SP)←(SP)+2
汇编程序自动匹配为段内或段间的返回
格式:RET Data16
操作:在RET的基础上,把SP再加上一个字数据:
(SP)←(SP)+data16
注意:
一般data16应该是一个偶数,表示堆栈指针向下移动的字节数。这是因为堆栈操作都是字操作。
4,中断指令
将在第七章中进行讨论。