X86系列CPU 注记(一)

本系列文章主要针对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端口写入一个字节
  • 外中断:分为可屏蔽中断、不可屏蔽中断,具体操作与内中断类似

 

 

 

 

 

 

 

 

 

 

posted @ 2013-01-29 10:37  Fredric_2013  阅读(653)  评论(0编辑  收藏  举报