DOS 程序
示例是16 位 DOS 环境的汇编(针对 x86 架构早期的实模式),使用的是 16 位寄存器(如
AX
、DS
、CS
)和 DOS 系统调用(INT 21H
),这是非常古老的汇编风格(常见于 DOS 程序或早期 PC 软件)。
汇编程序的段定义(section)
汇编程序通过section
划分不同的内存区域:text
段:存放可执行指令(代码);data
段:存放常量、变量等数据;bss
段:存放未初始化的数据。
本例中仅使用了代码段,数据直接定义在代码段中(简化写法)。
16 位模式与 ORG 伪指令
bits 16
:声明程序运行在 16 位模式下(适用于 DOS 等实模式环境)。org 100H
:指定程序加载到内存后的起始偏移地址为100H
(0x100),这是 DOS 下.COM
格式程序的标准(.COM
程序无复杂段结构,从100H
开始执行)。
寄存器与数据传送
AX, DS, CS
是 16 位通用寄存器:CS
(代码段寄存器):存放当前代码段的基地址;DS
(数据段寄存器):存放当前数据段的基地址;- 指令
MOV AX, CS
和MOV DS, AX
用于将数据段与代码段关联(因数据直接定义在代码段中)。
ECX
是 32 位寄存器,在 16 位模式下可作为计数器,配合LOOP
指令实现循环。
DOS 系统功能调用(INT 21H)
这是 DOS 环境下程序与操作系统交互的核心方式:- 通过设置
AH
寄存器指定功能(如AH=9
表示输出字符串,AH=4cH
表示程序退出); - 相关参数通过其他寄存器传递(如字符串地址存于
DX
); - 执行
INT 21H
触发中断,由操作系统完成指定功能。
- 通过设置
循环控制(LOOP 指令)
LOOP next
指令的作用是:- 将
ECX
寄存器的值减 1; - 若
ECX
不为 0,则跳转到标号next
处继续执行; - 若
ECX
为 0,则退出循环,执行后续指令。
本例中ECX
初始值为 5,因此循环执行 5 次。
- 将
字符串定义与结束标志
- 字符串通过
db
定义,每个字符对应一个 ASCII 码; - DOS 字符串输出功能(
AH=9
)要求字符串必须以$
结尾,否则会输出垃圾数据直到遇到$
。
- 字符串通过