汇编语言---调用与返回指令1
(2013-01-25 14:02:30)分类: 汇编 |
指令格式
CALL OPR
CALL OPR1
CALL FAR PTR OPR
CALL OPR1
RET
RETF
RET n 或 RETF n
1.调用指令CALL
调用指令CALL的基本功能就是将返回地址(即:调用指令的下一条指令的地址)压入堆栈,并转向子程序的入口地址处;调用指令可分为段内调用和段间调用;段内调用时,由于主程序与子程序在同一个段内,因此,调用前后,段寄存器CS的内容不会发生变化,因而,返回地址只需保存偏移地址即可,比如上述调用指令中的前两条指令;段间调用时,主程序与子程序不在同一个段内,此时,调用指令执行后,CS和IP的内容都会发生变化,因此,保存的返回地址必须要包含它的段地址和段内偏移地址两个部分;
子程序入口地址的寻址方式与无条件转移指令的待转向地址的寻址方式基本相同;
(1).段内直接调用指令"CALL
OPR":指令中的OPR为子程序名,它代表了子程序的入口地址,其寻址方式为相对寻址方式;相对位移量是16位,它是子程序入口地址与返回地址的差值;
(2).段内间接调用指令"CALL
OPR1":指令中的OPR1指出了存放子程序入口地址的那个存储单元,上述指令中的EA即为OPR1的有效地址,其寻址方式可以是除了立即数寻址方式和段寄存器寻址方式之外的任何寻址方式;因为是段内调用,所以,EA对应存储单元中存放的是子程序入口地址的16位偏移地址;
(3).段间直接调用指令"CALL FAR PTR
OPR":指令中的OPR为过程名或子程序名,同样代表了过程或子程序的入口地址,其寻址方式为直接寻址方式,即:指令的机器码中直接给出了过程或子程序入口地址的段地址和偏移地址;
(4).段间间接调用"CALL
OPR1":指令中OPR1的含义和寻址方式与段内间接调用指令相同,不同的是有效地址EA对应存储单元中存放的是子程序入口地址的段地址和偏移地址;
假设某程序中已经定义了子程序SEARCH1和PMOVE,以及变量SADR,那么,我们有以下调用指令:
CALL
SREACH1
CALL FAR PTR PMOVE
CALL
BX
CALL WORD PTR [BX]
CALL
SADR
2.返回指令RET
返回指令的功能是从栈顶弹出返回地址,并把弹出的返回地址送入指令指针寄存器IP和段寄存器CS,以保证子程序能够正确地返回到主程序;指令的寻址方式实际上都是以SP间接寻址;