本系列文章主要针对X86系列的CPU 知识作梳理,初步考虑整理8086和80386两款。主要参考书清华大学出版社 王爽的《汇编语言》以及周明德《unix系统下的80386》。
1. 8086的体系结构
8086 CPU由以下两大部分组成:
- 总线接口单元(BIU),包括:
- CS寄存器 - 16位代码段寄存器
- DS寄存器 - 16位数据段寄存器
- ES寄存器 - 16位扩展段寄存器
- SS寄存器 - 16位堆栈段寄存器
- IP寄存器 - 16位指令指针寄存器
- 20位的地址加法器
- 6字节的指令队列缓冲器
- 执行单元(EU),包括:
- 4个数据寄存器:AX、BX、CX、DX
- 2个地址指针寄存器:BP、SP
- 2个变址寄存器:SI、DI
- 标志寄存器FR
- 算数逻辑单元ALU
8086主要的引脚是:AD15 ~AD0:地址/数据总线、A19/S6~A16/S3:地址/状态信号,输出,三态。其中AD0~AD15和A16~A19组成CPU的20位地址总线。因此8086的地址由段基地址和段偏移组成。
2. 8086的主要常用指令
- 内存访问:
mov bx, 1000H
mov ds, bx ;ds寄存器存放要访问数据的段地址
mov al, [0] ;1000H(1000:0)数据读到al中
- 堆栈操作:
push ax ;入栈:SS:SP指向栈顶,push操作的顺序是SP=SP-2,ax放入SS:SP指向的内存处
pop ax;出栈
- 循环处理:
mov cx, 11 ;cx寄存器决定循环的次数
s: add ax, ax
loop s
- 转移指令
jmp short s ; 段内短转移
s: inc ax
jcxz s ;如果(cx) = 0, 转移到标号处
- 子程序调用
ret ;用栈中的数据,修改IP的内容,实现近转移
retf;用栈中的数据,修改CS和IP的内容,实现远转移
call 标号; 将当前的IP或CS和IP入栈,转移
- 标志寄存器
- ZF:零位标志
- PF:奇偶标志
- SF:符号标志,正负
- CF:进位标志
- OF:溢出标志,有符号数计算式否溢出
- DF:方向标志,串处理中,判断SI、DI递增减、
- 内中断
8086 的内部中断主要有四类,对应中断源的码分别是:除法错误(0)、单步执行(1)、执行int0指令(4)、执行int指令。CPU通过中断向量表存储中断处理程序的入口。8086CPU 从地址0处存储中断向量表(0000:0000~0000:03E8)。
int 0; 处理步骤:
1. 取中断类型码
2. 标志寄存器入栈,IF= 0,TF=0
3. CS 、IP入栈
4. (IP) = (n*4),(CS) = (n*4+2)
- 端口
在X86体系中,与ARM不同,IO空间与内存空间是分开的,指令如下:
in al, 20h ; 从20h端口读入一个字节
out 20h, al ; 向20h端口写入一个字节
- 外中断:分为可屏蔽中断、不可屏蔽中断,具体操作与内中断类似