汇编程序语言-x86处理器架构
基本微机设计
假想机中包含以下部分:
CPU
CPU包含
- 寄存器 有限数量的储存位置
- 时钟 系统中每一个操作的同步都依赖于时钟,机器指令的基本时间单位是机器周期或时钟周期,CPU不执行指令的时钟周期成为空时间周期,aka 等待状态(wait states)
- 控制单元 协调参与机器指令执行的步骤序列
- 算术逻辑单元 执行算数运算与逻辑运算
总线
- 数据总线 在CPU和内存间传输指令和数据
- I/O总线 在CPU和系统输入输出设备间传输数据
- 控制总线 对所有连接在系统总线上的设备行为进行同步
- 地址总线 保持指令和数据的地址
指令执行周期
- CPU从指令队列中取得指令,并使得指令指针自增
- 对指令的二进制位模式进行译码
- 如果有操作数,CPU从寄存器和内存中取得操作数
- CPU执行指令,同时更新状态标志位
- 如果需要输出操作数,CPU存放执行结果
简写为:取指(Fetch)->译码(Decode)->执行(Execute)
读取内存
- 将想要读取的值放到地址总线上
- 设置处理器RD引脚
- 等待一个时钟周期让储存器芯片进行相应
- 将数据从数据总线复制到目标操作数
上述每一个步骤往往只需要一个时钟周期
加载并执行程序
- OS搜索程序
- OS访问磁盘上程序的文件信息
- OS确定内存中可使用的位置并将程序文件加载到内存,OS可能调整程序指针的位置使其包括程序数据位置
- OS执行程序入口
32位x86处理器
操作模式
- 保护模式 保护模式是处理器的native状态,可使用所有指令和特性,处理器会阻止程序使用自身段以外的内存
- 虚拟8086模式 在该模式下,处理器可以在安全环境中直接执行实地址模式软件而不影响同一时间内执行的其他程序
- 实地址模式 允许程序直接访问系统内存和硬件设备并进行模式切换
- 系统管理模式 向OS提供电源管理和系统安全等功能的机制
基本执行环境
地址环境
32位保护模式下,一个程序最大可寻址4GB的线性地址空间(这是由于 $ 2^{32} \, \mathrm{B} = 4294967296 \, \mathrm{B} = 4 \, \mathrm{GiB} $),后来引入了扩展物理寻址技术(PAE),使这一限制突破至了64GB。
实地址模式下,程序只能寻址1MB的空间,同样的,处于虚拟8086模式中的程序也只能寻址1MB的空间
基本程序执行寄存器
通用寄存器
用于算术运算和数据传输
其中EAX,EBX,ECX,EDX既可以处理8位的值也可以处理16位的值
32位 | 16位 | 高8位 | 低8位 |
---|---|---|---|
EAX | AX | AH | AL |
… | … | … | … |
其它通用寄存器只能用32位或16位来访问
32位 | 16位 |
---|---|
ESI | SI |
EDI | DI |
EBP | BP |
ESP | SP |
特殊用法
- 乘除指令默认使用EAX,aka扩展累加器(extended accumulator)
- 默认使用ECX作为循环计数器
- ESP用于寻址堆栈数据,aka扩展堆栈指针寄存器(extended stack pointer)
- ESI和EDI用于高数存储器传输指令,aka拓展源变址(extended source index)和扩展目的变址(extended destination index)寄存器
- 高级语言通过EBP来引用堆栈中的函数参数和局部变量,除了高级编程,一般不用于算术运算和数据传输,aka扩展帧指针(extended frame pointer)
段寄存器
- CS
- SS
- DS
- ES
- FS
- GS
实地址模式中,16位段寄存器表示的是预先分配的内存区域的基址,称为段
保护模式中,段寄存器中存放的是段描述符指针
一些段中存放程序指令,其它段存放数据,堆栈段存放局部函数变量和函数参数
指令指针EIP
指令指针包含下一条要执行的指令的位置,某些机器指令控制EIP,使程序能够发生分支跳转
EFLAGS
包含一些状态标志位,能够控制CPU的操作或者反应CPU执行的结果
设置标志位(Set)时,标志位为1;清除标志位时(Clear),标志位为0
控制标志位
能够使CPU进入中断状态或者切换执行模式
状态标志位
- 进位CF(Carry Flag) 与目标位置相比,无符号算术运算结果太大时,设置该标志位
- 溢出OF(Overflow Flag) 与目标位置相比,有符号算术运算结果太大
- 符号标志位SF 操作产生负结果
- 零标志位ZF 操作产生0结果
- 辅助进位AC 算术操作在8位操作数中产生了位3向位4的进位
- 奇偶校验PF 结果的最低有效字节包含偶数个1
MMX寄存器
一组支持SIMD指令的寄存器,能加速相关运算
XMM寄存器
x86结构包括8个128位XMM寄存器,被用于SIMD流扩展指令集
浮点单元
执行高速浮点运算。
FPU中含有8个浮点数据寄存器命名为ST(x),其中x可为0~7
此外也有两个48位指针寄存器,三个16位控制寄存器以及一个操作码寄存器
x86内存管理
MS-DOS运行在实地址模式,MS-Windows和Linux运行在保护模式,在Windows NT和2000下,他们的命令窗口运行在虚拟8086模式下
64位x86-64处理器
- 向后兼容x86
- 地址长度为64位
- 可以使用64位寄存器,允许指令具有64位操作数
- 比x86多了8个通用寄存器
- 物理地址为48位
- 运行于64位模式时不支持16位实模式和虚拟8086模式,在兼容模式时支持16位编程
基本执行环境的区别
- 16个64位通用寄存器
- 8个80位浮点寄存器
- 1个64位状态标志寄存器RFLAGS(只使用低32位)
- 1个64位指令指针寄存器RIP
- 8个64位MMX寄存器
- 16个128位XMM寄存器
- 64位模式下,单条指令不能同时访问寄存器高字节和新字节寄存器的低字节
- 64位模式下,EFLAGS和RFLAGS共享低32位
- 具有相同的状态标志
REX前缀下可用的寄存器:
操作数大小 | 可用寄存器 |
---|---|
8 | AL,BL,CL,DL,DIL,SIL,BPL,SPL,R8L,R9L,R10L,R11L,R12L,R13L,R14L,R15L |
16 | AX,BX,CX,DX,DI,SI,BP,SP,R8W,R9W,R10W,R11W,R12W,R13W,R14W,R15W |
32 | EAX,EBX,ECX,EDX,EDI,ESI,EBP,ESP,R8D,R9D,R10D,R11D,R12D,R13D,R14D,R15D |
64 | RAX,RBX,RCX,RDX,RDI,RSI,RBP,RSP,R8,R9,R10,R11,R12,R13,R14,R15 |