🔰 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
exit       ; 使用宏,自动清理并结束程序

⚠ 切记:

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 窗口 分析变量变化
  • 善用断点定位逻辑错误

📚 推荐学习资料: