当前位置:首页 > 技术学院 > 技术前线
[导读]汇编——子程序调用参数传递的三种方式(示例程序:三个数累加求和)

一、子程序定义

子程序名 PROC NEAR|FAR


RET

子程序名 ENDP

子程序名相当于标号,表示本过程的符号地址。过程有NEAR和FAR两种类型,FAR型的过程可供段间调用,NEAR型过程仅供段内调用。

在一个过程中,至少要有一条返回指令RET,它可以书写在过程中的任何位置,但是过程执行的的最后一条指令一定是RET。

二、子程序调用指令

格式:CALL [NEAR PTR] 子程序名

CALL指令的两个作用,1.将断点地址(CALL指令的下一条指令地址)压栈保存,2.转去子程序执行。

[NEAR PTR]可以省略。

三、返回指令

格式:RET [N]

指令作用:实现子程序执行完后返回主程序的指令。从堆栈栈顶弹出一个字数据(段内调用)送入IP作为返回地址。N是立即数,执行完RET之后,再将SP增加N,也叫“平栈”。

四、子程序参数传递的三种方式:

程序示例:假设:N1=1234H,N2=2345H,N3=3456H,计算并显示这3个数的累加和,并用二进制形式显示结果

1.通过寄存器传递参数:调用子程序前,调用程序把入口参数放在约定的寄存器中,子程序执行时,通过约定的寄存器取得入口参数;返回时,子程序把出口参数存放在约定的寄存器中,调用程序通过约定的寄存器中取得出口参数。

DATA SEGMENT

NUM DW 1234H

DW 2345H

DW 3456H

DATA ENDS

STACKS SEGMENT STACK

DB 100 DUP(?)

STACKS ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACKS

BEG: MOV AX,DATA

MOV DS,AX

MOV SI,OFFSET NUM

CALL COMPUTE

XYZ: CALL DISP

MOV AH,4CH

INT 21H

COMPUTE PROC

MOV BX,0

ADD BX,[SI+0]

ADD BX,[SI+2]

ADD BX,[SI+4]

RET

COMPUTE ENDP

DISP PROC

MOV CX,16

LAST: MOV DL,'0'

RCL BX,1

JNC NEXT

MOV DL,'1'

NEXT: MOV AH,2

INT 21H

LOOP LAST

RET

DISP ENDP

CODE ENDS

END BEG

本例程序中调用程序把2号功能入口参数放在DL寄存器中,显示子程序在执行时从DL中取得参数。

2.通过堆栈传递参数:子程序调用前,调用程序把参数依次压入堆栈,构成一个堆栈参数表,当子程序调用时,子程序从堆栈中取出各参数。子程序返回时,要使用 RET n 指令调整SP指针,其中n是堆栈参数表的大小,即使用完堆栈之后删除堆栈参数表,使堆栈恢复到原始状态,也就是文章开始提到的“平栈”。

DATA SEGMENT

NUM DW 1234H

DW 2345H

DW 3456H

DATA ENDS

STACKS SEGMENT STACK 'STACK'

DB 100 DUP(?)

STACKS ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACKS

BEG: MOV AX,DATA

MOV DS,AX

MOV SI,OFFSET NUM

PUSH WORD PTR [SI+0]

PUSH WORD PTR [SI+2]

PUSH WORD PTR [SI+4]

CALL COMPUTE ;注意CALL指令隐含的堆栈操作

XYZ: CALL DISP

MOV AH,4CH

INT 21H

COMPUTE PROC

MOV BP,SP

MOV BX,0

ADD BX,[BP+2] ;栈底处在高地址段

ADD BX,[BP+4]

ADD BX,[BP+6]

RET 6

COMPUTE ENDP

DISP PROC

MOV CX,16

LAST: MOV DL,'0'

RCL BX,1

ADC DL,0

NEXT: MOV AH,2

INT 21H

LOOP LAST

RET

DISP ENDP

CODE ENDS

END BEG

3.通过变量传递参数:如果子程序和调用程序都在同一个源文件中,则双方可以直接访问模块中的变量,从而实现参数传递。

STACKS SEGMENT STACK 'STACK’

DB 100 DUP(?)

STACKS ENDS

CODE SEGMENT

ASSUME CS:CODE,SS:STACKS

BEG: CALL COMPUTE

NUM DW 1234H

DW 2345H

DW 3456H

XYZ: CALL DISP

EXIT: MOV AH,4CH

INT 21H

COMPUTE PROC

MOV BP,SP

MOV SI,[BP+0] ; [BP+0]为断点地址

MOV BX,0

ADD BX,CS:[SI+0]

ADD BX,CS:[SI+2]

ADD BX,CS:[SI+4]

POP AX ;弹出原来的断点地址

MOV AX,OFFSET XYZ ;改变栈顶内容,从而使返回地址改变

PUSH AX

RET ;返回断点XYZ

COMPUTE ENDP

DISP PROC

MOV CX,16

LAST: MOV AL,'0'

RCL BX,1

ADC AL,0

NEXT: MOV AH,0EH ;BIOS功能调用显示一个字符

INT 10H

LOOP LAST

RET

DISP ENDP

CODE ENDS

END BEG

这个例子没有我们常见的数据段,二是把数据定义在了代码段,子程序在执行时,需要用数据时,访问存放数据的内存单元,并且在子程序执行要结束时,改变原来的断点地址,跳过代码段中的数据存储区,到下一片段的执行代码区。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭