灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2140回复:0

子程序的调用伪指令

楼主#
更多 发布于:2012-09-10 18:56

子程序调用伪指令INVOKE与子程序的调用指令CALL在功能上是一致的,但它使汇编语言的子程序调用方法高级语言化,程序员可不用理会一些调用细节问题。

调用伪指令INVOKE的使用格式如下:

INVOKE expression [, arguments]

其中:expression―地址表达式,通常为子程序名;

arguments―传递的各参数之间用逗号’,’分开,参数可以是寄存器、表达式或ADDR 标识符等。

该伪指令是调用基于堆栈的子程序的方法,它把所有参数压栈,子程序结束时,又把参数自动弹出堆栈。

在参数传递时,汇编程序将根据子程序的原型进行数据类型检查。若需要进行参数类型转换的话,汇编程序则会自动生成一段代码来满足其数据类型转换的要求。

例如:

INVOKE TEST, AX, 12+34, ADDR MSG

其中:TEST是子程序名,寄存器AX和表达式“12+34”是参数,“ADDR MSG”是传递变量MSG的地址。

例7.6 编写一个累加参数数值的子程序。其中参数的个数不定,参数的个数由第一个参数来确定。

解:

.MODEL SMALL

.STACK 256

.CODE

;第一个参数parmcount确定其后面参数parmvalues中所含参数的个数

ADDUPPROC NEAR C, parmcount:word, parmvalues:VARARG

XORAX, AX

XORSI, SI

MOVCX, parmcount

.REPEAT

  ADD AX, parmvalues[SI]

  ADD SI, 2

.UNTILCXZ

RET

ADDUPENDP

.STARTUP

INVOKEADDUP, 3, 5, 2, 4;调用子程序ADDUP,计算5+2+4

INVOKEADDUP, 4, 1, 2, 3, 4;调用子程序ADDUP,计算1+2+3+4

.EXIT 0

.END

喜欢0 评分0
游客

返回顶部