CPU
5/23/26About 3 min
CPU
寄存器
在 x86-64 架构下,寄存器主要分为以下几大类
通用寄存器
Intel X86-32 寄存器组中有8个32位的寄存器:
| 寄存器 | 英文 | 中文 | 用途 |
|---|---|---|---|
| EAX | Accumulator | 累加器 | 乘法和除法,函数返回值 |
| EBX | Base | 基址寄存器 | |
| ECX | Count | 计数器 | 循环计数等 |
| EDX | Data | 数据寄存器 | 乘除法中配合EAX |
| ESI | Source Index | 源变址寄存器 | 串操作源串指针 |
| EDI | Destination Index | 目的变址寄存器 | 目的串指针 |
| ESP | Stack Pointer | 堆栈指示器 | 指向当前程序栈顶 |
| EBP | Base Pointer | 堆栈基址寄存器 | 指向当前程序栈底 |
64 位系统中,除了上述 8 个,名字E改成S,还新增了 R8 到 R15 这 8 个额外的通用寄存器。
16位寄存器:AX、BX、CX、DX、SI、DI、BP、SP
8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL (H: 高字节, L: 低字节)
Note
可用 EAX 操作 RAX 的低32位,用 AX 操作 EAX 的低16位,用 AL 操作 AX 的低8位,用 AH 操作 AX 的高8位。
可用 r8d 操作 r8 的低32位,用 r8w 操作 r8 的低16位,用 r8b 操作 AX 的低8位
Warning
一条指令不能:
- 源操作数和目的操作数都为内存地址
- 同时使用旧的高字节(AH、BH、CH、DH)和一个新的字节寄存器最低字节寄存器(bpl、sil、dil、spl、r8b-- r15b)
标志寄存器
RFLAGS: 64位标志寄存器,EFLAGS: 32位标志寄存器。
每个flag占用其中一位
常用标志位
| SF | Sign Flag | 结果的最高二进制位为1时为1 |
| CF | Carry Flag | 产生进位或借位时为1 |
| ZF | Zero Flag | 运算结果为0时设为1 |
| OF | Overflow Flag | 两加数的最高位相同,结果的最高位与加数最高位相反 or 被减数与减数的最高位不同,差的最高位与被减数的最高位不同 |
对于有符号数运算,是否溢出可判断 OF 是否为 1;
对于无符号数运算,是否溢出可判断 CF 是否为 1;
加减法器设置FLAGS
加减运算器根据“Sub”选择信号选择进行加法或减法,做减法时,将Y取反,并将进位设为1(转换为相反数补码),进行加法运算。
- 加法时,SF:取结果最高位,CF:取加法器进位位,ZF:判断结果为零,OF:判断两加数的最高位相同,结果的最高位与加数最高位相反
- 减法时,SF,ZF,OF都与加法时相同,CF需与Sub异或(翻转)
控制标志位
DF (Direction Flag)
IF (Interrupt Flag):控制是否响应外部可屏蔽中断
TF (Trace Flag):为调试设计,TF=1时,进入单步执行模式
指令指针寄存器
- RIP / EIP:存储着下一条将要执行的指令的内存地址。
段寄存器
CS (代码段 .CODE), DS (数据段.DATA), SS (堆栈段.STACK), ES/FS/GS (附加段)。
指令流水线
- 取指令(Instruction Fetch, IF):根据PC的值从存储器取出指令。
- 指令译码(Instruction Decode, ID):产生指令执行所需控制信号。
- 取操作数(Operator Fetch, OF):读取存储器操作数或寄存器操作数。
- 执行(EXcute, EX):对操作数完成指定操作。
- 写回(Write Back, WB):将操作结果写入存储器或寄存器。
指令的提取、译码、执行重叠进行,形成了指令流水线。