【30天精通汇编】Day 2: CPU架构与寄存器
📅 学习时间:4-5小时
🎯 学习目标:理解CPU工作原理,掌握x86寄存器
💡 难度:★★☆☆☆
📝 Day 1 练习题答案
练习1: - 10110(二进制) = 16+4+2 = 22(十进制) - 42(十进制) = 101010(二进制) - 11011110(二进制) = DE(十六进制) 练习2: -10的8位补码: 10 = 0000 1010 取反 = 1111 0101 加1 = 1111 0110 = 0xF6 练习3: 0xAB & 0x0F = 0x0B (1010 1011 & 0000 1111 = 0000 1011)1. CPU是什么
1.1 CPU的角色
CPU = Central Processing Unit = 中央处理器 把计算机比作一个工厂: 【内存 (仓库)】 存放数据,等待被处理 ↑↓ 数据搬运 【CPU (车间)】 - 寄存器 (工作台):临时存放数据 - 运算单元 (加工机器):执行计算 CPU的工作: 1. 从内存取指令 2. 解码指令 3. 执行指令 4. 存储结果1.2 CPU的基本组成
【CPU的基本组成】 1. 控制单元 (CU) - 解析指令,控制执行流程 2. 寄存器组 (Registers) - 临时存储数据 3. 算术逻辑单元 (ALU) - 执行加减乘除运算 4. 缓存 (Cache) - 高速临时存储2. x86架构演进
2.1 从8086到x64
年代 CPU 位数 寄存器名 1978 8086 16位 AX, BX, CX, DX 1985 80386 32位 EAX, EBX, ECX, EDX 2003 x86-64 64位 RAX, RBX, RCX, RDX 命名规则: AX = 16位 (原始) EAX = Extended AX = 32位 RAX = 64位 (x64架构) 关系(从大到小嵌套): RAX (64位) -> EAX (低32位) -> AX (低16位) -> AH (高8位) + AL (低8位)3. x86通用寄存器(32位)
3.1 四大数据寄存器
四大数据寄存器: EAX - 累加器 (Accumulator) 用途:算术运算结果、函数返回值 EBX - 基址寄存器 (Base) 用途:存储内存地址基址 ECX - 计数器 (Counter) 用途:循环计数、字符串操作 EDX - 数据寄存器 (Data) 用途:I/O操作、乘除法扩展3.2 指针和索引寄存器
指针和索引寄存器: ESP - 栈指针 (Stack Pointer) 用途:指向栈顶(非常重要!) EBP - 基址指针 (Base Pointer) 用途:指向栈帧底部 ESI - 源索引 (Source Index) 用途:字符串操作的源地址 EDI - 目的索引 (Destination Index) 用途:字符串操作的目标地址3.3 指令指针和标志寄存器
指令指针和标志寄存器: EIP - 指令指针 用途:指向下一条要执行的指令 EFLAGS - 标志寄存器 用途:存储CPU状态标志 EIP是最重要的寄存器之一! 控制EIP就能控制程序执行流程。4. 标志寄存器详解
4.1 常用标志位
EFLAGS寄存器各位含义: 位 名称 全称 含义 ───────────────────────────────────────────────── 0 CF Carry Flag 进位/借位标志 2 PF Parity Flag 奇偶标志 4 AF Adjust Flag 辅助进位标志 6 ZF Zero Flag 零标志(结果是否为0) 7 SF Sign Flag 符号标志(结果正负) 11 OF Overflow Flag 溢出标志 最常用的: CF - 无符号运算溢出 ZF - 结果是否为零(用于比较) SF - 结果的符号位 OF - 有符号运算溢出4.2 标志位示例
例1:1 - 1 = 0 执行后:ZF = 1(结果为零) 例2:-1 + 1 = 0(有符号) 执行后:ZF = 1, CF = 1(产生进位) 例3:5 - 10 = -5 执行后:SF = 1(结果为负) 例4:127 + 1 = 128(8位有符号) 实际结果:-128(溢出!) 执行后:OF = 1(有符号溢出)5. x64寄存器扩展
5.1 64位寄存器
x64在x86基础上扩展: 原有寄存器扩展到64位: RAX, RBX, RCX, RDX RSP, RBP, RSI, RDI RIP, RFLAGS 新增8个通用寄存器: R8, R9, R10, R11, R12, R13, R14, R15 每个新寄存器也有低位访问: R8 → R8D (低32位) → R8W (低16位) → R8B (低8位)5.2 x64调用约定
Windows x64调用约定: 参数1: RCX 参数2: RDX 参数3: R8 参数4: R9 其余参数:通过栈传递 返回值:RAX Linux x64调用约定: 参数1: RDI 参数2: RSI 参数3: RDX 参数4: RCX 参数5: R8 参数6: R9 其余参数:通过栈传递 返回值:RAX6. 段寄存器
段寄存器: CS - 代码段:存放代码的内存段 DS - 数据段:存放数据的内存段 SS - 栈段:存放栈的内存段 ES - 附加段:额外的数据段 FS - 附加段:Windows下指向TEB/TIB GS - 附加段:Linux x64下用于TLS 在32位保护模式下,段寄存器存放"段选择子" 在64位模式下,大多数段寄存器基址为0(平坦内存模型)7. 寄存器使用总结
记忆口诀: "累加器做运算,基址寄存器找地址, 计数器管循环,数据寄存器帮乘除。 栈指针在栈顶,基址指针在栈底, 源索引取数据,目的索引放数据。 指令指针最重要,控制程序往哪跑。" 关键点: 1. EAX通常存返回值 2. ECX用于循环计数 3. ESP/EBP用于栈操作 4. EIP决定下一条指令 5. 标志位影响条件跳转8. 练习题
练习1:寄存器识别(难度:★☆☆☆☆)
说出以下寄存器的主要用途:
- EAX
- ESP
- ECX
练习2:标志位理解(难度:★★☆☆☆)
执行 5 - 5 后,哪个标志位会被设置为1?
练习3:寄存器关系(难度:★★☆☆☆)
如果RAX = 0x123456789ABCDEF0,求EAX, AX, AL的值?
9. 小结
[CPU基础] 1. CPU = 控制单元 + ALU + 寄存器 2. 取指令 → 解码 → 执行 → 存储 [x86寄存器] 3. 通用寄存器:EAX, EBX, ECX, EDX 4. 指针寄存器:ESP, EBP, ESI, EDI 5. 特殊寄存器:EIP, EFLAGS [标志位] 6. ZF - 零标志 7. SF - 符号标志 8. CF - 进位标志 9. OF - 溢出标志 [x64扩展] 10. 扩展到64位:RAX, RBX... 11. 新增:R8-R15下一篇预告:Day 3 - 内存与寻址模式