内容发布更新时间 : 2025/7/7 11:15:22星期一 下面是文章的全部内容请认真阅读。
(IP)←(EA)
或(EIP)←(EA) AND 0000FFFFH
当操作数长度为32位时,Push (EIP)
(EIP)←(EA)
说 明:指令中DST为除立即数以外的任一种寻址方式,由指定的寄存器或存储单元的内
容给出转向地址。
3). 段间直接远调用:指令的操作数是一个远过程,该过程在另一个代码段内。 指令格式:CALL DST
执行操作:当操作数长度为16位时,Push (CS)
Push (IP)
(IP)←DST指定的偏移地址 (CS)←DST指定的段地址
当操作数长度为32位时,Push (CS)
Push (EIP)
(EIP)←DST指定的偏移地址 (CS)←DST指定的段地址
4). 段间间接远调用:指令的操作数是一个存储器地址。 指令格式:CALL DST
执行操作:当操作数长度为16位时,Push (CS)
Push (IP) (IP)←(EA) (CS)←(EA+2)
当操作数长度为32位时,Push (CS)
Push (EIP) (EIP)←(EA) (CS)←(EA+4)
说 明:指令中DST为任一种存储器寻址方式,由指定的存储单元的内容给出转向地址。
(2). RET——子程序(过程)返回指令
RET指令放在子程序的末尾,它使子程序在功能完成后返回调用程序继续执行,而返回地址是调用程序调用子程序(或称转子)时存放在堆栈中的,因此RET指令的操作是返回地址出栈送IP或EIP寄存器(段内或段间)和CS寄存器(段间)。
1). 段内近返回
指令格式:RET ;DEBUG反汇编为RET,机器码为C3H 执行操作:当操作数长度为16位时,(IP)←Pop ( )
386及其后继机型:(EIP)←(EIP) AND 0000FFFFH 当操作数长度为32位时,(EIP)←Pop ( )
2). 段内带立即数近返回 指令格式:RET EXP ;DEBUG反汇编为RET n,机器码为C2 xxxxH 执行操作:在完成与1)的RET完全相同的操作后,还需要修改堆栈指针:
(SP或ESP)←(SP或ESP)+D16
说 明:其中EXP是一个表达式,根据它的值计算出来的常数成为机器指令中的位移量
D16。主程序通过压入堆栈操作将一定的参数或参数地址传递给子程序。子程序运行过程中,使用了这些参数或参数地址,子程序返回时没有必要再将这些参数或参数地址保留在堆栈中,因而,可以在返回指令后面加上参数EXP,以腾出那些无用的参数或参数地址所占的单元。
3). 段间远返回
指令格式:RET ;DEBUG反汇编为RETF,机器码为CBH 执行操作:当操作数长度为16位时,(IP)←Pop ( )
386及其后继机型:(EIP)←(EIP) AND 0000FFFFH
(CS)←Pop ( )
当操作数长度为32位时,(EIP)←Pop ( )
(CS)←Pop ( ) (32位数出栈,高16位废除)
4). 段间带立即数远返回
指令格式:RET EXP ;DEBUG反汇编为RETF n,机器码为CA xxxxH 执行操作:在完成与3)的RET完全相同的操作后,还需要修改堆栈指针:
(SP或ESP)←(SP或ESP)+D16
说 明:①.从近过程返回和从远过程返回的指令是一样的,但机器编码不一样。段内返回
指令的代码为C3H,段间返回指令的代码为CBH。
②.RET EXP指令为带参数的返回指令;EXP可为