我们编写的是DOS程序,运行在DOS操作系统这个容器里,就像缸中之脑,要想与外界输入输出,就必须经由宿主预留的接口。
这篇文档描述了DOS系统提供的一些接口:
用法很简单,先将参数存入约定的寄存器,再触发中断,就可以等待操作系统去执行了。
比如我们来回看一下第一次实验中,用到的两个功能:打印字符串、退出程序。
data segment
msg db 'doge fly to the moon!', 0dh, 0ah, '$'
data ends
code segment
assume cs:code, ds:data
start:
mov ax, data
mov ds, ax
mov ah, 09h ; 🖨️ 打印字符串
mov dx, offset msg ; 字符串内存地址
int 21h ; 交由系统执行
mov ah, 4ch ; 🔚 退出程序
int 21h
code ends
end start
查阅文档找到功能介绍:
AH = 09h - WRITE STRING TO STANDARD OUTPUT
Entry: DS:DX -> '$'-terminated string
Return: AL = 24h
可以得知:
ah
为09h
,告诉操作系统要使用的功能号dx
,告诉操作系统要打印的字符串的起始地址,系统将从此内存地址逐字向后打印,直到$
停止al
为24h
进而使用:
data segment
msg db 'A secret makes a woman woman.$' ; 在数据段定义字符串,以 $ 结尾
data ends
mov ah, 09h ; 设置功能号 09h
lea dx, msg ; 设置字符串地址
int 21h ; 交由系统执行