本系列文章主要针对X86系列的CPU 知识作梳理,初步考虑整理8086和80386两款。主要参考书清华大学出版社 王爽的《汇编语言》以及周明德《unix系统下的80386》。

1. 8086的体系结构

X86 cpu历代规格及架构 x86系列cpu包括_X86 cpu历代规格及架构

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端口写入一个字节



  • 外中断:分为可屏蔽中断、不可屏蔽中断,具体操作与内中断类似