前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8086汇编语言之函数的声明和调用

8086汇编语言之函数的声明和调用

作者头像
乱码三千
发布2021-08-24 15:04:38
1.5K0
发布2021-08-24 15:04:38
举报
文章被收录于专栏:乱码三千
代码语言:javascript
复制

代码示例

代码语言:javascript
复制
assume cs:code,ds:data,ss:stack

;数据段
stack segment
	db 20 dup(0) ;定义数据相当于是定义了段地址
stack ends

;数据段
data segment
	db 20 dup(0) ;定义数据相当于是定义了段地址
	str db 'hello world!$' ;$ 表示结尾标记
	
data ends

code segment	
	
	
start:	
		;设置ds和ss
		mov ax,data
		mov ds,ax
		mov ax stack
		mov ss,ax
		
		;业务逻辑代码
		mov dx,offset str;获取别名对应数据的偏移地址
		mov ah 9ch ;9h表示调用显存 从dx总读取偏移地址对应的数据
		int 21h
		
		;退出程序
		mov ah 4ch 
		int 21h
code ends
end start ;标记名称可自定义

需求: 将打印Hello world!封装成一个函数

使用标号即可:

代码语言:javascript
复制
assume cs:code,ds:data,ss:stack

;数据段 
stack segment
	db 20 dup(0) ;定义数据相当于是定义了段地址
stack ends

;数据段 
data segment
	db 20 dup(0) ;定义数据相当于是定义了段地址
	str db 'hello world!$' ;$ 表示结尾标记
	
data ends

code segment	
	
	
start:	
		;设置ds和ss
		mov ax,data
		mov ds,ax
		mov ax stack
		mov ss,ax
		
print:	;函数名
		;业务逻辑代码
		mov dx,offset str;获取别名对应数据的偏移地址
		mov ah 9ch ;9h表示调用显存 从dx总读取偏移地址对应的数据
		int 21h
		
		;退出程序
		mov ah 4ch 
		int 21h
code ends
end start ;标记名称可自定义

由于print函数默认执行,为了保证在call时才执行, 咱们将print函数代码移至中断后:

代码语言:javascript
复制
assume cs:code,ds:data,ss:stack

;数据段 
stack segment
	db 20 dup(0) ;定义数据相当于是定义了段地址
stack ends

;数据段 
data segment
	db 20 dup(0) ;定义数据相当于是定义了段地址
	str db 'hello world!$' ;$ 表示结尾标记
	
data ends

code segment	
	
	
start:	
		;设置ds和ss
		mov ax,data
		mov ds,ax
		mov ax stack
		mov ss,ax
		
		;业务逻辑代码
		call print ;调用print函数
		
		;退出程序
		mov ah 4ch 
		int 21h
		
print:	;函数名
		mov dx,offset str;获取别名对应数据的偏移地址
		mov ah 9ch ;9h表示调用显存 从dx总读取偏移地址对应的数据
		int 21h
code ends
end start ;标记名称可自定义

该代码存在一个问题,就是调用print函数后程序无法终止, 此时加上ret优化 ,最终代码为:

代码语言:javascript
复制
assume cs:code,ds:data,ss:stack

;数据段 
stack segment
	db 20 dup(0) ;定义数据相当于是定义了段地址
stack ends

;数据段 
data segment
	db 20 dup(0) ;定义数据相当于是定义了段地址
	str db 'hello world!$' ;$ 表示结尾标记
	
data ends

code segment	
	
	
start:	
		;设置ds和ss
		mov ax,data
		mov ds,ax
		mov ax stack
		mov ss,ax
		
		;业务逻辑代码
		call print ;调用print函数
		
		;退出程序
		mov ah 4ch 
		int 21h
		
print:	;函数名
		mov dx,offset str;获取别名对应数据的偏移地址
		mov ah 9ch ;9h表示调用显存 从dx总读取偏移地址对应的数据
		int 21h
		ret
code ends
end start ;标记名称可自定义
代码语言:javascript
复制
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乱码三千 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码示例
  • 需求: 将打印Hello world!封装成一个函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档