《汇编语言(第四版)》—王爽 第二章寄存器(CPU工作原理) 详细笔记 ~后续章节笔记,课后检测,实验代码持续更新中
第二章寄存器(CPU工作原理)
CPU概述
一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部的总线相连
区别
内部总线实现的是CPU内部的各个器件之间的联系
外部总线实现的是CPU和主板上其他器件之间的联系
寄存器概述
8086COU有十四个寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW
2.1、通用寄存器
8086CPU所有的寄存器都是16位的,可以存放两个字节
AX,BX,CX,DX通常用来存放一般性的数据被称为通用寄存器
一个16位的寄存器所能存储的数据的最大值为:2的16次-1
为了保证兼容性,这四个通用的寄存器都可以分为两个独立的8位寄存器使用
AX可以分为AH(高位,8位),AL(低位,8位)
如果要按照以前的8位版本使用时,就将高位全部置为0,取低位使用
AH和AL是可以独立使用的寄存器
扩展内容(通用寄存器):
32位的通用寄存器有:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
16位的通用寄存器有:AX,CX,DX,BX,SP,BP,SI,DI
08位的通用寄存器有:AH,AL,BH,BL,CH,CL,DH,DL
2.2、字在寄存器中的存储
字的英文表示形式为:word = 2B 两个字节
双字英文表示形式为:Dword
一个字可以存在一个16位的寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器额度高8位寄存器和低8位寄存器
二进制与其他进制之间的关系
二进制与十六进制的关系:每四个二进制位可以表示位一个十六进制位
二进制与八进制的关系:每三个二进制位可以表示为一个八进制位
为了区分进制,在十六进制的后面加上H,在八进制的后面加上B
2.3、几条汇编指令
汇编指令不区分大小写
mov ax,18 将18送入AX AX=18
mov ah,78 将78送人AH AX=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
思考题一:
通过计算得知结果为1044CH,但是因为AX只能存放16位,而且是从低位开始存储,所以最高位的1丢失,因此AX中存储的是044CH
思考题二:
通过计算得知结果为0185H,但是结果存放的地方是低八位,因此进位的一没有办法写入进去,顾丢失,因此此时AL中存储的是0058H
这里的丢失,指的是进位制不能在8位寄存器中保存,但是CPU不是真的丢弃了这个进位制值,后续会有相关知识
2.4、物理地址
CPU访问内存单元时要给出内存单元的地址,所以的内存单元构成的存储空间是一个一维的线性空间
我们将这个唯一的地址称之为物理地址
2.5、16位结构的CPU
概括地讲,16位结构(16位机、字长为16位等常见说法,与16位结构的含义相同)描述了一个CPU具有下面几方面的结构特性。
- 运算器一次最多可以处理16位的数据;
- 寄存器的最大宽度为16位;
- 寄存器和运算器之间的通路为16位
2.6、8086CPU给出物理地址的方法
8086有20位的地址总线,可以传输20位的地址,寻址能力是1M
8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却是64K
8086CPU采取的是一种在内部用两个16位地址合成的方法来形成一个20位的物理地址
地址加法器合成物理地址的方法:
物理地址 = 段地址 * 16 + 偏移地址;
按照位运算来说一个16进制的数乘以16就相当于将这个数相左移动一位,低位补充0,二进制的数乘以16就相当于这个数相左移动四位
按照位运算来说,N进制,相左移动为乘以N,向右移动为除以N
2.7、物理地址 = 段地址 * 16 + 偏移地址的本质含义
“段地址×16+偏移地址=物理地址”的本质含义是:CPU在访问内存时,用一个基础地址(段地址×16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
更一般地说,8086CPU 的这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU中,段地址×16可看作是基础地址。
2.8、段的概念
错误的认识:内存被划分为一个一个的段,每个段有一个段地址
内存并没有分段,段的划分来自于CPU
以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。有两点需要注意:段地址x16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB.
内存单元地址小结
CPU在访问内存单元时,必须向内存提供内存单元的物理地址
8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址
CPU可以用不同的段地址和偏移地址形成同一个物理地址
“数据在21F60H内存单元中。”这句话对于8086PC机一般不这样讲,取而代之的是两种类似的说法:
-
数据存在内存2000:1F60单元中;
-
数据存在内存的2000H 段中的1F60H单元中。
这两种描述都表示“数据在内存21F6OH单元中”。
例题解析:首先偏移地址为16位,因此寻址范围位2的16次方为64KB即0HFFFFH;因为段地址位0001H,则段地址*16+偏移地址,即为0000HFFFFH + 0001H * 16 =0010H + 0000H~FFFFH = 0010H~1000FH,为所求
2.9、段寄存器
段寄存器就是提供段地址的
8086CPU有4个段寄存器:CS,DS,SS,ES
CS:代码段地址寄存器
DS:数据段地址寄存器
SS:堆栈段地址寄存器
ES:附加段地址寄存器
当8086CPU要访问内存时,由这四个段寄存器提供内存单元地址
2.10、CS和IP
CS和IP是8086CPU中最重要的寄存器,它们指示了CPU当前要读取的指令的地址
CS为代码段寄存器
IP为指令指针寄存器
(1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
(2)IP=IP+所读取指令的长度,从而指向下一条指令;
(3)执行指令。转到步骤(1),重复这个过程。
注意:在8086CPU加电启动或复位后(即CPU 刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC 机刚启动时,CPU从内存 FFFF0H单元中读取指令执行,FFFFOH单元中的指令是8086PC机开机后执行的第一条指令。
在任何时候,CPU 将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。
如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。
2.11、修改CS、IP指令
在CPU 中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU 的控制。
CPU 从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
mov指令不能修改CS和IP的值
8086CPU为CS和IP专门提供了另外的指令来改变它们的值:转移指令
同时修改CS和IP的内容
jmp 段地址 偏移地址
jum 2AE3:3 --->到达地址2AE33 --->2AE3 * 16 + 3
jum 3:0B16 --->到达地址0B46 --->0003 * 16 + 0B16
用指令中的段地址修改CS,用指令中的偏移地址修改IP
进修改IP内容
jmp 某一合法的寄存器
(首先mov ax,数值)
jum ax(类似于mov IP,ax)
jum bx
用寄存器中的值修改IP
2.12、代码段
对于8086PC 机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将长度为N(N≤64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,我们可以认为,这段内存是用来存放代码的,从而定义了一个代码段。
将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动地将我们定义的代码段中的指令当作指令来执行。CPU只认被CS:IP指向的内存单元中的内容为指令。
要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。
9~12节 小结
检测点知识:
sub命令表示的是减法,sub ax,ax即为将ax寄存器中的数据清零