目录

寄存器(cpu工作原理)

来源:王爽老师的《汇编语言》

概述

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

https://gitee.com/lienhui68/picStore/raw/master/null/20200914141341.png

区别:

内部总线实现CPU内部各个器件之间的联系。

外部总线实现CPU和主板上其它器件的联系。

寄存器组

寄存器组有两个,分别是16位寄存器组合32位寄存器组

16位寄存器组

16位CPU所含有的寄存器有14个寄存器

4个数据寄存器(AX、BX、CX和DX)

2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP)

4个段寄存器(ES、CS、SS和DS)

1个指令指针寄存器(IP)1个标志寄存器(Flags)

32位寄存器组

32位CPU除了包含了先前CPU的所有寄存器,并把通用寄存器、指令指针和标志寄存器从16位扩充成32位之外,还增加了2个16位的段寄存器:FS和GS。 共有16个寄存器

32位CPU所含有的寄存器有

4个数据寄存器(EAX、EBX、ECX和EDX)

2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)

6个段寄存器(ES、CS、SS、DS、FS和GS)

1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)

具有一个输入端口和两个输出端口。

8086cpu共有14个寄存器,他们的名称分别是

AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

https://gitee.com/lienhui68/picStore/raw/master/null/20200914142421.png

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

一个16位寄存器所能存储的数据的最大值为多少?

因为每一位存放的数据是0或1,那么最大的数值自然就是 1111 1111 1111 1111(2),也就是2^16-1

通用寄存器

8086上一代CPU中的寄存器都是8位的,为保证兼容性,

这四个寄存器都可以分为两个独立的8位寄存器使用。

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

https://gitee.com/lienhui68/picStore/raw/master/null/20200914142922.png

AX的低8位(0位~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。

AH和AL寄存器是可以独立使用的8位寄存器,如果当成是8位寄存器使用,那么他们就是独立的,没有任何关系。

一个8位寄存器所能存储的数据的最大值是多少?二进制数值 1111 1111 ,也就是 2^8-1

https://gitee.com/lienhui68/picStore/raw/master/null/20200914143523.png

字在寄存器中的存储

https://gitee.com/lienhui68/picStore/raw/master/null/20200914143623.png

上面说的字长是指机器字长,一般就是寄存器的位数。8086的机器字长是16位。

几条汇编指令

https://gitee.com/lienhui68/picStore/raw/master/null/20200914143937.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914144047.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914144114.png

注意:在进行数据传送或运算时,要注意指令的操作数的位数要匹配。

https://gitee.com/lienhui68/picStore/raw/master/null/20200914144147.png

物理地址的表示

CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间。

我们将这个唯一的地址称为物理地址。

不同的CPU有不同的形成物理地址的方式。

16位结构的cpu

8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力只有64K。

8086外部有20位地址总线,可传送20位地址,寻址能力为1M。

那么,8086CPU如何用内部16位的数据,转换成20位的地址呢

8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

段地址+偏移地址 -> 地址加法器 -> 20位的物理地址。

地址加法器合成物理地址的方法:段地址<<4+偏移地址=物理地址

这样做的目的主要是为了弥补内部总线16位的缺陷而设计的。

https://gitee.com/lienhui68/picStore/raw/master/null/20200914144621.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914144627.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914144636.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914144644.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914144652.png

关于段空间

内存没有分段,段的划分来自于CPU,

由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,

使得我们可以用分段的方式来管理内存。

以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。

  1. 段地址×16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数;
  2. 偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K。

CPU可以用不同的段地址和偏移地址形成同一个物理地址。

如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位多少内存单元?

因为偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元。

比如:给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。

https://gitee.com/lienhui68/picStore/raw/master/null/20200914145302.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914145357.png

地址的描述

在8086PC机中,存储单元的地址用两个元素来描述。即段地址和偏移地址。

“数据在21F60H内存单元中。”对于8086PC机的两种描述:

(a)数据存在内存2000:1F60单元中;

(b)数据存在内存的2000段中的1F60H单元中。

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

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

8086CPU有4个段寄存器: CS、DS、SS、ES。

CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。

CS为代码段寄存器,IP为指令指针寄存器。

在 8086CPU 加电启动或复位后( 即 CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H。

即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。

FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

https://gitee.com/lienhui68/picStore/raw/master/null/20200914145634.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914145643.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914150036.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914150254.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914150300.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914150308.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914150320.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914150328.png

修改CS,IP

mov指令不能用于设置CS、IP的值,8086CPU没有提供这样的功能。

8086CPU为CS、IP提供了另外的指令来改变它们的值:转移指令

JMP 段地址:偏移地址

JMP 2AE3:3

功能:用指令中给出的段地址修改CS,偏移地址修改IP。CS = 2AE3H, IP = 0003H。

仅修改IP的内容:

jmp 某一合法寄存器

jmp ax (类似于 mov IP,ax)

功能:用寄存器中的值修改IP。

8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。

https://gitee.com/lienhui68/picStore/raw/master/null/20200914150549.png

https://gitee.com/lienhui68/picStore/raw/master/null/20200914150606.png

关于debug指令

(Win7没有这个指令,XP才有)

R命令查看、改变CPU寄存器的内容;

D命令查看内存中的内容;

E命令改写内存中的内容;

U命令将内存中的机器指令翻译成汇编指令;

T命令执行一条机器指令;

A命令以汇编指令的格式在内存中写入一条机器指令。