汇编语言 ·装有BOS( Basic Input/Output System,基本输入输出系统)的ROM BOs是由主板和各类接口卡如:显卡、网卡等)商提供的软件系统,可以通过 它利用该硬件设备进行最基本的输入输出。在主板和某些接口卡上插有存储相应 BOS的ROM。例如:主板上的ROM中存储着主板的BOS通常称为系统BOS) 显卡上的ROM中存储着显卡的BOs:如果网卡上装有ROM,那其中就可以存 储网卡的BOs ·接口卡上的RAM 某些接口卡需要对大批量输入、输出数据进行暂时存储,在其上装有RAM。最典 型的是显示卡上的RAM,一般称为显存。显示卡随时将显存中的数据向显示器上 输出。换句话说,我们将需要显示的内容写入显存,就会出现在显示器上。 图1.7展示了PC系统中各类存储器的逻辑连接情况 RAM主有储券 R0M袋有来线BS RAM主存器 扩展插槽 显示器 总 RAM们RM装有显卡BsS 扩展括槽 OM装有网卡Bs 扩展插槽 其他器件 图1.7PC机中各类存储器的逻辑连接 1.15内存地址空间 上述的那些存储器,它们在物理上是独立的器件,但是它们在以下两点上相同: 都和CPU的总线相连。 CPU对它们进行读或写的时候都通过控制线发出内存读写命令
第1章基础知识 这也就是说,CPU在操纵和控制它们的时候,把它们都当作内存来对待,把它们总的 看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们所说的内存地址空 间。在汇编这门课中,我们所面对的是内存地址空间。 图1.8展示了CPU将系统中各类存储器看作一个逻辑存储器的情况 内存地址空间 (假想的逻辑存储器) AM主存器 ROM装有系统BOs) CPI 主存储器 地址空间 RAM主存储 扩展插 显存地址空 RAM装卡 卡 BIOS ROM 地址空间 网卡 HIOS ROM 地址空间 ROA假装网S 系统 BIOS RO 址空间 网卡 扩展插槽 其他器件 图1.8将各类存储器看作一个逻辑存储器 在图18中,所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器,每个 物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU在这段地址空间 中读写数据,实际上就是在相对应的物理存储器中读写数据 假设,图18中的内存地址空间地址段分配如下 地址0-7FFFH的32KB空间为主随机存储器的地址空间: 地址8000H-9FFFH的8KB空间为显存地址空间 地址A0 OH-FFFFH的24KB空间为各个ROM的地址空间 这样,CPU向内存地址为1000H的内存单元中写入数据,这个数据就被写入主随机存 储器中:CPU向内存地址为8000H的内存单元中写入数据,这个数据就被写入显存中,然 后会被显卡输出到显示器上:CPU向内存地址为C0O0H的内存单元中写入数据的操作是没 有结果的,C00OH单元中的内容不会被改变,C000H单元实际上就是ROM存储器中的 个单元
汇编语言 内存地址空间的大小受CPU地址总线宽度的限制。8086CPU的地址总线宽度为20, 可以传送22个不同的地址信息(大小从0至20-1).即可以定位2个内存单元,则8086FC 的内存地址空间大小为1MB。同理,80386CPU的 0000C 地址总线宽度为32,则内存地址空间最大为4GB 我们在基于一个计算机硬件系统编程的时候, 主存储器地址空间 必须得知道这个系统中的内存地址空间分配情况 IRAM 因为当读者想在某类存储器中读写数据的时候,读 者必须知道它的第一个单元的地址和最后一个单元 9FFFE AO000 的地址,才能保证读写操作是在预期的存储器中进 显存地址空间 行。比如,读者希望向显示器输出一段信息,那么 HFFFF 读者必须将这段信息写到显存中,显卡才能将它输 C0000 出到显示器上。要向显存中写入数据,读者必须知 各类ROM地址空间 道显存在内存地址空间中的地址 FFFFF 不同的计算机系统的内存地址空间的分配情况 图1.98086Pc机内存地址空间分配是不同的,图19展示了8086PC机内存地址空间分 配的基本情况 图1.9告诉我们,我们从地址09FFF的内存单元中读取数据,实际上就是在读取主 随机存储器中的数据:向地址A0000- BFFFF的内存单元中写数据,就是向显存中写入数 据,这些数据会被显示卡输出到显示器上:我们向地址C0000FF的内存单元中写入数 据的操作是无效的,因为这等于改写只读存储器中的内容。 内存地址空间 最终运行程序的是CPU,我们用汇编编程的时候,必须要从CPU角度考虑问题。对CPU来讲,系 统中的所有存储器中的存储单元都处于一个统一的逻存储器中,它的容量受CPU寻址能力的限制。这 个逻辑存储器即是我们所说的内存地址空问 对于初学者,这个概念比较抽象,我们在后续的课程中将通过一些编程实践,来增加感性认识
第2章寄存器(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、DX四个寄 存器通常用来存放一般性的数据,被称为通用寄存器。 以AX为例,寄存器的逻辑结构如图21所示。 1514131211098 图2.118位寄存器的逻辑结构 一个16位寄存器可以存储一个16位的数据,数据在寄存器中的存放情况如图22所示 第一个问题:一个16位寄存器所能存储的数据的最大值为多少? 8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,使原来基于上代CPU 编写的程序稍加修改就可以运行在8086之上,8086CPU的AX、BX、CX、DX四个寄存 器都可分为两个可独立使用的8位寄存器来用: AX可分为AH和AL; Bx可分为BH和BL ·CX可分为CH和C DX可分为DH和DL
汇编语言 数:18 运制表不10010 在高存器AX中的存 数据:20000 过制表小:H001100010000 在寄存器AX中的存储: 图2216位数据在寄存器中的存放情况 以AX为例,8086CPU的16位寄存器分为两个8位寄存器的情况如图23所示 ■■ 654321 321 图2316位寄存器分为两个8位寄存器 AX的低8位(0位7位构成了AL寄存器,高8位(8位-15位)构成了AH寄存器。AH 和AL寄存器是可以独立使用的8位寄存器。图24展示了16位寄存器及它所分成的两个 8位寄存器的数据存储的情况。 AX 1514121110 543210 AL 寄存器 亳存器中的数据 所表示的值 ot00u11000100000 200004E20 AH 0100110 784EH) Al 0000000 32020H 图2.416位寄存器及所分成的两个8位寄存器的效据存储情况