Intel/NASM/GAS 区别

6 阅读3分钟

Intel/NASM/GAS 区别 是汇编语言学习和实际开发中最常遇到的问题之一。
它们本质上都是x86/x86-64 汇编的语法(Syntax),但语法规则、指令格式、寄存器写法、伪指令等都有明显差异。下面详细对比(2025-2026 主流使用情况):

项目Intel 语法 (Intel Syntax)NASM (Netwide Assembler)GAS (GNU Assembler)
发明/维护者Intel 公司NASM 项目(开源)GNU 项目(Binutils 的一部分)
最常用平台Windows(MASM/Intel 风格)、游戏逆向、安全研究Windows/Linux/macOS 跨平台首选Linux/macOS(GCC/Clang 默认)、内核开发
语法类型Intel 语法(源操作数在前,目的操作数在后)Intel 语法(但更干净、现代化)AT&T 语法(目的操作数在前,源操作数在后)
指令格式示例mov eax, ebxmov eax, ebxmovl %ebx, %eax
寄存器前缀无前缀(eax, ebx, xmm0)无前缀(eax, ebx, xmm0)有前缀(%eax, %ebx, %xmm0)
立即数前缀无(mov eax, 123)无(mov eax, 123)movl(movl 123, %eax)
内存寻址[ebx + 4*ecx + 8][ebx + ecx*4 + 8]8(%ebx, %ecx, 4)
大小后缀无(mov eax, ebx)无(mov eax, ebx)有(movb / movw / movl / movq)
伪指令(定义数据)db 1,2,3
dd 0x12345678
db 1,2,3
dd 0x12345678
.byte 1,2,3
.long 0x12345678
段定义.data / .codesection .data / section .text.section .data / .text
注释; comment; comment# comment// comment(新版支持)
标签定义label:label:label:
常用编译器/工具链MASM(微软)、FASM、YASM(部分支持)、IDA ProNASM(独立汇编器)GAS(与 GCC/Clang 集成)
文件后缀.asm.asm.s 或 .S
社区/项目偏好游戏反作弊、Windows 驱动、逆向工程、CTF跨平台项目、Bootloader、个人项目、Rust 内联Linux 内核、GCC/Clang 内联汇编、嵌入式
学习难度★★☆(最直观,源→目的顺序)★★☆(最干净的 Intel 语法)★★★(AT&T 语法最怪,需要适应)

快速记忆口诀

  • Intel 语法源在前,目的在后(mov 源, 目的) → Windows/游戏/逆向常用
  • NASM最干净的 Intel 语法,几乎就是 Intel 语法 + 更现代的伪指令 → 跨平台首选
  • GASAT&T 语法目的在前,源在后,寄存器加 %,立即数加 $,内存括号写法奇怪 → Linux 内核/编译器默认

经典对比示例(同一段代码)

; NASM / Intel 语法
section .text
global _start

_start:
    mov eax, 0x12345678     ; 立即数无 $
    mov ebx, eax
    mov ecx, [ebx + 4]      ; 内存寻址方括号
    mov dword [esp-8], 0xdeadbeef

    ; 字符串
    msg db 'Hello', 0
# GAS / AT&T 语法
.text
.globl _start

_start:
    movl $0x12345678, %eax   # 立即数加 $, 寄存器加 %
    movl %eax, %ebx
    movl 4(%ebx), %ecx       # 内存寻址:偏移(基址, 索引, 比例)
    movl $0xdeadbeef, -8(%esp)

    # 字符串
    msg: .ascii "Hello\0"

2025-2026 主流选择推荐

场景推荐语法/工具链理由
Windows 开发/驱动Intel/MASM 或 NASM与微软工具链兼容最好
Linux 内核/系统编程GASGCC/Clang 默认,内核源码全是 GAS
跨平台个人项目/BootloaderNASM(强烈推荐)语法最干净,Windows/Linux/macOS 都完美支持
游戏引擎/性能优化NASM 或 Intel 内联SIMD 指令写起来最舒服
逆向工程/Shellcode/CTFIntel 语法(IDA Pro 默认)大家都用 Intel 语法看反汇编
Rust/C/C++ 内联汇编NASM(x86)或 GAS(取决于目标平台)Rust 推荐 NASM 风格

一句话总结:
想写最舒服、最跨平台的 x86/x64 汇编 → 选 NASM
在 Linux 内核或 GCC 项目里写 → 必须用 GAS
想跟 Windows 逆向/游戏社区一样看代码 → 习惯 Intel 语法(NASM 就行)