🔰 MASM + Irvine32 汇编语言入门全攻略
高手文章:32位汇编语言程序设计基础知识 | Firefly
32位汇编指令速查表(MASM / x86) | Firefly
✅ 第一章:什么是汇编语言?
汇编语言(Assembly Language)是贴近硬件的编程语言,它将机器语言以可读性强的方式表达出来。
✨ 特点:
- 每条汇编指令对应一条机器指令,执行效率极高
- 可直接控制 CPU、内存、I/O 等硬件资源
- 是理解操作系统、编译器、底层原理的基础
- 学习难度较高,但收益也非常大
📦 编写汇编程序需要:
- 汇编器:MASM(Microsoft Macro Assembler)
- 函数库:Irvine32(封装常用功能,如输入输出)
- 编辑器:Visual Studio(推荐使用 VS 2010 + MASM 插件)
📁 第二章:汇编程序的基本结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| include irvine32.inc ; 引入 Irvine32 库
.data ; 数据段:定义变量 msg byte "Hello, World!", 0
.code ; 代码段:程序逻辑 main proc mov edx, offset msg ; 加载字符串地址 call writestring ; 输出字符串 call crlf ; 换行 exit ; 正确退出程序 main endp
end main ; 程序入口点
|
📌 小贴士:
.data
段中定义变量、数组、字符串等
.code
段中编写逻辑,程序从 main
开始执行
exit
是宏,程序结束时必须调用(不要使用 call exit
)
🧱 第三章:常用寄存器说明(32 位)
寄存器 |
名称 |
用途说明 |
EAX |
Accumulator |
累加器,常用于计算、函数返回值 |
EBX |
Base |
通用寄存器,常用于存变量 |
ECX |
Counter |
计数器,loop 指令自动使用 |
EDX |
Data |
数据寄存器,乘除法中常用 |
ESI |
Source Index |
数组或字符串的源地址 |
EDI |
Destination Index |
目标地址 |
EBP |
Base Pointer |
栈帧基址,用于访问函数参数 |
ESP |
Stack Pointer |
栈顶指针,自动维护,不建议直接操作 |
🧾 第四章:变量定义与数据段说明
1 2 3 4
| .data num1 dword 100 ; 定义一个 32 位整数 arr dword 10, 20, 30 ; 定义数组 msg byte "Hi!", 0 ; 定义字符串,0 表示结束符
|
🧠 常用关键字:
byte
:定义 1 字节数据
word
:定义 2 字节数据(16 位)
dword
:定义 4 字节数据(32 位)
offset
:获取变量的内存地址(用于传参或指针操作)
🔧 第五章:基础汇编指令汇总
📤 数据传送类指令
1 2 3 4
| mov eax, 100 ; 把立即数100赋值给eax mov ebx, eax ; 把eax的值复制到ebx mov eax, [arr] ; 读取arr[0]的值(10) mov [arr+4], ebx ; 把ebx写入arr[1]的位置
|
➕ 算术与逻辑运算
1 2 3 4 5
| add eax, 5 ; eax += 5 sub ebx, 1 ; ebx -= 1 inc ecx ; ecx++ dec ecx ; ecx-- imul eax, ebx ; eax = eax * ebx(有符号)
|
⚖ 比较与跳转(条件控制)
1 2 3 4 5
| cmp eax, ebx ; 比较两数 je equal_label ; 相等跳转 jne not_equal_label ; 不等跳转 jl less_label ; 小于跳转 jg greater_label ; 大于跳转
|
🔁 第六章:循环结构实现
示例:输出数字 1 到 5
1 2 3 4 5 6 7 8
| mov ecx, 5 ; 设定循环次数 mov eax, 1
L1: call writeint call crlf inc eax loop L1 ; ECX--,不为0则跳转回 L1
|
📞 第七章:自定义过程(函数调用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| main proc push 5 call printNumber exit main endp
printNumber proc push ebp mov ebp, esp mov eax, [ebp+8] ; 获取参数 call writeint call crlf pop ebp ret 4 ; 弹出参数占用的栈空间 printNumber endp
|
✨ 说明:
- 使用
push
传递参数(从右向左压栈)
- 使用
[ebp+8]
访问第一个参数
ret 4
表示返回时释放 4 字节(一个参数)
📌 第八章:数组操作基础
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| .data arr dword 5, 10, 15, 20
.code mov esi, offset arr ; ESI = 数组地址 mov ecx, 4 ; 循环4次 mov ebx, 0
L2: mov eax, [esi + ebx*4] ; 读取第 ebx 个元素 call writeint call crlf inc ebx loop L2
|
🔚 第九章:程序正确退出方式
⚠ 切记:
1
| call exit ; ❌ 不允许,exit 是宏,不是函数
|
📤 第十章:Irvine32 输入输出用法
功能 |
示例代码 |
输出整数 |
mov eax, num + call writeint |
输入整数 |
call readint → 返回值存在 eax |
输出字符串 |
mov edx, offset msg + call writestring |
输出换行符 |
call crlf |
📌 附加建议与资源
🔍 调试技巧:
- 使用 Visual Studio + 单步调试查看寄存器变化
- 配合 Memory / Register 窗口 分析变量变化
- 善用断点定位逻辑错误
📚 推荐学习资料: