Categories: 汇编 | Tags: | Views: 616

 

过程调用指令有段内调用(近调用)和段间调用(远调用)之分。

与之对应,过程返回指令也有段内返回(近返回)和段间返回(远返回)之分。

过程有远近类型之分。

1. 过程调用指令

首先把子程序的返回地址(即CALL指令的下一条指令的地址)压入堆栈,以便执行完子程序后返回调用程序(主程序)

(1) 段内直接调用

CALL DST

具体操作: 

SP <= SP – 2

[SP] <= IP

IP <= IP +disp

(2) 段内间接调用

CALL OPRD

具体操作:

SP <= SP – 2

[SP] <= IP

IP <= (OPRD)

该指令只把返回地址的偏移部分压入堆栈保存

OPRD是16位通用寄存器操作数,则把寄存器的内容送IP,若OPRD是字寄存器操作数,则把字存储单元的内容送IP

(3) 段间直接调用

CALL 过程名

具体操作:

SP <= SP -2

[SP] <= CS

SP <= SP – 2

[SP] <= IP

IP <= 过程入口地址的偏移

CS <= 过程入口地址的段值

(4)段间间接调用

CALL OPRD

OPRD是双字存储器操作数

具体操作:

SP <= SP -2

[SP] <= CS

SP <= SP – 2

[SP] <= IP

IP <= OPRD的低字值

CS <= OPRD的高字值

 

2. 过程返回指令

(1)段内返回指令

RET

具体操作:

IP <= [SP]

SP <= SP+2

(2)段间返回指令

RET

具体操作

IP <= [SP]

SP <= SP+2

CS <= [SP]

SP <= SP+2

(3)段内带立即数返回指令

RET 表达式

IP <= [SP]

SP <= SP+2

SP <= SP+data

先从堆栈弹出一个字作为返回地址,再额外根据data修改堆栈指针。

(4)段间带立即数返回指令

RET 表达式

先从堆栈弹出两个字,分别送到指令指针IP和代码段寄存器CS

再额外修改堆栈指针,即把表达式的结果加到SP

 

3. 过程定义语句

过程名 PROC [NEAR | FAR]

     …

     …

过程名 ENDP

默认类型为NEAR,过程名亦有段值,偏移和类型三个属性

过程名的类型就是过程的类型

 

4. 主程序与子程序间的参数传递

(1)利用寄存器传递参数

适用于传递的参数较少的情况

(2)利用约定存储单元传送参数

可用于参数较多的情况

(3)堆栈传递参数

 

这篇文章来自 迷途知返(PWWANG.COM), 转载请注明出处。 版权说明

No comments yet.
;) :| :x :twisted: :roll: :oops: :o :mrgreen: :lol: :idea: :evil: :cry: :arrow: :P :D :?: :? :) :( :!: 8O 8)

你可以使用@somebody:开头, 来邮件通知somebody你回复了他的留言(用户名区分大小写).