DOS 系统功能调用(INT 21H)
INT
表示interrupt
(中断), INT指令是X86汇编语言中最重要的指令之一,它的作用是引发中断,调用“中断例程”(interrupt routine)。
中断是由于软件或硬件的信号,使CPU暂停执行当前的任务,转而去执行另一段子程序。
- 硬中断(外中断):由外部设备,如网卡、硬盘随机引发的,比如网卡收到数据包的时候,就会发出一个中断。
- 软中断(内中断):由执行中的指令产生的,可以通过程序控制触发。
可以通过 “ INT 中断码 ” 实现中断,内存中有一张中断向量表,用来存放中断码处理中断程序的入口地址。CPU在接受到中断信号后,暂停当前正在执行的程序,跳转到中断码对应的向量表地址处去执行中断。
我们理解上可以当INT
就是调用系统内置的一些功能。
常用的中断:
INT 21H
:DOS系统功能调用INT 10H
:BIOS终端调用INT 3H
:断点中断,用于调试程序
这篇文章重点记录下DOS的系统功能调用,也就是INT 21H
。
本文环境:
- 操作系统:虚拟机中的Windows 10
- Visual Studio Code
- VSCode 插件:MASM/TASM
这个插件还蛮方便的,省去了自己配环境的麻烦,右键单击文件选择Run ASM code
就可以执行代码:
DOS系统功能调用格式都是一致的,步骤如下:
- 在
AH
寄存器中设置系统功能调用号。 - 在指定的寄存器中设置入口参数。
- 用
INT 21H
指令执行功能调用。 - 根据出口参数分析功能调用执行情况。
常见功能
DOS 系统功能调用 INT 21H
,有数百种功能供用户使用。下面介绍几个常用的 DOS 系统功能调用,简要描述如表所示。
4C肯定天天用,毕竟用来返回DOS的,这里写点其他功能的例子。
一些例子
汇编代码中,指令和寄存器名大写和小写没关系,所以这里ah和AH,dx和DX也没问题。但是4H和4还是有点不一样的,4H
是16进制,不带h表示10进制。
显示一个字符
1 | assume cs:code, ds:data |
这个程序会输出一个e
的字符。
打印hello world
代码是用别人的,他的注释写的蛮好的:
1 | ; 注:这里的关联并没有任何实际操作,相当于给我们自己的注释而已 |
读取键盘输入两个数求和
这个例子复杂了点
1 | assume cs:code, ds:data, ss:stack |
调试工具DEBUG常用命令
R ——查看和修改寄存器
D ——查看内存单元
内存每16个字节单元为一小段,逻辑段必须从小段的首址开始。用D命令可以查看存储单元的地址和内容。
D命令格式为:
1 | D 段地址:起始偏移地址 [结尾偏移地址] [L范围] |
例如:
1 | D DS:0 查看数据段,从0号单元开始 |
T /P——单步执行
P可以跳过子程序或系统调用,其他方面T和P是类型的。
参考: