CPU概述

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

2.区别:

1
2
内部总线:是CPU内部的【用于运算器,控制器,寄存器】
外部总线:是我们之间学的那些【用于和主板联系的-->地址总线,数据总线,控制总线】

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

4.外部总监实现CPU和主板上其他器件的联系

寄存器概述

1.8086CPU有14个寄存器

1
2
AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

2.1通用寄存器

1.8086CPU所有的寄存器都是16位的,可以存放2个字节,也就是一个字

2.AX BX CX DX 通常用来存放一般性数据被称为通用寄存器

3.AX

image-20230405132751383

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

比如:数据18 –> 二进制表示是10010

image-20230405132946340

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

1
2^16 - 1   -->  二进制就是1111,1111,1111,1111

4.为了保持和上一代CPU中的寄存器【都是8位】的兼容性,这4个寄存器可以分为2个独立的8位寄存器

1
2
3
4
AX-->AH AL  [high low]
AL:0~7位
AH:8~15位
AL 和 AH 是可以独立使用的8位寄存器

image-20230405133854304

2.2字在寄存器中的储存

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

1
2
字 --> word
1word=2Byte=16bit

关于数制的讨论

1.由于1个内存单元可以放8位数据,CPU中的寄存器又可放N个8位数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。【进制转换的课程,有时间一定要去看啊】

2.用十六进制来表示数据可以直观的看出这个数据是由那些8位数据构成【每两位对应一个八进制】【4位对应一个16进制】

3.十六进制后面+H ; 二进制后面+B ;

2.3几条汇编指令

1.汇编的指令是不分大小写的

汇编指令 控制CPU完成的操作 高级语言的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
move ax,18			将18送入AX							AX=18
move ah,78 将78送入AH AH=78
add ax,8 将寄存器AX中的值加上8 AX=AX+8
move ax,bx 将寄存器BX中的数据送入寄存器AX中 AX=BX
add ax,bx 将AX,BX中的内容相加,结果存在AX中 AX=AX+BX

在使用add的时候如果存放的数值大于了寄存器的容量怎么办?
AX寄存器就存放2个字节,取后面的,前面的舍去掉(舍去的部分取哪里了,后面再说)
比如:mov ax,8226H mov bx,8226H
add ax,bx
这个时候的ax中的值是044cH
但是8226H+8226H=1044c的,前面的1被抛弃
同理:如果使用的是AL或者AH,虽然这俩个是AX分出来,但是在AL溢出的时候,也是只能放后面的

比如AX中的值是00C5H
add al,93H ------> c5+93=158
最后得出的AX的值是0058H

**这里的丢失,指的是进制不能再8位寄存器中保存,但是CPU不是真正的抛弃这个进制位

2.4物理地址

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

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

2.6 16位结构的CPU

1.概括的讲,16位结构描述了一个CPU具有一下几个方面的特征

1
2
3
1.运算器一次最多可以处理16位的数据
2.寄存器的最大宽度是16位
3.寄存器和运算器之间的通路是16位的

2.8086CPU给出物理地址的方法

1
2
1.8086有20位地址总线,可传送20位地址,寻址能力是1M
2.8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K

3.问题:那么,8086CPU如何用内部16位的数据转化成20位的地址呢?

1
2
3
4
5
6
8086CPU采用一种再内部用俩个16位地址合成的方法形成一个20位的物理地址

1.CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址
2.段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
3.地址加法器将两个16位地址合并成一个20位的地址
4....

image-20230405175513882

2.7地址加法器的互作原理

问题:地址加法器的互作原理

1
2
地址加法器合成物理地址的方法:	
物理地址=段地址*16+偏移地址

image-20230405180149132

5.由段地址* 16引发的血案….

1
2
3
4
5
6
7
段地址*16 ==> 有一个更常用的说法,就是数据左移4位(二进制位)
移位位数 二进制 十六进制 十进制
0 10B 2H 2
1 100B 4H 4
2 1000B 8H 8
3 10000B 10H 16
4 100000B 20H 32

通过观察我们发现

1
2
3
1.一个数据的二进制[16进制]形式左移1位,相当于该数*2[*16]
2.一个数据的二进制形式左移N位,相当于该数*2的N次方
3.所以段地址*16的运算就是,以二进制形式存放的段地址左移4位

段地址*16+偏移地址=物理地址的本质含义

1
2
3
1.基础地址+偏移地址=物理地址
2.段地址*16+偏移地址=物理地址
就是说CPU一次只能提供不够的,第一个地址进行*16后加上去就是物理地址

2.8段的概念

1.错误的认识

1
内存被划分成了一个一个的段,没一个段有一个段地址

2.其实

1
内存并没有分段,段的划分来自于CPU,由于8086CPU“用(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存

3.以后在编程的时候,将若干个连续的内存单元看作一个段,用段地址*16 定位段的起始地址(基础地址)用偏移地址定位段中的内存单元

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

内存单元地址小结

1.CPU访问内存单元的时候,必须向内存提供内存单元的物理地址

2.8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。

3.一个物理地址,可以由很多种段地址和偏移地址形成。

1

4.给定一个段地址,仅通过变化偏移地址来寻,最多可以定位64KB个内存单元

没有小结的小结

1.段地址和偏移地址

2.数据在21F60H内存单元中。对于8086PC机中有俩种描述

1
2
1.数组存在内存2000:1F60单元种
2.数据存在内存的2000段种的1F60H单元种

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

2.9段寄存器

1.段寄存器就是提供段地址的。

1
2
8086CPU有4个段寄存器
CS DS SS ES

2.当8086CPU要访问内存时,由这四个段寄存器提供内存单元的段地址

2.10CS和IP

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

1
2
CS为代码段寄存器
IP为指令指针寄存器【偏移地址的寄存器】

2.8086PC互作过程的简要描述

1
2
3
1.从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲区;
2.IP=IP+所读取指令的长度,从而指向下一条指令
3.执行指令。转到步骤1

3.在任何时候,CPU和CS,IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行

4.如果说,内存中的一段信息被CPU执行过的话,那么,它所在的内存单元必然是被CS:IP指向过

2.11修改CS,IP的指令

1.在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制

2.CPU从何处执行指令是由CS,IP中的内容决定的,程序员可以通过改变CS,IP中的内容来控制CPU执行目标指令

3.同时修改CS.IP的内容

1
2
3
4
jmp 段地址:偏移地址
jmp 2AE3:3 --> 3AE33
jmp 3:OB16 --> 0003
功能:用指令中给出的地段修改CS,偏移地址修改IP

4.只修改IP

1
2
3
4
jim 某一个合法寄存器完成:
jmp ax 指令执行前:ax=1000H CS=2000H,IP=0003H
后:ax=1000H CS=2000H,IP=1000H
这个就是类似于:mov IP,ax

2.12代码段

1.对于8086PC机,在编程的时候,可以根据需要,将一组内存单元定义为一个段

2.可以将长度为N(N<=64KB)的一组代码,存在一组地址连续,起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段

3.如何使得代码段中的指令被执行呢?

1
用CS:IP指过去

4.将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动的将我们定义的代码段中的指令当作指令来执行

1
2
CPU只认被CS:IP指向的内存单元中的内容为指令
如果是其他的来指向就可能是数据

5.所以要将CS:IP指向对应的地址

2.9~2.12节的小结

1.段地址在8086CPU的寄存器中存放。当8086CPU要访问内存的时候,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址

2.CS存放指令的段地址,IP存放指令的偏移地址。

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

4.8086CPU的互作过程:

1
2
3
1.从CS:IP指向内存单元读取指令,读取的指令进入缓冲区
2.IP指向下一条指令;
3.执行指令(转到步骤1)

5.8086CPU提供转移指令修改CS,IP的内容

1
jmp

实验【完成就结束第二章】

1.查看CPU和内存,用机器指令和汇编指令编程

1
2
用到DEBUG
cmd-->输入debug

什么是debug?

1
Debug是DOS,Windows都提供的实模式(8086方式)程序的调试工具,使用它可以查看CPU各种寄存器中的内容,内存的情况和在机器码级跟踪程序的运行
1
2
3
4
5
6
7
指令:
-r查看,改变CPU寄存器的内容
-d查看内容中的内容
-e改写内存中的内容
-u将内存中的机器指令翻译成汇编指令
-t命令执行一条机器指令
-a以汇编指令的格式在内容中写入一条机器指令

这里还是去看视频吧P12