CPU概述

内部总线

一个典型的CPU由运算器,逻辑控制器,寄存器等器件组成,这些器件靠内部总线相连。

内部总线与外部总线的区别


  • 内部总线实现CPU内部各个器件之间的联系。
  • 外部总线实现CPU和主板其他器件的联系。

寄存器

8086CPU有14个寄存器,他们的名称为:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。

通用寄存器



8086CPU所有的寄存器都是16位的,可以存放两个字节。



AX,BX,CX,DX通常用来存放一般性数据被称之为通用寄存器
下图是AX通用寄存器的寄存器图:
汇编语言学习笔记——————寄存器_物理地址



一个16位的寄存器可以存储一个16位的数据



8086上一代CPU中的寄存器都是8位的,为了保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器


  • AX可以分为AH和AL
  • BX可以分为BH和BL
  • CX可以分为CH和CL
  • DX可以分为DH和DL



8086CPU的8位寄存器存储逻辑

以AX为例,8086CPU的16位寄存器分为两个8位寄存器的情况:

汇编语言学习笔记——————寄存器_寄存器_02


  • AX的低8位构成了AL寄存器,高8位构成了AH寄存器
  • AH和AL寄存器是可以独立使用的8位寄存器

8086CPU的数据存储情况

汇编语言学习笔记——————寄存器_物理地址_03

寄存器

寄存器中的数据

所表示的值

AX

0100111000100000

20000(4E20H)

AH

01001110

78(4EH)

AL

00100000

32(20H)

从上表可以看出分成高8位和分成低8位与16位读的数据在逻辑上是有所差异的。

字在寄存器中的存储

  • 一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器中和低8位寄存器中。

几条汇编指令

汇编指令不区分大小写

汇编指令

控制CPU完成的操作

用高级语言的语法描述

MOV AX,18

将18送入AX中

AX = 18

MOV AH,78

将78送入AH

AH = 78

ADD AX,8

将寄存器AX中的数值加上8

AX = AX + 8

MOV AX,BX

将寄存器中BX中的数据送入寄存器AX中

AX = BX

ADD AX,BX

将AX和BX中的内容相加,结果存放在AX中

AX = AX + BX

检测点2.1

写出每条汇编指令执行后相关寄存器中的值


  • MOV AX,62627 AX = F4A3H
  • MOV AH,31H AX = 31A3H
  • MOV AL,23H AX = 3123H
  • ADD AX,AX AX = 6246H
  • MOV BX,826CH BX = 826CH
  • MOV CX,AX CX = 6246H
  • MOV AX,BX AX = 826CH
  • ADD AX,BX AX = 04D8H
  • MOV AL,BH AX = 0482H
  • MOV AH,BL AX = 6C82H
  • ADD AH,AH AX = D882H
  • ADD AL,6 AX = D888H
  • ADD AL,AL AX = D810H
  • MOV AX,CX AX = 6246H

**只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方

MOV AX,2
ADD AX,AX
ADD AX,AX
ADD AX,AX

物理地址


  • CPU访问内存单元要给出内存单元的地址。所有的内存单元构成的存储空间是一个唯一的线性空间。
  • 我们将这个唯一的地址称为物理地址
    概括的将,16位结构描述了一个 CPU具有以下几个方面的特征:
  • 运算器一次性最多可以处理16位的数据
  • 寄存器的最大宽度为16位
  • 寄存器与运算器之间的通路是16位的
    8286有20位地址总线,可传送20位地址,寻址能力为1M,但是8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力只有64K,因此8086CPU必须采用一种机制解决这样的问题,它采取的方法是在内部用两个16位地址合成的方法来形成一个20位的物理地址,下图是合成的方法:
    汇编语言学习笔记——————寄存器_物理地址_04
    地址加法器合成物理地址的方法:
    物理地址 = 段地址*16+偏移地址(乘以16即16进制向左移动一位,二进制数向左移动4位)
    下图为合成物理地址的原理
    汇编语言学习笔记——————寄存器_寄存器_05
    有两点需要注意:
  • 段地址*16必然是16的倍数,所以一个段地址的起始地址也一定是16的倍数。
  • 偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB

总结


  • CPU访问内存单元时,必须向内存提供内存单元的物理地址。
  • 8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。
  • CPU可以用不同的段地址和偏移地址实现同一个物理地址
  • 偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元
    • 给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH.
  • 在8086PC机中,存储单元的地址用两个元素来进行描述:段地址和偏移地址。
  • “数据在21F60H内存单元中”。对于8086PC机的两种描述:

    • 数据存在2000:1F60单元中
    • 数据存在内存的2000段中的1F60H中。


可以根据需要,将地址连续,起始地址为16的倍数的一组内存单元定义为一个段。

检测点2.2


  • 给定段地址为001H,仅通过变化偏移地址寻址,CPU的寻址范围为0010H到1000FH.
  • 有一组数据放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻址到此单元。则SA应该满足的条件是;最小为:1001H,最大为2000H.

    • 物理地址 = SA*16+EA
    • 20000h = SA*16+EA
    • SA = (20000H-EA)/16 = 2000H-EA/16
    • EA取最大值时,SA取最小值,2000H-FFFFH/16 = 1001H
    • EA取最小值时,SA取最大值,2000H-0H/16 = 2000H


段寄存器

段寄存器就是提供段地址的,

8086有4个段寄存器:


  • CS:代码段寄存器
  • DS:数据段寄存器
  • SS:堆栈段寄存器
  • ES:附加段寄存器
    当8086CPU要访问内存时,由这四个段寄存器提供内存单元的段地址。
    CS和IP是8086CPU中最关键的寄存器,他们指示可CPU当前要读取指令的地址。
  • CS为代码段寄存器
  • IP为指令指针寄存器

CPU读取和执行指令的相关部件

汇编语言学习笔记——————寄存器_物理地址_06

具体过程的详细步骤:


  1. 从CS:IP指向内存单元读取指令,读取的指令进入进入指令缓冲器
  2. IP = IP + 所读取到的指令的长度,从而指向下一条指令
  3. 执行指令。转到步骤(1),重复这个过程。

CPU工作过程的简要描述


  • 在8086CPU加电启动或复位后(即CPU刚开始工作时),CS和IP被设置为CS = FFFFH,IP= 000H.
  • 即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。
  • FFFF0H单元中的指令是8086PC即开机后执行的第一条指令。
  • 在任何时候,CPU将CS,IP中的内容当做指令的段地址和偏移地址,用他们合成指令的物理地址,到内存中读取指令码,执行。
  • 如果说,内存中的一段信息曾被CPU执行过的话,它所在的内存单元必然被CS:IP指向过。

修改CS、IP的指令


  • 在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对于CPU的控制。
  • CPU执行指令是由CS,IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
  • 8086CPU为CS、IP提供了另外的指令来改变他们的值:转移指令
  • 同时修改CS、IP的内容:

    • jmp 段地址:偏移地址


      • jmp 2AE3:3(最终物理地址:2AE33)
      • jmp 3:0B16(最终物理地址:0B46)



  • 功能:用指令中给出的段地址修改CS,偏移地址修改IP。
  • 仅仅修改IP的内容:

    • jmp 某一合法寄存器


      • jmp ax (类似于mov IP,ax)
      • jmp bx
        功能:用寄存器中的值修改IP




代码段


  • 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
  • 可以将长度为N(N <= 64kb)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这一段内存是用来存放代码的,从而定义了一个代码段。
  • CPU只认被CS:IP指向的内存单元中的内容为指令,因此要将CS:IP指向所定义的代码段中的第一条指令的首地址。

总结


  • 段地址在8086CPU的寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有四个段寄存器,其中CS用来存放指令的段地址。
  • CS存放指令的段地址,IP存放指令的偏移地址。
  • 8086机中,任意时刻时,CPU将CS:IP指向的内容当做指令执行。
  • 8086CPU 的工作过程:

    1. 从CS:IP指向内存单元的读取指令,读取的指令进入指令缓冲器
    2. IP指向下一条指令
    3. 执行指令。(转到步骤1,重复这个过程)


检测点2.3

下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP的值是多少?

mov ax,bx

sub ax,ax

jmp ax

一共修改了四次:

第一次:读取了mov ax,bx指令

第二次:读取了sub ax,ax指令

第三步:读取了jmp ax指令

第四步:执行jmp ax修改了IP内容

IP = 0