目录
第四章:第一个程序
📌 主要内容
本章通过一个简单的汇编示例,详细讲解从源程序编写到可执行文件运行的全流程,包括编辑、汇编、链接、加载与跟踪调试,每一步都深入剖析其原理与命令使用,帮助理解汇编程序的执行机制与工具链协作。
🧠 笔记重点
4.1 一个源程序从写出到执行的过程
-
流程总览
- 编写源程序(.asm 文件),包含段定义、指令与伪指令;
- 汇编(Assembler,MASM):
.asm
→.obj
(目标文件); - 链接(Linker):
.obj
→.exe
(可执行文件); - 加载(Loader):DOS 将
.exe
装入内存,设置段寄存器; - 执行:CPU 从
CS:IP
开始逐条取指并运行。
-
关键概念
- 段与偏移:所有地址均由“段地址 ×16 + 偏移”计算;
- 目标文件:包含机器码和重定位信息;
- 可执行文件格式:含 MZ 头,DOS 加载器解析后再执行。
-
图示
源程序.asm ──汇编──► .obj ──链接──► .exe ──加载──► 内存中程序 ──执行──► 运行结果
4.2 源程序
-
结构要素
ASSUME
:段寄存器与段名对应;data segment … data ends
:数据段定义;code segment … code ends
:代码段定义;end <入口标号>
:指定程序起始位置。
-
示例
assume cs:code, ds:data data segment msg db 'Hello, ASM!', 0dh,0ah,'$' data ends code segment start: ; 初始化 DS mov ax, data mov ds, ax ; 调用 DOS 中断打印字符串 mov dx, offset msg mov ah, 9 int 21h ; 退出程序 mov ah, 4Ch int 21h code ends end start
4.3 编辑源程序
- 编辑工具
- 推荐使用 VSCode、Notepad++ 或
DEBUG
自带编辑模式;
- 推荐使用 VSCode、Notepad++ 或
- 保存注意
- 文件扩展名应为
.asm
; - 文本编码须为 ANSI/ASCII,避免 UTF-8 BOM;
- 文件扩展名应为
- DEBUG 编辑示例
debug - n Hello.asm ; 指定文件名 - a 100 ; 在地址 0100h 开始输入 mov ax, 4C00h int 21h <空行结束> - rcx
4.4 编译
- MASM 使用
masm Hello.asm; ; 生成 Hello.obj
- 过程详解
- 解析伪指令,分配段和符号表;
- 翻译每条汇编指令为机器码;
- 生成重定位表与符号信息,输出
.obj
。
- 常见错误
- 段未定义或
ASSUME
错误; - 语法错误;
- 标号重复。
- 段未定义或
4.5 连接
- Link 命令
link Hello.obj; ; 生成 Hello.exe
- 细节
- 解析
.obj
中所有段和重定位信息; - 合并同名段(如多个
code segment
); - 计算最终每段在内存的起始地址;
- 修正所有重定位引用,输出
.exe
。
- 解析
- 检查
- 确保
.obj
与库文件路径正确; - 使用
dumpbin /headers Hello.exe
查看 MZ 头信息。
- 确保
4.6 以简化的方式进行编译和连接
-
可执行文件直接生成
- 在masm后面加上被编译的源程序文件的路径、文件名,在命令行的结尾加分号:
masm Hello.asm; link Hello.obj;
- 在masm后面加上被编译的源程序文件的路径、文件名,在命令行的结尾加分号:
-
优缺点
- 简单快捷,适合演示和小程序;
- 不支持多段与复杂重定位。
4.7 1.exe
的执行
- DOS 加载流程
- 读取 MZ 头,验证签名“MZ”;
- 按头部指定的段布局分配内存;
- 将程序体复制到分配区;
- 设置
CS:IP
指向程序入口; - 转交控制权给程序入口。
- 寄存器初始化
CS
指向代码段,IP
=入口偏移;DS=CS
;- 栈段
SS:SP
由 DOS 按默认或头部值设置。
4.8 谁将可执行文件中的程序装载进入内存并使它运行?
-
4.9 程序执行过程的跟踪
- 使用 DEBUG
debug Hello.exe
加载程序;u 100
反汇编查看机器码;r
查看所有寄存器初始状态;t
单步执行,观察CS:IP
、DS
、AX/BX…
的变化;d ds:offset msg
查看数据段中字符串内容。p
执行int 21命令
- 观察要点
- 段寄存器是否按预期初始化;
- 每条指令执行后寄存器和内存的变化;
- 中断调用后程序流向和返回值。
🧪 实验3:编写、汇编、链接并跟踪第一个程序
- 编辑
Hello.asm
,写入上文示例; - 汇编:
masm Hello.asm;
输出Hello.obj
; - 链接:
link Hello.obj;
输出Hello.exe
; - 执行:
debug Hello.exe
,使用u
、r
、t
、d
等命令逐步跟踪; - 验证:在屏幕上看到 “Hello, ASM!” 并正常返回。
🔍 拓展理解
- 深入研究 MZ 文件格式,有助于理解现代 PE 格式演变;
- 掌握汇编工具链(MASM、LINK、DEBUG)使用,是高效调试与性能优化的基础;
- 通过逐条单步跟踪,可以窥见 CPU 指令执行与中断调用的底层细节。