内存地址空间的概述
一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元,这1024个可以寻到的内存单元就构成这个CPU的内存地址空间,后面深入学习,先说一些另外俩部分基础知识,主板和接口卡
主板
在每一台计算机种,都有一个主板,主板上有核心器件和一些主要器件,这些器件通过总线相连,分别由CPU、存储器、外围芯片组、扩展插槽,扩展插槽上一般插有RAM内存条和各类接口卡。
三级标题接口卡
计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制,CPU对外部设备都不能之间控制,比如显卡、打印机、音箱,直接控制这些设备进行工作的事插在扩展插槽上的接口卡,扩展插槽同通过总线和CPU相连,所以接口卡也通过总线同CPU相连,CPU可以控制这些接口卡,从而实现对外部设备的间接控制
三级标题各类存储器芯片
一台PC机上装有多个存储器芯片,这些存储器芯片从物理连接上看上去事独立的、不同的器件,从读写属性上看分为俩类;随机存储器(RAM)和只读存储器(ROM)。 随机存储器可读可写,但必须带点存储,断电丢失,只读存储器只能读取不能写入,关机后其中的内容不丢失,这些存储器从功能和链接又可以分为 随机存储器 用于存放CPU使用的绝大部分程序和数据,主随机存储器一般由俩个随机存储器组成, 装在主板上的RAM和插在扩展卡槽里的RAM。 装有BOIS(基本输入/输出系统)的ROM BIOS是由主板和各类接口卡(显卡、网卡)厂商提供的软件系统,可以通过利用它对该硬件设备进行最基本的输入输出,在主板和某些接口卡上插有存储相应BIOS的ROM, 例如,显卡中ROM存储着显卡的BIOS,网卡的ROM存储着网卡的BIOS 接口卡上的RAM 某些接口卡需要对大批量输入、输出数据进行暂时存储,在其上装有RAM,典型的就是显卡上的RAM随机存储器,一般称之为显存,显卡随机将显存中的数据向显示器中输入,我们将需要显示的内容写入显存,显示器就会显示。
1.15 内存地址空间
上面说的那些存储器,在物理上都是独立的器件,都和CPU的总线相连,CPU对他们读写的时候通过控制总线发出内存读写命令
总的来说,CPU在操作他们的时候,把它们都当作内存来对待,把他们都看成是若干个存储单元组成的逻辑存储器,而这个总的逻辑存储器就是我们所说的内存地址看见,汇编中 我们要面对的就是这个内存地址空间
所有的物理存储器被看作一个由若干个存储器组成的大的逻辑存储器,每个物理存储器在这个逻辑存储器中都站一个地址段,就好像IP的A、B、C类地址段一样 是划分好的,而CPU则需要在这段地址空间中读取相应的数据 这样的地址段大致分为:
- 主存储器地址空间
- 显存地址空间
- 显卡BIOS ROM地址空间
- 网卡 BIOS ROM地址空间‘
- 系统BIOS ROM 地址空间
假设一个逻辑存储器的地址空间是0-FFFFH,分配如下 地址0-7FFFH的32KB空间为主随机存储器 地址8000H-9FFFH的8KB的空间为显存地址空间 地址A000H-FFFFH的2KB的空间为各个ROM的地址空间
这样,CPU向内存地址为1000H内存单元中写入数据,这个数据就被写入主随机存储器中;CPU向内存地址为8000H的内存写入数据,这个数据就会被写入显卡中,然后会被显卡输入到显示器上,CPU如果向内存地址为C000H欸顶内存单元中写入数据操作是 没有结果的,C000H单元中的内容不会被该笔那,C000H单元实际上就是ROM存储器中的一个存储单元。
**内存地址空间的大小受总地址总线宽度的限制,**
8086CPu的地址总线宽度为20,那么可以传送2的20次方不同的地址信息(大小从0到2的十次方减一),既可以定义2的二十次方个内存单元,8080PC的内存地址空间大小为1MB,同理,80386CPU的地址总线宽度为32,则内存地址空间最大为4GB
所以我们在基于一个计算机硬件系统编程的时候,必须知道这个系统中的内存地址空间的分配情况----第一个存储单元和最后一个存储单元的内存地址,才能对症下药不是, 比如我们希望显示器输出一段信息,那么我们必须将这段数据写到显存的地址中,显卡才能将它输出到显示器中让我们看到,其他的也是同理,当然往只读存储器中写入操作是无效的
内存地址空间
最终运行程序的是CPU,我们用汇编语言编程的时候,必须要从CPU的角度考虑问题,对CPU来说,系统中所有的存储器都是处于一个统一的逻辑存储器中的,也就是所谓的内存地址空间,这个内存地址空间的容量受CPU寻址能力的限制
寄存器
一个典型的CPU由运算器、控制器、寄存器(CPU工作原理)等部件构成,这些器件靠内部总线相连,上一章的那个总线指的是外部总线 ,是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,DX4个寄存器通常用来存放一般性数据,被称为通用寄存器 以AX寄存器为例子展示一下寄存器的逻辑结构
一个16位的寄存器可以存储一个16位的数据,数据在寄存器的存放如上图 8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,使原来基于CPU编写的程序稍加修改就可以运行在8086上,8086CPU的AX,BX,CX,DX这4个寄存器
AX可以分为AH和AL BX可以分为BH和BL CX可以分为CH和CL DX可以分为DH和DL 以AX的16位寄存器为例,可以划分为俩个8位寄存器
AX的低8位(0-7)构成了AL寄存器,高八位(8-15)构成了AH寄存器。
AH和AL寄存器是可以使用的8位寄存器,那么一个8位寄存器所能存储的数据最大值为多少? 寄存器 寄存器中的数据 所表示的值 AX 100111000100000 20000(4E20H) AH 01001110 78(4EH) AL 001000 32(20H)
字在寄存器中的储存
出于对兼容性的考虑,8086CPU可以一次性处理一下俩种尺寸的数据 字节:记为byte,一个字节由八个bit组成,可以存放在8位寄存器中 字:记为word,一个字由俩个字节组成,这俩个字节分别称为这个字的高位字节 字: 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 0 高位字节 地位字节
一个字可以存在一个16位寄存器中,这个字的高位字节和地位字节自然就存在这个寄存器的高8位和低8位存储器中
一个字型数据2000,存在AX寄存器中,在AH中存储了它的高8位,在AL中存储了它的低8位,这个字型数据的大小是20000;可以看成是俩个独立的字节型,他们的大小分别是78和32。
数值: 一个内存的存储单元存放8位数据,CPU中的寄存器又可以存放n个8位数据,,所以计算机中的数据大多是由1-N个8位数组成的,为了区分不同的进制,在十六进制后加H,在二进制后面加B,在十进制后面什么都不加,比如说可以用3种不同的进制表示AX的数 十进制:20000 十六进制:4E20H 二进制:0100111000100000B