8086汇编语言之dos打印hello world

282 阅读3分钟

小知识,大挑战!本文正在参与“  程序员必备小知识  ”创作活动

本文同时参与 「掘力星计划」  ,赢取创作大礼包,挑战创作激励金

代码示例

assume cs:code,ds:data,ss:stack

;数据段 代码段可直接获取数据段中数据, 相当于高级语言中的局部变量
stack segment
	db 20 dup(0) ;定义数据相当于是定义了段地址
stack ends

;数据段 代码段可直接获取数据段中数据, 相当于高级语言中的全局变量
data segment
	db 20 dup(0) ;定义数据相当于是定义了段地址
	db 'hello world!$' ;$ 表示结尾标记
	
data ends

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

使用数据别名优化代码

第一种:

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!$' ;$ 表示结尾标记 str:表示指向该数据的地址
	
data ends

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

第二种:

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, 9h ;9h表示调用显存 从dx总读取偏移地址对应的数据
		int 21h
		
		;退出程序
		mov ah, 4ch 
		int 21h
code ends
end start ;标记名称可自定义

知识点:

第一种 方案使用str:
str: db 'hello world!$' ; str:表示指向该数据的地址
;业务逻辑代码
mov dx, str


第二种 方案使用offset
str db 'hello world!$' ;$ 表示结尾标记 str表示指向该数据的内容
;业务逻辑代码
mov dx,offset str;获取别名对应数据的偏移地址 如果直接使用str表示将hello world!中的h赋值给dx

「欢迎在评论区讨论,掘金官方将在掘力星计划活动结束后,在评论区抽送100份掘金周边,抽奖详情见活动文章」