🔧 Assembly(汇编语言)
概述:汇编语言是最低级的编程语言,与计算机硬件架构紧密相关。每条汇编指令几乎都对应一条机器指令,是对 CPU 指令集的人类可读表示。汇编语言让程序员能够对硬件进行最精细的控制。
概述
Assembly 属于 系统 & 高性能语言 分类。汇编语言不是一种统一的语言,而是针对不同 CPU 架构(x86、ARM、MIPS、RISC-V 等)有各自的指令集和语法。
语言特点
- 极致性能:直接操控 CPU 寄存器和内存,无法更快的执行速度
- 硬件控制:精确控制每一条指令的执行
- 无抽象:没有高级语言的结构化抽象,所有逻辑需手动实现
- 架构相关:x86、ARM、MIPS 等架构的汇编语法各不相同
- 调试利器:理解汇编是逆向工程和安全分析的基础
Hello World
asm
; x86-64 Linux 系统调用版本
section .data
msg db "Hello, World!", 10 ; 10 = 换行符
len equ $ - msg ; 计算字符串长度
section .text
global _start
_start:
; write(1, msg, len)
mov rax, 1 ; sys_write 系统调用号
mov rdi, 1 ; 文件描述符: stdout
mov rsi, msg ; 缓冲区地址
mov rdx, len ; 字节数
syscall
; exit(0)
mov rax, 60 ; sys_exit 系统调用号
xor rdi, rdi ; 退出码 0
syscall基础语法
寄存器
x86-64 架构的主要寄存器:
asm
; 通用寄存器
RAX - 累加器,函数返回值
RBX - 基址寄存器
RCX - 计数器
RDX - 数据寄存器
RSI - 源索引
RDI - 目标索引
RSP - 栈指针
RBP - 基址指针
R8-R15 - 扩展寄存器数据传送
asm
mov rax, 42 ; 立即数 → 寄存器
mov rax, rbx ; 寄存器 → 寄存器
mov rax, [rbx] ; 内存 → 寄存器
mov [rbx], rax ; 寄存器 → 内存
mov rax, [rbx + 8] ; 带偏移的内存访问算术运算
asm
add rax, rbx ; rax = rax + rbx
sub rax, 10 ; rax = rax - 10
imul rax, rbx ; rax = rax * rbx
inc rax ; rax = rax + 1
dec rax ; rax = rax - 1控制流
asm
; 无条件跳转
jmp label
; 条件跳转
cmp rax, rbx
je equal_label ; 等于时跳转
jne not_equal_label ; 不等于时跳转
jl less_label ; 小于时跳转
jg greater_label ; 大于时跳转
; 循环
mov rcx, 10
loop_start:
; 循环体
dec rcx
jnz loop_start ; rcx 不为零时继续函数调用
asm
; 调用函数
call my_function
; 返回
ret
; 函数定义(遵循 System V ABI)
my_function:
push rbp ; 保存旧栈帧
mov rbp, rsp ; 建立新栈帧
; 函数体...
pop rbp ; 恢复栈帧
ret应用领域
- 操作系统内核:启动代码、中断处理、上下文切换
- 设备驱动:硬件驱动的底层实现
- 性能优化:热点代码的极致优化(编译器内联汇编)
- 逆向工程:软件安全分析和漏洞挖掘
- 嵌入式系统:裸机编程和固件开发
- 编译器开发:代码生成阶段的指令选择
开发环境搭建
- 安装汇编器:NASM (
sudo apt install nasm) 或 GAS - 编译:
nasm -f elf64 hello.asm - 链接:
ld -o hello hello.o - 运行:
./hello - 调试工具:GDB、objdump、radare2
学习路线
- 入门阶段:寄存器和数据类型 → 指令格式 → 基本算术和逻辑
- 进阶阶段:内存寻址 → 控制流 → 函数调用约定 → 栈帧
- 实战阶段:系统调用 → 与 C 语言混合编程 → 内联汇编
- 高级阶段:SIMD 向量化 → 逆向工程 → 漏洞分析
参考资源
- x86 汇编指令参考 - 完整指令集文档
- NASM 文档 - NASM 汇编器文档
- Assembly Programming Tutorial - 入门教程