惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - PKICA

gdb汇编调试 gdb-pwndbg的安装与使用指南 gdb调试插件gef C语言thread_local linux系统readelf命令使用指南 gcore转储进程内存 gdb查看命令 RGB与YUV颜色编码的区别 Rust原子类型 C++ STL求两个集合交集差集 gdb调试集锦 ubuntu24.0.4使用root用户登录 ubuntu24.0.4输入密码后跳回登录界面 AI内存压缩技术TurboQuant及存疑 ubuntu切换到指定内核版本 在没有顶级科技大佬直接背书的情况下deepseek为啥能够异军突起? HuggingFace和deepseek的关系 当前主流AI大模型 Rust写时克隆Cow系列2
汇编语言语法详解
PKICA · 2026-04-16 · via 博客园 - PKICA

众所周知,汇编是一门比较古老的语言。国内吶,向来讲究学以致用,当然这不是说这个经世致用的思想不行。按说大学都开这门课的,

但是老师当年自作主张,觉得学这门课在社会上用不到,把汇编语言这门课给换掉了。人家都说老师是引路人,可想而知,

在需要汇编知识的时候方恨读汇编迟。今天所谈,尽量通用且不考虑具体架构,从汇编语言的核心逻辑结构入手。无论是在 x86、ARM

还是 RISC-V 上,汇编语法的本质都是对机器码的文本化描述。

汇编代码的一行通常由四个部分组成:

[标号:] 指令助记符 [操作数] [;注释]

1. 指令助记符 (Mnemonics)

指令是汇编的核心,通常分为以下四大类:

数据传送 (Data Movement)

这类指令负责在寄存器、内存和立即数之间“搬运”数据。

  • MOV / LDR / STR: 将数据从源移动到目的地。

  • PUSH / POP: 栈操作,本质上是修改栈指针(SP)并移动数据。

  • LEA (Load Effective Address): x86 特有,用于计算地址而非读取内容(常被用来做快速加法)。

算术与逻辑运算 (Arithmetic & Logic)

这是 CPU 的 ALU(算术逻辑单元)负责的部分。

  • ADD / SUB: 加减法。

  • MUL / DIV: 乘除法。

  • AND / OR / XOR / NOT: 位运算。

  • CMP: 比较指令,本质是执行减法但不保存结果,只修改标志寄存器

流程控制 (Control Flow)

改变程序执行顺序(修改 PC/IP 寄存器)。

  • JMP / B: 无条件跳转。

  • JZ / JE / BNE: 条件跳转(依据上次运算的标志位,如“零标志位 Z”)。

  • CALL / BL: 调用函数(保存返回地址到栈或链接寄存器)。

  • RET: 函数返回。

2. 操作数 (Operands)

指令操作的对象,通常有三种类型:

  • 立即数 (Immediate): 硬编码在指令中的常数。例如 MOV R0, #100 (ARM) 或 mov eax, 100 (x86)。

  • 寄存器 (Register): CPU 内部存储单元。如 eax, rbp, r0, x1

  • 内存地址 (Memory): 访问 RAM 中的数据。通常用方括号 [] 表示寻址,例如 [0x401000][rbp - 8]

3. 寻址方式 (Addressing Modes)

这是汇编中最灵活也最容易出错的地方。

  • 寄存器寻址: MOV EAX, EBX (直接从寄存器读写)。

  • 基址变址寻址: [base + index * scale + disp]

    • 例如:MOV EAX, [RBP - 4](访问局部变量)。

    • 例如:MOV EAX, [EBX + ESI * 4](访问数组元素)。

  • 相对寻址: 跳转指令常用,跳转到当前指令位置的前后偏移量。

4. 标志寄存器与条件执行 (Flags)

每次运算后,CPU 会自动更新一组状态位(EFLAGS / APSR / CSR):

  • ZF (Zero Flag): 结果是否为 0。

  • SF (Sign Flag): 结果是否为负。

  • CF (Carry Flag): 无符号运算是否有进位。

  • OF (Overflow Flag): 有符号运算是否溢出。

条件执行逻辑:

汇编通过指令后缀或条件跳转利用这些位。例如 JNE (Jump if Not Equal) 实际上检查的是 ZF == 0

5. 伪指令 (Directives)

这些不是真正的 CPU 指令,而是给汇编器(如 NASM, GAS)看的指令,用于定义数据和段。

  • .section / .data / .text: 定义代码段或数据段。

  • .global: 声明全局符号,让链接器能找到。

  • DB / DW / DD: 分别定义字节 (1B)、字 (2B)、双字 (4B) 级别的数据。

  • .equ / %define: 定义常量。

6. 两种主流风格对比

在 GDB 中,你可能会看到两种风格:

特性Intel 格式 (Windows/NASM)AT&T 格式 (Linux/GAS)顺序指令 目的, 源指令 源, 目的寄存器eax%eax立即数10$10宽度后缀无 (使用 ptr)l (long), w (word) 等例子mov eax, 1movl $1, %eax

总结:

掌握汇编语法的关键在于追踪数据的流动方向以及栈指针(SP)的变化。在 GDB 中,建议始终开启 layout regs,每走一步(si)就盯着寄存器看,这比背诵语法要高效得多。

参考资料:

《简明 X86 汇编语言教程》--司徒彦南 2002 年 4 月 8 日

汇编语言