第一条汇编程序:Hello World 的底层实现
告别黑盒,用汇编代码打印 Hello World。从 .DATA 段定义字符串,到 MOV/INT 指令调用 DOS 21h 中断显示,再到 EXE 文件的生成过程,彻底搞懂汇编程序的生命周期。
经典的 Hello World
在高级语言中,print("Hello World") 只需要一行。在汇编中,你需要:
- 定义数据段
- 设置显示功能号
- 调用中断
- 设置退出功能号
- 再次调用中断
完整源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
DATA SEGMENT
MSG DB 'Hello, Assembly World!$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX ; 初始化 DS 寄存器
MOV DX, OFFSET MSG ; 字符串偏移地址放入 DX
MOV AH, 09h ; DOS 中断 09h: 显示字符串
INT 21h ; 调用中断
MOV AH, 4Ch ; DOS 中断 4Ch: 退出程序
INT 21h
CODE ENDS
END START
|
逐行解析
1. 数据段定义
1
2
3
|
DATA SEGMENT
MSG DB 'Hello, Assembly World!$'
DATA ENDS
|
DB 定义字节数据
$ 是字符串结束符(DOS 09h 中断要求)
2. 初始化 DS
1
2
|
MOV AX, DATA
MOV DS, AX
|
CPU 不允许直接将立即数送入段寄存器,必须通过通用寄存器中转。
3. 调用显示中断
1
2
3
|
MOV AH, 09h
MOV DX, OFFSET MSG
INT 21h
|
AH=09h 告诉 DOS:“我要显示字符串”
DX 存放字符串的偏移地址
4. 安全退出
如果不写退出代码,程序会继续执行内存中的随机数据,导致崩溃。
编译与运行
1
2
3
|
masm hello.asm; # 生成 hello.obj
link hello.obj; # 生成 hello.exe
hello.exe # 运行
|
总结
第一个汇编程序虽然只有十几行,但它涵盖了汇编的核心要素:段定义、寄存器操作、中断调用。
下一篇:《8086 指令系统全景图:数据传送、算术运算与逻辑操作》