汇编 (2)寄存器 (cpu工作原理)
一. CPU概述
一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连
- 内部总线实现CPU内部各个器件之间的联系
- 外部总线实现CPU和主板上其它器件的联系
二. 寄存器概述
拿8086cpu为例,他有14个寄存器 它们的名称为:
AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW
2.1 通用寄存器
- 8086CPU所有的寄存器都是16位的,可以存放两个字节
- AX、BX、CX、DX 通常用来存放一般性数据被称为
通用寄存器
- 一个16位寄存器可以存储一个16位的数据
- 一个16位寄存器所能存储的数据的最大值为2的16次方-1
一个二进制数据10010 在16位寄存器存放
8086上一代CPU中的寄存器都是8位的,为保证兼容性,这四个通用寄存器都可以分为两个独立的8位寄存器使用:
- AX可以分为AH和AL
- BX可以分为BH和BL
- CX可以分为CH和CL
- DX可以分为DH和DL
以AX通用寄存器为例,8086CPU的16位寄存器分为两个8位寄存器的情况:
- AX的低8位(0位~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。
- AH和AL寄存器是可以独立使用的8位寄存器
一个 十进制值 20000在两个8位寄存器中存放:
2.2 字在寄存器中的存储
说明
每个寄存器是一个字,每个字占16位二进制位,每个字节占8个二进制位,一个字占两个字节,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中
三. 简单的汇编指令
注意:汇编指令不区分大小写!!
四. 物理地址
CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,我们将这个唯一的地址称为物理地址
概括的讲,16位结构描述了一个CPU具有以下几个方面特征
- 运算器一次最多可以处理16位的数据。
- 寄存器的最大宽度为16位
- 寄存器和运算器之间的通路是16位的
8086CPU有20位地址总线,他的可传送20位地址,寻址能力为1M,他的内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。
问题来了,8086CPU如何用内部16位的数据转换成20位的地址呢?
答:CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址~
8086CPU读写内存时:
- CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址
- 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
- 地址加法器将两个16位地址合并成一个20位的地址
- 地址加法器合成物理地址的方法 ->
物理地址 = 段地址×16 + 偏移地址
例如:
8086CPU访问地址为123C8H的内存单元
五. 地址加法器实现 段地址x16
“段地址×16”有一个更为常用的说法就是 段地址的二进制位左移4位
七. 段
7.1 段的概念
错误认识:
- 内存被划分成了一个一个的段,每一个段有一个段地址
其实,内存并没有分段,段的划分来自于CPU,由于8086CPU用 “段地址×16+偏移地址=物理地址” 的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存
编程时可以根据需要,将若干地址连续的内存单元看作一个段,用 段地址×16定位段的起始地址(基础地址)加偏移地址定位段中的内存单元
- 段地址×16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数;
- 偏移地址为16位,16 位地址的寻址能力为 64K,所以
一个段的长度最大为64K
学到这里得到两个公式 设 段地址为 SA 偏移地址为EA
- (SA x 16) + EA = 物理地址
- 0 ≤ EA ≤ 16位 (二进制)
- 0 ≤ EA ≤ 64K (十进制)
- 0 ≤ EA ≤ ffff(十六进制)
题目1:给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为___到___
- 根据公式 可以得出 段地址的内存范围为(0001h*16+0h)~(0001h*16+ffffh) 即=0010h ~1000fh 之间
题目2:有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为___,最大为 ___
- 公式:20000h=SA*16+EA,SA=(20000h-EA)/16
- EA取最大值时SA就是 最小值: SA=2000h-ffffh/16=
1001h
- EA取最小值时SA就是 最大值: SA=2000h-0h/16=
2000h
7.2 段寄存器
段内存地址是存放在段寄存器中的
拿8086CPU来举例,他有有4个段寄存器:
CS、DS、SS、ES
当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址
CS寄存器和IP寄存器是8086CPU中最关键的两个寄存器,它们指示了CPU当前要读取指令的地址:
-
CS为代码段寄存器;
-
IP为指令指针寄存器 (偏移地址)
-
在 8086CPU 加电启动或复位后( 即 CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H
-
CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令