汇编语言笔记
简单总结一下汇编语言的语法和知识点,详情参考汇编语言教程
汇编语言语法与知识点总结
一、汇编语言概述
- 定义:汇编语言是一种低级编程语言,介于机器语言和高级语言之间,使用助记符表示机器指令。
- 特点:
- 与硬件紧密结合,执行效率高。
- 针对特定的处理器架构,可移植性差。
- 编写和调试难度较大,但运行效率高。
二、基本语法结构
(一)指令格式
1 | [label:] 指令助记符 操作数1, 操作数2 |
- 标签(Label):可选,用于标记代码位置,便于跳转。
- 指令助记符(Mnemonic):表示操作类型,如
MOV
、ADD
等。 - 操作数(Operand):指令的操作对象,可以是寄存器、内存地址或立即数。
(二)注释
1 | ; 这是注释内容 |
- 注释从分号
;
开始,到行尾结束,用于说明代码功能。
三、指令分类
(一)数据传送指令
- MOV:数据传送指令,用于寄存器和内存之间的数据移动。
1
2MOV AX, BX ; 将 BX 寄存器的内容传送到 AX 寄存器
MOV CX, [SI] ; 将内存地址 [SI] 中的内容传送到 CX 寄存器
(二)算术运算指令
- ADD:加法指令。
1
ADD AX, BX ; AX = AX + BX
- SUB:减法指令。
1
SUB AX, BX ; AX = AX - BX
- MUL:乘法指令。
1
MUL BX ; AX = AX * BX(结果存于 DX:AX 中)
- DIV:除法指令。
1
DIV BX ; AX / BX,商存于 AX,余数存于 DX
(三)逻辑运算指令
- AND:按位与。
1
AND AX, 0FFh ; AX = AX & 0FFh
- OR:按位或。
1
OR AX, 0FFh ; AX = AX | 0FFh
- XOR:按位异或。
1
XOR AX, AX ; AX = AX ^ AX(清零 AX)
- NOT:按位取反。
1
NOT AX ; AX = ~AX
(四)控制转移指令
- JMP:无条件跳转。
1
JMP label ; 跳转到标签 label
- 条件跳转指令:根据标志寄存器的状态进行跳转。
- JZ/JE:零标志(ZF)为 1 时跳转。
1
JZ label ; 如果 ZF=1,跳转到 label
- JNZ/JNE:零标志(ZF)为 0 时跳转。
1
JNZ label ; 如果 ZF=0,跳转到 label
- JG/JNLE:大于(SF=0 且 ZF=0)时跳转。
1
JG label ; 如果 SF=0 且 ZF=0,跳转到 label
- JZ/JE:零标志(ZF)为 1 时跳转。
(五)程序调用与返回
- CALL:调用子程序。
1
CALL subroutine ; 调用子程序 subroutine
- RET:从子程序返回。
1
RET ; 返回到调用点
四、寄存器
(一)通用寄存器
- AX:累加器,用于算术运算和数据传送。
- BX:基址寄存器,用于存储内存地址。
- CX:计数寄存器,用于循环计数。
- DX:数据寄存器,用于存储 I/O 操作的数据。
(二)段寄存器
- CS:代码段寄存器。
- DS:数据段寄存器。
- SS:堆栈段寄存器。
- ES:附加段寄存器。
(三)其他寄存器
- IP:指令指针,指向当前指令的地址。
- FLAGS:状态标志寄存器,存储程序运行状态(如 ZF、CF、SF 等)。
五、伪指令
(一)数据定义伪指令
- DB:定义字节。
1
data1 DB 0x12 ; 定义一个字节数据 0x12
- DW:定义字。
1
data2 DW 0x1234 ; 定义一个字数据 0x1234
- DD:定义双字。
1
data3 DD 0x12345678 ; 定义一个双字数据 0x12345678
(二)段定义伪指令
- SEGMENT:定义段。
1
2
3DATA SEGMENT
data1 DB 0x12
DATA ENDS
(三)程序控制伪指令
- START:程序入口点。
- END:程序结束。
1
END ; 程序结束
六、汇编程序的基本结构
(一)代码段
1 | CODE SEGMENT |
(二)数据段
1 | DATA SEGMENT |
(三)堆栈段
1 | STACK SEGMENT |
七、示例程序
(一)简单加法程序
1 | DATA SEGMENT |
(二)循环程序
1 | DATA SEGMENT |
八、常用函数与系统调用
(一)Linux 系统调用
在 Linux 中,系统调用通过中断 0x80
或 syscall
指令实现。常见的系统调用包括:
write:写入数据到文件描述符。
1
2
3
4
5MOV EAX, 4 ; 系统调用号 4 表示 write
MOV EBX, 1 ; 文件描述符 1 表示标准输出
MOV ECX, message ; 数据地址
MOV EDX, length ; 数据长度
INT 0x80 ; 触发中断read:从文件描述符读取数据。
1
2
3
4
5MOV EAX, 3 ; 系统调用号 3 表示 read
MOV EBX, 0 ; 文件描述符 0 表示标准输入
MOV ECX, buffer ; 缓冲区地址
MOV EDX, 256 ; 缓冲区大小
INT 0x80 ; 触发中断exit:退出程序。
1
2
3MOV EAX, 1 ; 系统调用号 1 表示 exit
MOV EBX, 0 ; 返回值
INT 0x80 ; 触发中断
(二)函数调用约定
在函数调用中,参数传递和返回值的处理遵循一定的规则:
参数传递:在 x86 架构中,参数通常通过栈传递。调用函数前,将参数依次压入栈中(从右到左),然后调用函数。
1
2
3PUSH param2
PUSH param1
CALL function返回值:函数的返回值通常存储在寄存器中。在 x86 中,整数返回值存储在
EAX
寄存器。
(三)常见库函数
printf:格式化输出函数。
1
2
3
4PUSH param2
PUSH param1
CALL printf
ADD ESP, 8 ; 清理栈空间scanf:格式化输入函数。
1
2
3PUSH format
CALL scanf
ADD ESP, 4 ; 清理栈空间
九、汇编语言在 Pwn 中的应用
(一)漏洞分析
汇编语言在分析二进制程序漏洞时至关重要。通过反汇编程序,可以查看函数实现、数据结构和控制流,发现潜在的漏洞点,如缓冲区溢出、格式化字符串漏洞等。
(二)构造 Payload
在利用漏洞时,常常需要构造特定的 payload。汇编语言可以帮助理解如何构建恶意输入,例如覆盖返回地址、注入 shellcode 等。
(三)调试与测试
使用调试工具(如 gdb)结合汇编知识,可以单步跟踪程序执行,查看寄存器和内存状态,验证漏洞利用的有效性。
评论