一、寄存器 寄存器是中央处理器(CPU)内部集成的一组高速、小型的存储单元,其容量通常仅为几个字节(如8位、16位、32位或64位),但访问速度远高于主内存(RAM)甚至高速缓存(Cache)。它们直接与CPU的算术逻辑单元(ALU)、控制单元(CU)以及其他执行部件相连,是CPU执行指令过程中最核心的数据暂存和传递媒介。
寄存器的主要用途包括:暂存参与运算的操作数、保存运算结果、存储程序执行状态、管理程序流程、支持内存寻址与栈操作、控制CPU运行模式与系统功能等。
但由于寄存器数量有限(但据相关统计多于560个,包含部分保留寄存器),编译器和操作系统需高效利用这些宝贵资源。并正因其极低的访问延迟和紧密耦合于CPU执行流水线的特性,寄存器被视为计算机体系结构中“最快”的存储层级,对程序性能具有决定性影响。可以说,没有寄存器,现代高性能计算将无法实现。
通用寄存器 寄存器名称 8008/8051 8086 x86 x64 作用 累加器 AL, AH AX EAX RAX 算术运算、I/O、函数返回值 基址寄存器 BL, BH BX EBX RBX 存储数据基地址 计数寄存器 CL, CH CX ECX RCX 循环计数、移位次数 数据寄存器 DL, DH DX EDX RDX I/O端口、乘除高位结果 源变址寄存器 SIL SI ESI RSI 字符串/数组源地址 目标变址寄存器 DIL DI EDI RDI 字符串/数组目标地址 栈指针 SPL SP ESP RSP 指向栈顶 基址指针 BPL BP EBP RBP 指向当前栈帧基址 扩展通用寄存器 R8B–R15B R8W–R15W R8D–R15D R8–R15 额外通用用途,参数传递(System V ABI)
注:R8–R15 在 x64 中新增,8086/x86 不存在;它们支持 8/16/32 位子寄存器(如 R9D、R10W、R11B),但无高8位(如 AH 类似物)。
标志寄存器 寄存器名称 8086 x86 x64 作用 标志寄存器 FLAGS EFLAGS RFLAGS 存储状态与控制标志
可修改标志位 标志位 位位置 0 1 作用 CF 0 NC(无进位) CY(有进位) 记录无符号运算的进位或借位 PF 2 PO(奇校验) PE(偶校验) 反映结果低8位中“1”的个数奇偶性 AF 4 NA(无辅助进位) AC(有辅助进位) 用于BCD运算,低4位是否产生进位/借位 ZF 6 NZ(非零) Z(零) 运算结果是否为零 SF 7 PL(正) NG(负) 运算结果的符号(最高位) TF 8 正常工作 单步中断 单步调试模式控制 IF 9 DI(中断禁止) EI(中断允许) 控制可屏蔽中断是否响应 DF 10 ED(地址递增) DD(地址递减) 控制字符串操作方向 OF 单步中断 NV(无溢出) OV(有溢出) 记录有符号运算是否溢出
不可修改的标志位 标志/域 位位置 值 = 0 的含义 值 = 1 的含义 架构支持 IOPL 12–13 I/O 特权级为 0(最高权限)(注:实际为 2 位字段,00=0, 01=1, 10=2, 11=3) I/O 特权级为 1/2/3(权限逐级降低)CPL 必须 ≤ IOPL 才能执行 I/O 指令 8086 起支持 NT 14 当前任务不是嵌套任务 当前任务是由另一任务调用的嵌套任务 8086 起支持,x64 长模式下无效 RF 16 正常处理调试异常(如断点) 临时屏蔽调试异常,用于单步跳过断点 80386 起支持 VM 17 处于保护模式(非虚拟 8086 模式) 处于虚拟 8086 模式(在保护模式下模拟实模式) 80386 起支持,x64 长模式下无效 AC 18 禁用对齐检查(即使 CR0.AM=1 也不生效) 启用对齐检查(需同时满足 CR0.AM=1 且 CPL=3) 80486 起支持 VIF 19 虚拟中断禁止 虚拟中断允许(作为 IF 的虚拟镜像) Pentium 起支持 VIP 20 无虚拟中断挂起 有虚拟中断正在挂起 Pentium 起支持 ID 21 CPU 不支持 CPUID 指令(或无法修改该位) CPU 支持 CPUID 指令(可通过置位测试) 80486DX 及以后支持
指令指针寄存器 寄存器名称 8086 x86 x64 作用 指令指针 IP EIP RIP 指向下一条要执行的指令地址
注意:不能像通用寄存器那样直接MOV RIP, RAX(非法),必须用JMP/CALL。
段寄存器 寄存器名称 8086 x86 x64 作用 代码段 CS CS CS 当前代码段选择 数据段 DS DS DS 默认数据段选择 栈段 SS SS SS 栈段选择 附加段 ES ES ES 额外数据段 数据段 FS FS FS OS 特殊用途 数据段 GS GS GS OS 特殊用途
控制寄存器 寄存器名称 x86 x64 作用 CR0 CR0 CR0 控制保护模式、分页、协处理器等 CR1 保留 保留 未使用 CR2 CR2 CR2 页错误时的线性地址 CR3 CR3 CR3 页目录基地址(含PCID in x64) CR4 CR4 CR4 启用PSE、PGE、DE、SMEP等扩展 CR8 — CR8 APIC 中断优先级屏蔽
控制寄存器仅能在特权级别(CPL=0)通过MOV CRx, reg/MOV reg, CRx访问,不可拆分。
调试寄存器 寄存器名称 x86 x64 作用 DR0 DR0 DR0 硬件断点地址 0 DR1 DR1 DR1 硬件断点地址 1 DR2 DR2 DR2 硬件断点地址 2 DR3 DR3 DR3 硬件断点地址 3 DR4 DR6(别名) DR6(别名) 若 CR4.DE=1 则不可用 DR5 DR7(别名) DR7(别名) 若 CR4.DE=1 则不可用 DR6 DR6 DR6 断点状态(哪个触发、原因) DR7 DR7 DR7 断点控制(类型、长度、使能)
描述符表与任务寄存器 寄存器名称 x86 x64 作用 GDTR GDTR GDTR 全局描述符表基址+限长(48位) LDTR LDTR LDTR 局部描述符表选择子(16位) IDTR IDTR IDTR 中断描述符表基址+限长(48位) TR TR TR 任务寄存器(指向TSS)
这些是特殊结构寄存器,通过LGDT/SGDT、LIDT/SIDT、LTR/STR等专用指令访问,不可拆分。
模型特定寄存器(MSR) 寄存器名称(示例) x86 x64 作用 IA32_APIC_BASE Pentium+ 支持 APIC 基地址 IA32_SYSENTER_CS P6+ 支持 快速系统调用代码段 IA32_SYSENTER_ESP P6+ 支持 快速系统调用栈指针 IA32_SYSENTER_EIP P6+ 支持 快速系统调用入口 IA32_EFER AMD K6 x64 必需 启用长模式(LME)、NX bit IA32_STAR / LSTAR — 支持 syscall/sysret 目标地址
MSR 数量庞大(数百个),通过RDMSR/WRMSR指令访问(需 CPL=0),每个为 64 位,不可拆分。8086 和早期 x86 不支持。
x87 寄存器 寄存器名称 作用简述 ST0–ST7 浮点运算栈式寄存器,ST0 为栈顶 FPCW 控制浮点运算的舍入模式和异常屏蔽 FPSW 记录浮点状态,包括异常标志和栈顶指针 FPTW 标记每个 STn 寄存器内容的有效性 FIP 保存引发浮点异常的指令地址 FDP 保存引发浮点异常的操作数内存地址 FOP 保存最后执行的 x87 指令操作码
MMX 寄存器 寄存器名称 作用简述 MM0–MM7 用于整数 SIMD 运算,复用 x87 寄存器的尾数部分
SSE / AVX / AVX-512 寄存器 寄存器名称 作用简述 XMM0–XMM31 128 位向量寄存器,用于 SSE/AVX 标量与向量运算 YMM0–YMM31 256 位向量寄存器,扩展 XMM 的高 128 位 ZMM0–ZMM31 512 位向量寄存器,扩展 YMM 的高 256 位 K0–K7 操作掩码寄存器,用于条件执行;K0 读恒为全 1,不可写 MXCSR 控制和记录 SIMD 浮点状态(如舍入、异常、非规格化数处理)
MPX 边界寄存器 寄存器名称 作用简述 BND0–BND3 存储指针访问的下限和上限地址边界 BNDCFGU 用户模式边界检查配置 BNDCFGS 内核模式边界检查配置 BNDSTATUS 记录边界检查失败原因(#BR 异常时)
二、助记符 一、数据传送类 分类 名称 类型 作用 示例 数据传送 mov 指令 将数据从源操作数复制到目的操作数 mov ax, bx数据传送 push 指令 将操作数压入栈顶(SP/RSP 自减后写入) push cx数据传送 pop 指令 从栈顶弹出数据到操作数(读取后 SP/RSP 自增) pop dx数据传送 pushf 指令 将标志寄存器压入栈 pushf数据传送 popf 指令 从栈弹出数据到标志寄存器 popf数据传送 in 指令 从指定 I/O 端口读取数据 in al, 60h数据传送 out 指令 将数据写入指定 I/O 端口 out 61h, al
二、算术运算类 分类 名称 类型 作用 示例 算术运算 add 指令 执行加法(目的 = 目的 + 源) add ax, 100算术运算 adc 指令 带进位加法(加上 CF 标志) adc dx, ax算术运算 sub 指令 执行减法(目的 = 目的 - 源) sub bx, cx算术运算 mul 指令 无符号乘法;被乘数隐含在 AL/AX/EAX 中,结果在 AX/DX:AX/EDX:EAX mul bl→ AX = AL × BL算术运算 div 指令 无符号除法;被除数隐含在 AX/DX:AX 中 div cl→ AL=商, AH=余数算术运算 inc 指令 对操作数加 1(不影响 CF) inc si比较操作 cmp 指令 比较两操作数(源 - 目),仅更新标志位(ZF、CF、SF、OF 等),不保存结果 cmp ax, bx
三、逻辑与移位类 分类 名称 类型 作用 示例 逻辑运算 and 指令 按位与,常用于清零特定位 and al, 0Fh逻辑运算 or 指令 按位或,常用于置位特定位 or dh, 80h移位操作 shl 指令 逻辑左移(等价于乘以 2ⁿ) shl ax, 1移位操作 shr 指令 逻辑右移(等价于无符号除以 2ⁿ) shr bx, cl
四、程序控制转移类 (1)无条件转移 分类 名称 类型 作用 示例 控制转移 jmp 指令 无条件跳转到目标地址 jmp label控制转移 call 指令 调用子程序(压入返回地址后跳转) call func控制转移 ret 指令 近返回:弹出返回地址到 IP/EIP ret控制转移 retf 指令 远返回:弹出 IP 和 CS(跨段返回) retf
(2)条件转移 分类 名称 类型 作用 示例 控制转移 je 指令 若 ZF=1(相等/为零)则跳转 je equal控制转移 jne 指令 若 ZF=0(不等/非零)则跳转 jne not_equal控制转移 jb 指令 若 CF=1(无符号小于)则跳转 jb below控制转移 jnb 指令 若 CF=0(无符号大于等于)则跳转 jnb not_below控制转移 ja 指令 若 CF=0 且 ZF=0(无符号大于)则跳转 ja above控制转移 jna 指令 若 CF=1 或 ZF=1(无符号小于等于)则跳转 jna not_above控制转移 jcxz 指令 若 CX=0 则跳转(不依赖标志) jcxz skip控制转移 loop 指令 CX 减 1,若 ≠0 则跳转(用于循环) loop repeat
五、字符串操作类 分类 名称 类型 作用 示例 字符串操作 movsb 指令 传送一个字节:[DS:SI] → [ES:DI],自动更新 SI/DI movsb字符串操作 movsw 指令 传送一个字(2 字节),SI/DI ±2 movsw字符串操作 rep 指令前缀 重复执行后续字符串指令 CX/ECX 次 rep movsb
六、中断与系统控制类 分类 名称 类型 作用 示例 系统控制 int 指令 触发软件中断,调用中断服务程序 int 21h系统控制 iret 指令 中断返回:恢复 IP、CS 和 FLAGS iret系统控制 cli 指令 清除 IF 标志,禁止可屏蔽中断 cli系统控制 sti 指令 设置 IF 标志,允许可屏蔽中断 sti系统控制 nop 指令 空操作,占用 1 字节,用于延时或对齐 nop
七、汇编伪操作与操作符(非 CPU 指令) 分类 名称 类型 作用 示例 程序结构 start 伪操作/标号 通常用作程序入口标号(非关键字,但约定俗成) start:``mov ax, @data程序结构 end 伪操作 标记汇编源程序结束,可指定入口点 end start数据定义 db 伪操作 定义字节(8 位)数据 msg db 'Hi', 0数据定义 dw 伪操作 定义字(16 位)数据 len dw 256数据定义 dd 伪操作 定义双字(32 位)数据 ptr dd offset var数据定义 dup 伪操作修饰符 重复初始化若干相同值 buf db 100 dup(?)地址操作 offset 操作符 获取变量或标号的段内偏移地址 mov ax, offset buffer类型指定 byte ptr 操作符 显式指定内存操作数为字节类型 mov byte ptr [bx], 0类型指定 word ptr 操作符 显式指定内存操作数为字类型 mov word ptr [si], ax跳转修饰 short 操作符 指明短跳转(±127 字节内) jmp short next跳转修饰 near ptr 操作符 表示段内(近)调用或跳转 call near ptr proc跳转修饰 far ptr 操作符 表示段间(远)调用或跳转 jmp far ptr fproc通用指针 ptr 操作符 明确操作数为指针类型,常与 near/far 连用 jmp dword ptr [table]
三、其他 (一)不同语言格式对比 类别 Intel AT&T 示例 add eax,0x4 add $0x4,%eax 使用的工具 MASM、NASM GNU工具(gcc、gdb……) 特定前缀 / 寄存器:% 操作数:$ 操作数的顺序 左:目的操作数 右:源操作数 左:源操作数 右:目的操作数
示例程序 (人不够聪明,只能看千问的答案啦)
;============================================================= ; demo.asm —— 标准 DOS MASM 程序 ; 功能:演示通用寄存器、标志、栈、算术、逻辑、字符串、中断 ; 环境:DOS(如 DOSBox) ; 编译命令: ; masm demo.asm; ; link demo.obj; ; demo.exe ;============================================================= .MODEL SMALL ; 小内存模型:代码段+数据段各≤64KB .STACK 200h ; 定义200h字节栈空间 .DATA src_str DB 'HELLO$' ; 源字符串(DOS中断要求以$结尾) dst_buf DB 6 DUP(?) ; 目标缓冲区(5字符+结束符) msg_len = 5 ; 字符串长度(常量) new_line DB 0Dh, 0Ah, '$' ; 回车换行符 .CODE MAIN PROC ; 初始化 DS 指向数据段[2,5](@ref) MOV AX, @DATA MOV DS, AX MOV ES, AX ; ES=DS,用于字符串指令 ; === 1. 通用寄存器操作 === MOV AX, 100 ; 累加器 MOV BX, 200 ; 基址寄存器 ADD AX, BX ; AX = 300 MOV DX, AX ; 数据寄存器保存结果 ; === 2. 标志寄存器操作 === PUSHF ; 压入标志寄存器 CMP AX, 300 ; 比较(ZF=1) POPF ; 弹出恢复标志 ; === 3. 条件跳转 === JNE skip_section ; 若不等则跳(实际不跳) ; === 4. 计数与字符串复制 ===[6](@ref) MOV CX, msg_len ; CX = 计数寄存器 MOV SI, OFFSET src_str ; SI = 源变址寄存器 MOV DI, OFFSET dst_buf ; DI = 目标变址寄存器 CLD ; 清方向标志(DF=0,地址递增) REP MOVSB ; 重复传送字节(CX次) ; 在目标字符串末尾添加DOS结束符$ MOV AL, '$' MOV [DI], AL skip_section: ; === 5. 逻辑与移位 === MOV AL, [dst_buf] ; 取首字符 'H' (48h) AND AL, 0Fh ; 保留低4位 → 08h SHL AL, 1 ; 左移1位(×2) SHR AL, 1 ; 右移1位(÷2,恢复原值低4位) ; === 6. DOS 中断输出字符串 ===[5](@ref) ; 显示源字符串 MOV AH, 09h ; DOS功能号:显示字符串 MOV DX, OFFSET src_str ; DS:DX指向字符串 INT 21h ; 显示换行 MOV AH, 09h MOV DX, OFFSET new_line INT 21h ; 显示复制后的字符串 MOV AH, 09h MOV DX, OFFSET dst_buf INT 21h ; === 7. 程序退出 === MOV AX, 4C00h ; DOS功能号:程序退出 INT 21h MAIN ENDP ; 过程结束[1](@ref) END MAIN ; 程序结束,入口为MAIN[5](@ref): 终止程序 INT 21h SKIP: ; 理论上不会执行至此 HLT ; 停机(占位) MAIN ENDP END MAIN