实验相关文件

exp4.zip

调用系统功能

我们编写的是DOS程序,运行在DOS操作系统这个容器里,就像缸中之脑,要想与外界输入输出,就必须经由宿主预留的接口。

这篇文档描述了DOS系统提供的一些接口:

DOS Interrupts

用法很简单,先将参数存入约定的寄存器,再触发中断,就可以等待操作系统去执行了。

比如我们来回看一下第一次实验中,用到的两个功能:打印字符串、退出程序。

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

可以得知:

  1. 首先设置ah09h,告诉操作系统要使用的功能号
  2. 然后设置dx,告诉操作系统要打印的字符串的起始地址,系统将从此内存地址逐字向后打印,直到$停止
  3. 功能完成后,系统会设置al24h

进而使用:

data segment
  msg db 'A secret makes a woman woman.$' ; 在数据段定义字符串,以 $ 结尾
data ends
mov ah, 09h ; 设置功能号 09h
lea dx, msg ; 设置字符串地址
int 21h ; 交由系统执行