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 ;标记名称可自定义
使用标号即可:
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函数代码移至中断后:
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优化 ,最终代码为:
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 ;标记名称可自定义