这一部分用 MASM 把汇编从“反汇编阅读”推进到“能写最小实验”。写汇编不是为了替代 C/C++,而是为了更准确理解数据定义、调用约定、结构体布局和伪指令。

1、内容范围

小节 内容 复盘点
19.7 - 19.9 MASM 基础 保留字、标识符、伪指令、操作数格式
20.0 - 20.9 数据定义 DB/DW/DD、EQU、地址计数器、OFFSET、ALIGN
21.0 - 21.8 过程与参数 TYPE/LENGTHOF/SIZE、PROTO、INVOKE、ADDR、USES、LOCAL
21.9 - 22.7 条件和循环 .IF.WHILE.REPEAT、JCC
22.8 - 23.3 STRUCT/UNION/MACRO/API 结构体、联合体、宏和 Win32 API 调用

2、标识符与伪指令

MASM 里伪指令不是 CPU 执行的机器指令,而是给汇编器看的说明。

类型 例子 作用
标识符 main, buffer 给地址或数据起名
助记符 mov, add CPU 指令
伪指令 .data, .code 指导汇编器组织程序
MACRO 文本/代码展开

3、数据定义

1
2
3
.data
msg db "hello", 0
num dd 12345678h
伪指令 大小
db 1 字节
dw 2 字节
dd 4 字节
dq 8 字节

4、EQU 与等号

EQU 和等号都可以定义常量或替换符号。复盘重点是:它们不是运行时变量,不会在内存里自动分配可修改空间。

5、当前地址计数器与长度

$ 常用于表示当前位置,可以配合标签计算数据长度。

1
2
buffer db 1,2,3,4
buffer_len = $ - buffer

6、OFFSET、TYPE、LENGTHOF、SIZEOF

操作 含义
OFFSET name 获取标签偏移地址
TYPE arr 单个元素大小
LENGTHOF arr 元素个数
SIZEOF arr 总大小

7、过程、PROTO 与 INVOKE

PROTO 声明函数原型,INVOKE 帮助按约定传参调用。

1
2
ExitProcess PROTO, dwExitCode:DWORD
INVOKE ExitProcess, 0

复盘时关注调用约定和参数顺序。

8、LOCAL 与 USES

语法 作用
LOCAL 定义过程局部变量
USES 自动保存/恢复指定寄存器

这能让汇编过程更接近高级语言函数结构。

9、条件和循环结构

MASM 提供高级伪指令:

1
2
3
4
5
.IF eax == 0
; ...
.ELSE
; ...
.ENDIF

它最终仍会展开成比较和跳转。学习时可以同时看源汇编和生成反汇编。

10、STRUCT、UNION、MACRO

结构体用于按字段组织数据,联合体用于多个字段共享同一段内存,宏用于复用代码模板。

机制 复盘重点
STRUCT 字段偏移和对齐
UNION 多种解释共享同一内存
MACRO 展开后体积和副作用

11、学习检查清单

检查项 状态
能区分 CPU 指令和 MASM 伪指令 待复盘
能用 DB/DW/DD 定义数据 待复盘
能使用 OFFSET、LENGTHOF、SIZEOF 理解数据地址和大小 待复盘
能理解 PROTO/INVOKE 与调用约定的关系 待复盘
能用 STRUCT 复盘结构体字段偏移 待复盘