Skip to content

x86汇编语言基础

考情分析

程序的机器级代码表示是 2022 年新增考点,但相关知识早在 2012、2014、2015、2017 年就以综合题出现。统考主要考查 x86 指令(Intel 格式),偶尔涉及 MIPS(会附功能说明)。

x86 通用寄存器

x86 有 8 个 32 位通用寄存器:

寄存器低16位高/低8位常见用途
EAXAXAH/AL累加器,函数返回值
EBXBXBH/BL基址寄存器
ECXCXCH/CL计数器(循环/移位)
EDXDXDH/DL数据寄存器,乘除法扩展
ESISI源变址寄存器
EDIDI目的变址寄存器
EBPBP基址指针(栈帧底部)
ESPSP栈指针(栈顶)

EBP 和 ESP 有专用功能,其余寄存器用途较灵活。

操作数标记

  • <reg>:寄存器(如 eax、ebx)
  • <mem>:内存地址(如 [eax][ebp-8]dword ptr [eax+ebx*4+8]
  • <con>:立即数/常数

两个操作数不能同时为内存

常用指令

以下使用 Intel 格式(目的操作数在前,源操作数在后)。

数据传送指令

指令语法功能
movmov dst, src将 src 复制到 dst
pushpush srcESP-4,再将 src 压入栈顶
poppop dst弹出栈顶到 dst,ESP+4
lealea dst, [addr]将有效地址(非内存内容)加载到 dst
asm
mov eax, ebx           ; R[eax] <- R[ebx]
mov eax, [ebp+8]       ; R[eax] <- M[R[ebp]+8]
mov [ebp-4], eax       ; M[R[ebp]-4] <- R[eax]
push eax               ; ESP-4, M[ESP] <- R[eax]
pop ebx                ; R[ebx] <- M[ESP], ESP+4
lea eax, [edx+eax*2+8] ; R[eax] <- R[edx]+R[eax]*2+8(计算地址,不访存)

lea 是"取地址"指令,常被编译器用来做加法运算(如 lea eax, [edx+eax] 等价于 add eax, edx)。

算术与逻辑运算指令

指令功能示例
add加法,结果存入第一操作数add eax, 10
sub减法sub eax, ebx
inc/dec自增/自减 1inc eax
imul有符号乘法imul eax, ebx
idiv有符号除法,被除数为 edx:eaxidiv ecx
neg取负(补码)neg eax
and/or/xor按位与/或/异或and eax, 0FH
not按位取反not eax
shl/shr逻辑左移/右移shl eax, 1
sal/sar算术左移/右移sar eax, 2
asm
xor edx, edx      ; 将 edx 清零(常见技巧)
imul esi, edi, 25  ; R[esi] <- R[edi] * 25
idiv ebx           ; eax <- edx:eax / ebx(商),edx <- 余数

控制流指令

指令功能
jmp label无条件转移到 label
cmp a, b计算 a-b 并设置标志位,不保存结果
test a, b计算 a AND b 并设置标志位,不保存结果
je/jz相等(ZF=1)时转移
jne/jnz不等(ZF=0)时转移
jg/jge大于/大于等于时转移(有符号)
jl/jle小于/小于等于时转移(有符号)
ja/jae高于/高于等于时转移(无符号)
jb/jbe低于/低于等于时转移(无符号)
call label将返回地址压栈,转移到 label
ret弹出返回地址,转移回调用点
asm
cmp eax, ebx
jle done        ; 若 eax <= ebx,转移到 done
test eax, eax
jz xxxx         ; 若 eax == 0,转移到 xxxx

AT&T 格式 vs Intel 格式

区别AT&TIntel
操作数顺序源, 目的目的, 源
寄存器%eaxeax
立即数$100100
内存引用(%eax)[eax]
长度后缀movl(32位) / movw(16位) / movb(8位)dword ptr / word ptr / byte ptr
复杂寻址8(%edx, %eax, 2)[edx+eax*2+8]

统考通常使用 Intel 格式。

对比示例

AT&TIntel含义
movl $100, %eaxmov eax, 100100R[eax]
movl %eax, (%ebx)mov [ebx], eaxR[eax]M[R[ebx]]
movl %eax, -8(%ebp)mov [ebp-8], eaxR[eax]M[R[ebp]-8]

考点清单

  • x86 有 8 个 32 位通用寄存器,EBP 为栈帧基址,ESP 为栈顶指针
  • 两个操作数不能同时为内存
  • lea 是取有效地址,不访存,常被用作加法/乘法
  • call = push 返回地址 + jmp 目标;ret = pop 返回地址 + jmp
  • cmp 和 test 只设标志位不保存结果,配合 jcondition 使用
  • 有符号比较用 jg/jl/jge/jle,无符号比较用 ja/jb/jae/jbe

真题练习