升级的方向
增强指令集
增强硬件能力,如寄存器变宽
增加运行保护
升级点
处理器概要
支持保护模式,同时支持实模式和虚拟模式
在保护模式下,支持内存分页管理、优先级保护、多任务等
总线
数据总线,32位
地址总线,32位
寄存器
通用寄存器
都是32位宽度
用途
EAX: Accumulator Register,累加寄存器,可存储指令参数(如乘法)
EBX: Base Register,基址寄存器,常保存数据段中的偏移地址
ECX: Counter Register,计数寄存器,常用于循环指令
EDX: 常用于指向IO端口
ESI: Source Index,源变址寄存器,常保存数据段中的偏移地址
EDI: Destination Index,目的变址寄存器,常保存数据段中的偏移地址
ESP: Stack Pointer,栈顶寄存器
EBP: Base Pointer,栈底寄存器
段寄存器
CS 代码段寄存器
SS 堆栈段寄存器
DS 数据段寄存器
ES 附加数据段寄存器
FS 附加数据段寄存器
GS 附加数据段寄存器
仍然还是16位,保存的是段选择符(selector),包含了段的权限和信息位置
0 1 RPL,权限位组,0为最高等级,3为一般程序级别
2 TI,段信息所在的描述符表,TI=0则在GDT,TI=1则在LDT
3~15 在描述符表中的位置,
一共可识别16384个段,14位宽
指令寄存器
EIP
32位
EIP与CX找到的段地址,相加得到下一指令的物理地址
标志寄存器
EFLAGS
32位
Intel x86 FLAGS register
Bit# Abbreviation Description Category
0 CF Carry flag S
2 PF Parity flag S
4 AF Adjust flag S
6 ZF Zero flag S
7 SF Sign flag S
8 TF Trap flag (single step) X
9 IF Interrupt enable flag C
10 DF Direction flag C
11 OF Overflow flag S
12,13 1,1 / IOPL I/O privilege level (286+ only) always 1 on 8086 and 186 X
14 1 / NT Nested task flag (286+ only) always 1 on 8086 and 186 X
15 1 on 8086 and 186, should be 0 above Reserved
16 RF Resume flag (386+ only) X
17 VM Virtual 8086 mode flag (386+ only) X
18 AC Alignment check (486SX+ only) X
19 VIF Virtual interrupt flag (Pentium+) X
20 VIP Virtual interrupt pending (Pentium+) X
21 ID Able to use CPUID instruction (Pentium+) X
Source : www.wikipedia.org
X – System Flags, S – Status Flags, C – Control Flags
描述符寄存器
全局描述符表寄存器GDTR
48位
高32位,全局描述符表GDT的基址
低16位,GDT的大小
中断描述符表寄存器IDTR
48位
高32位,中断描述符表IDT的基址
低16位,IDT的大小
描述符表寄存器LDTR
16位
描述符表LDT的段选择符
任务状态寄存器TR
16位
任务状态段TSS的段选择符
控制寄存器
CR0, CR1, CR2, CR3, CR4
调试寄存器
DR0, DR1, ..., DR8
CE测试寄存器
TR6, TR7
寄存器的变址能力
8个通用寄存器,都支持变址
mov bx, [ax]
寻址机制
GDT和LDT
每个程序有自己的LDT,所有程序共享GDT
物理地址=段地址*10h+偏移地址
保护模式下,必须为每个段建立一个描述符
每个描述符,8个字节,在内存中连续存放,构成描述符表
寻址过程
由段寄存器,得到段选择器
由段选择器,得到段描述符位置
TI和表索引
由段描述符位置,得到32位段地址
物理地址=段地址*10h+偏移地址
段寄存器的指定
显示指定
缺省值
[EBX+...] EBX开头,则为DS
[EBP+...] EBP开头,则为SS
[ESP+...] ESP开头,则为SS
数据传送指令
数据传送指令
传送方向
通用寄存器,可到段寄存器,存储器,立即数,自身
存储器,可到通用寄存器,段寄存器,立即数
扩展传送指令
MOVSX,有符号扩展传送,高位00,11
MOVZX,无符号扩展传送,高位补0
交换指令
XCHG OPR1, OPR2
交换OPR1和OPR2中的数据
BSWAP REG
反字节序
堆栈传送指令
压栈
PUSH (通用寄存器、段寄存器、内存、立即数)
ESP单字减2,双字减4
PUSHA
将16位通用寄存器压栈
顺序为ACDBS(P)BS(I)D
PUSHAD
将32位通用寄存器压栈
顺序为ACDBS(P)BS(I)D
出栈
POP (通用寄存器、段寄存器、内存)
ESP单字加2,双字加4
POPA
将16位通用寄存器出栈
顺序与压栈相反
POPAD
将32位通用寄存器出栈
顺序与压栈相反
地址传送指令
LEA REG, MEM
操作数REG为16位或32位通用寄存器
源操作数MEM为16位或32位内存
标志寄存器传送指令
LAHF AH到FLAGS低8位
SAHF FLAGS低8位到AH
PUSHF FLAGS压栈
POPF FLAGS出栈
PUSHF EFLAGS压栈
POPFD EFLAGS出栈
算术指令
ADD, ADC, SUB, SBB, CMP
源操作数为通用寄存器,内存,立即数
目的操作数为通用寄存器,内存
INC, DEC
目的操作数为通用寄存器,内存
XADD DEST, REG
交换相加指令
REG = DEST + REG
XCHG DEST, REG
源操作数为通用寄存器
目的操作数为通用寄存器,内存
NEG DEST
求补指令
DEST = 0 - DEST
目的操作数为通用寄存器,内存
MUL SRC
源操作数为通用寄存器,内存,立即数
被乘数放在AL,AX,EAX
乘积放在AX,DX:AX,EDX:EAX
byte ptr, word ptr, dword ptr
IMUL SRC
有符号乘法
DIV SRC
IDIV SRC
有符号除法
源操作数为除数,为通用寄存器,内存,立即数
被除数放在AX,DX:AX,EDX:EAX
商放在AL,AX,EAX
余数放在AH,DX,EDX
byte ptr, word ptr, dword ptr
被除数扩展高位时
无符号数,按0扩展
有符号数,按补码扩展,CBW,CWD,CWDE,CDQ
对于有符号除法
商和余数,使用补码表示
余数和被除数,同符号
当除数为0或商溢出时,将产生0号中断
逻辑运算
AND, OR, XOR,
源操作数为通用寄存器,内存,立即数
目的操作数为通用寄存器,内存
NOT,
目的操作数为通用寄存器,内存
TEST DEST, SRC
不存结果的AND
移位指令
循环移位
ROL, ROR
RCL, RCR
算术/逻辑左移指令
SAL DEST, OPRD
SHL DEST, OPRD
高位进CF,低位补0
算术右移指令
SAR DEST, OPRD
低位进CF,高位不变
逻辑右移指令
SHR DEST, OPRD
低位进CF,高位补0
目的操作数为通用寄存器,内存
OPRD为立即数或CL
控制转移指令
中断指令
INT n
软中断,包含中断操作码,中断类型码
过程
标志寄存器(FLAGS或EFLAGS)入栈
清除TF和IF
CS,指令寄存器(IP或EIP)入栈
实模式下,获取中断向量表地址(n*4);保护模式下,获取中断描述符表地址(n*8)
取出中断例程的地址,装入指令寄存器(IP或EIP)和CS
执行中断例程
中断返回指令
IRET
数据出栈,IP,CS,FLAGS
IRETD
数据出栈,EIP,CS,EFLAGS
串操作指令
基本串操作指令
LODSD
STOSD
MOVSD
SCANSD
CMPSD
重复前缀
REP, REPZ, REPE
REPNZ, REPNE
串输入指令
INSB, INSW, INSD
串输出指令
OUTSB, OUTSW, OUTSD