(五)控制转移指令
4. 调用子程序指令
4.1段内直接(相对)调用:子程序在同一代码段中,子程序相对地址(十六位偏移量)放在指令编码中。
用于调用一个
不知确切地址,但知标号的子程序。
格式:CALL SUBR1;SUBR1为子程序入口标号,子程序相对地址放在指令编码中,三字节指令。
操作:①IP入栈:IP H→(SP-1),IP L→(SP-2),SP-2→SP;②IP+D16→IP
4.2段内间接(绝对)调用:子程序在同一代码段中,子程序的入口地址(绝对地址)存放在寄存器或存贮单元中(两字
节或一字),用于调用一个已知确切地址的子程序。
格式:CALL (NEAR PTR) OPRD;OPRD为寄存器或存贮器,存放两字节的子程序入口偏移地址。
操作:①IP入栈:IP H→(SP-1),IP L→(SP-2),SP-2→SP;②〔OPRD〕→IP(传送一个字)
4.3段间直接(绝对)调用:子程序不在同一代码段中,子程序的入口地址(偏移地址及新的段地址)放在指令编码中。
一般用于调用一个不知确切地址,但知标号的子程序。
格式:CALL SUBR2;SUBR2为子程序入口标号,五字节指令。
操作:①CS入栈:CS H→(SP-1),CS L→(SP-2),SP-2→SP;②IP入栈:IP H→(SP-1),IP L→(SP-2),SP-2→SP;
③置新IP:指令第2、3字节→IP;④置新CS:指令第4、5字节→CS。
4.4 段间间接(绝对)调用:子程序不在同一代码段中,子程序的入口地址(偏移地址及新的段地址)在指定的存贮单元
(连续四个字节)中。
一般用于调用一个已知确切入口地址的子程序。
格式:CALL DWORD PTR OPRD;OPRD为存贮器,存放四字节的子程序入口地址。
操作:①CS入栈:CS H→(SP-1),CS L→(SP-2),SP-2→SP;②IP入栈:IP H→(SP-1),IP L→(SP-2),SP-2→SP;
③置新IP:(EA)→IP(传送一个字);④置新CS:(EA+2)→CS(传送一个字)。
5. 返回指令放在子程序末尾,以在完成子程序后返回主程序。
5.1段内返回段内调用(不管是段内直接还是段内间接调用)返回
格式:RET 操作:IP出栈即(SP)→IP,SP+2→SP。
5.2段内带立即数返回
格式:RET EXP;EXP是一个常数,也可为一表达式,将此常数或由表达式计算出的常数看成一个16位的位移量D16,用以出栈后修改堆栈指针。
操作:①IP出栈:(SP)→IP,SP+2→SP;②修改堆栈指针:SP+D16→SP。
5.3段间返回段间调用(不管是段间直接还是段间间接调用)返回
格式:RET 操作:IP出栈即(SP)→IP,SP+2→SP;CS出栈即(SP)→CS,SP+2→SP。
5.4段间带立即数返回
格式:RET EXP;EXP为常数或表达式,将此常数或由表达式计算出的常数看成一个16位的位移量D16,用以出栈后修改堆栈指针。
操作:①IP出栈:(SP)→IP,SP+2→SP;② CS出栈:(SP)→CS,SP+2→SP;③修改堆栈指针:SP+D16→SP。
!CALL指令与RET指令均不影响标志。
6. 中断指令
6.1中断格式:INT N;N#中断指令,两字节指令(CD N),N为0~255D常数,但N≠3。
操作:①PSW入栈:PSW→(SP),SP-2→SP;②清除TF、IF;③CS入栈:CS→(SP),SP-2→SP;
④IP入栈:IP→(SP),SP-2→SP;⑤进入N#中断:0000H段中(N∗4)→IP, (N∗4+2)→CS。
6.2溢出中断格式:INTO;功能相当于4号中断,但为一字节指令(CE)。
操作:如OF=1,则①PSW入栈;②清除TF、IF;③CS入栈;④IP入栈;⑤进入4#中断:(10H)→IP, (12H)→CS。
6.3断点中断指令格式:INT 3;一字节指令(CC),用于在DEBUG中调试程序。
操作:①PSW入栈;②清除TF、IF;③CS入栈;④IP入栈;⑤(000CH)→IP, (000EH)→CS,进入断点中断。
6.4从中断返回格式:IRET;任何中断都以IRET指令结束,以从中断返回主程序。
操作:①IP出栈:(SP)→IP,SP+2→SP;② CS出栈:(SP)→CS,SP+2→SP;③ PSW出栈(SP)→PSW,SP+2→SP。