操作系统制作(4)jmp ret iret retf call详解

一、子程序的调用CALL
汇编语言中子程序的调用采用call指令,该指令的基本格式如下:
call <子程序名>

调用过程分两种情况:
(1)call near <子程序名>
当调用指令和子程序处在同一代码段时。该调用指令的执行过程是: 首先将call指令的下一条指令地址(16位的EA)压入堆栈。

SP减2;
IP值放到((SP + 1), (SP))中;

再将子程序所在的地址(EA)送到IP,程序将转入子程序执行。这种调用称为段内调用。
在这里插入图片描述
(2)call far <子程序名>
当调用指令和子程序不在同一代码段,即子程序为FAR属性时,该调用指令的执行过程为: 首先将call指令的下一条指令地址的16位的段地址和16位的EA先后压入堆栈。

SP减2;CS放到((SP + 1), (SP))中;
SP再减2;IP值放到((SP + 1), (SP))中;

再将子程序所在的段地址与偏移地址分别送到代码段寄存器CS和程序指针寄存器IP中。即:
子程序的偏移地址->(IP);子程序的段地址->(CS)。程序将转入子程序执行。这种调用称为段间调用。
子程序的入口地址可存放于寄存器或存储器中,采用间接调用方式来实现。call指令不影响标志位
在这里插入图片描述
二、子程序返回RET
子程序或过程执行到最后一条指令必须是RET指令,其功能是使程序的执行控制从子程序返回到调用指令CALL后的指令处即断电继续执行。RET指令的基本格式如下:
RET [<数字>]

子程序返回主程序也分几种情况:
(1)近跳转返回ret
如果RET所在的子程序属性为NEAR,该指令执行时,会从堆栈中弹出一个字的内容给指令指针寄存器IP。
((SP + 1), (SP))->(IP);(SP)+2->(SP)
(2)远跳转返回retf
如果RET所在的子程序属性为FAR,该指令执行时,会从堆栈中弹出两个相邻字的内容分别送到IP、CS。
((SP + 1), (SP))->(IP);(SP)+2->(SP)
((SP + 1), (SP))->(CS);(SP)+2->(SP)

RET指令从堆栈中弹回的内容应为CALL指令压入堆栈的内容,这样才能保证调用时与返回后的一致性。这要求在子程序中PUSH指令与POP指令应当成对使用,否则可以在RET指令后面跟一个数字。

例如: RET4
相当于执行完一条不跟数值的RET指令之后,SP再加4。
(3)中断返回iret

(4)retf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章