第一条汇编程序:Hello World 的底层实现

告别黑盒,用汇编代码打印 Hello World。从 .DATA 段定义字符串,到 MOV/INT 指令调用 DOS 21h 中断显示,再到 EXE 文件的生成过程,彻底搞懂汇编程序的生命周期。

2

经典的 Hello World

在高级语言中,print("Hello World") 只需要一行。在汇编中,你需要:

  1. 定义数据段
  2. 设置显示功能号
  3. 调用中断
  4. 设置退出功能号
  5. 再次调用中断

完整源码

 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
MOV AH, 4Ch
INT 21h

如果不写退出代码,程序会继续执行内存中的随机数据,导致崩溃。

编译与运行

1
2
3
masm hello.asm;   # 生成 hello.obj
link hello.obj;   # 生成 hello.exe
hello.exe         # 运行

总结

第一个汇编程序虽然只有十几行,但它涵盖了汇编的核心要素:段定义、寄存器操作、中断调用

下一篇:《8086 指令系统全景图:数据传送、算术运算与逻辑操作》

广告
广告位预留中 (728x90)