汇编语言 程如图27所示(图中数据皆为十六进制表示)。 1230 1230 12300 DOCK OoCK NOCK (1)相关部件提供段地址和偏移地址C2)段地址和偏移地址送入 (3)段地址×16 地址加法器 也址加法 12300 HOCS 123C8 (4)段地址×16+偏移地址,得出物理地址 (5)输出物理地址 图27地址加法器的工作过程 由段地址×16引发的讨论 “段地址x16”有一个更为常用的说法是左移4位,计算机中的所有信息都是以二进制的形式存储的, 段地址当然也不例外,机器只能处理二进制信息,“左移4位”中的位,指的是二进制位 我们看一个例子:一个数据为2H,二进制形式为10B.对其进行左移运算: 左移位数 二进制 六进制 十进制 2H 10H 现察上面移位次数和各种形式数据的关系,我们可以发现 (1)一个数据的二进制形式左移1位,相当于该数据乘以2 (2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方 (3)地址加法器如何完成段地址×16的运算?就是将以二进制形式存放的段地址左移4位 进一步思考,我们可看出:一个数据的十六进制形式左移1位,相当于乘以16:一个数据的十进制 形式左移1位,相当于乘以101一个X进制的数据左移1位,相当于乘以X 2.7“段地址×16+偏移地址=物理地址”的本质含义 本节讨论的是8086CPU段地址和偏移地址的本质含义,而不是为了解决具体的问题而 在本质含义之上引申出来的更高级的逻辑意义。不管以多少种不同的逻辑意义去看待“段 地址x16+偏移地址=物理地址”的寻址模式,一定要清楚地知道它的本质含义,这样才能 更灵活地利用它来分析、解决问题。如果只拘泥于某一种引申出的逻辑含义,而模糊本质
第2章寄存器(CPU工作原理) 含义的话,将从意识上限制对这种寻址功能的灵活应用。 “段地址×16+偏移地址=物理地址”的本质含义是:CPU在访问内存时,用一个基础 地址(段地址×16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址 更般地说,8086CPU的这种寻址功能是“基础地址+偏移地址=物理地址”寻址模式 的种具体实现方案。8086CPU中,段地址×16可看作是基础地址 下面,我们用两个与CPU无关的例子做进一步的比喻说明 第一个比喻说明“基础地址+偏移地址=物理地址”的思想: 比如说,学校、体育馆、图书馆同在一条比直的单行路上(参考图2.8),学校位于路的 起点(从路的起点到学校距离是0米) 学校 体育馆 图书馆 2826 图2.8学校、体育馆、图书馆的位置关系 读者要去图书馆,问我那里的地址,我可以用两种方式告诉读者图书馆的地址 (1)从学校走2826m到图书馆。这2826m可以认为是图书馆的物理地址 2)从学校走2000m到体育馆,从体育馆再走826m到图书馆。第一个距离200m, 是相对于起点的基础地址,第二个距离826m是相对于基础地址的偏移地址(以基础地址为 起点的地址) 第一种方式是直接给出物理地址2826m,而第二种方式是用基础地址和偏移地址相加 来得到物理地址的。 用第二个比喻进一步说明“段地址×16+偏移地址-物理地址”的思想 我们为上面的例子加一些限制条件,比如,我们只能通过纸条来互相通信,读者问我 图书馆的地址我只能将它写在纸上告诉读者。显然,我必须有一张可以容纳4位数据的纸 条,才能写下2826这个数据: 可以写下4位数据的纸条 282|6 可不巧的是,我没有能容纳4位数据的纸条,仅有两张可以容纳3位数据的纸条。这 样我只能以这种方式告诉读者2826这个数据: 两张可以写下3位数据的纸条 00 8|216
汇编语言 在第一张之上写上200段地址),在第二张纸上写上826(偏移地址)。假设我们事前对 这种情况又有过相关的约定:读者得到这两张纸后,做这样的运算:200段地址)×10+826(1 移地址)2826(物理地址)。 (8086CPU就是这样一个只能提供两张3位数据纸条的CPU.) 2.8段的概念 我们注意到,“段地址”这个名称中包含着“段”的概念。这种说法可能对一些人产 生了误导,使人误以为内存被划分成了一个一个的段,每一个段有一个段地址。如果我们 在一开始形成了这种认识,将影响以后对汇编语言的深入理解和灵活应用。 其实,内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址(段地 址×16)+偏移地址一物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方 式来管理内存。如图2.9所示,我们可以认为:地址10000H-100FH的内存单元组成一个 段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H:我们也可以认 为地址10000H-1007FH、10080H-100FFH的内存单元组成两个段,它们的起始地址(基础 地址)为:10000和100080H,段地址为:1000H和1008H,大小都为80H。 10000H 10000H 1000H-1O7FH 单元组成一个段 10000H-100FFH 10O7FH 单元组成一个段 I0ONOH-lOOFFH 单元组成一个段 100FFH lOOFFH 图2.9分段 以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址 16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。有两点需要注意:段 地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数:偏移地址为16 位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。 内存单元地址小结 CPU访何内存单元时,必须向内存提供内存单元的物理地址,8086cPU在内部用段地址和偏移地址 移位相加的方法形成最终的物理地址 思考下面的两个问题:
第2幸寄存器(CPU工作原理) (1)观察下面的地址,读者有什么发现? 物理地址 段地址 偏移地址 21F6H 21FDH 21F6H 0000H IFOOH 2F60H 结论:CPU可以用不同的段地址和偏移地址形成同一个物理地址 比如CPU要访问21F60H单元,则它给出的段地址SA和偏移地址EA满足SAX16+EA=21F6OH即 可 2)如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可定位多少内存单元? 结论:偏移地址16位,变化范围为0FFFH,仅用偏移地址来寻址最多可寻64KB个内存单元 比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000 A-IFFFFH 在8086C机中,存储单元的地址用两个元素来描述。即段地址和偏移地址。 “数据在21F60H内存单元中。”对于8086PC机这句话一般不这样讲,取而代之的是两种类似的说 法:(1)数据存在内存20001F60单元中:(2)数据存在内存的2000段中的1F60单元中,这两种描述都表 示“数据在内存21F60单元中” 可以根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。 检测点22 (1)给定段地址为o0IH,仅迺过变化偏移地址寻址,CPU的寻址范围为。到 2)有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到 此单元,则SA应满足的条件是:最小为 最大为 (提示,反过来思考一下,当段地址给定为多少,CPU无论怎么变化偏移地址都无法寻 到200004单元?) 2.9段寄存器 我们前面讲到,8086CPU在访问内存时要由相关部件提供内存单元的段地址和偏移地 址,送入地址加法器合成物理地址。这里,我们要看一下,是什么部件提供段地址。段地 址在8086CPU的段寄存器中存放808CPU有4个段寄存器:CS、DS、SS、ES.当8086CPU 要访问内存时由这4个段寄存器提供内存单元的段地址。我们本课中只介绍CS 2.10cs和|P Cs和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地
汇编语言 址。CS为代码段寄存器,IP为指令指针寄存器,从名称上我们可以看出它们和指令的关系。 在8086PC机中,任意时刻,设CS中的内容为M,P中的内容为N,8086CPU将从 内存M×16+N单元开始,读取一条指令并执行。 也可以这样表述:8086机中,任意时刻,CPU将CSP指向的内容当作指令执行 图2.10展示了8086CPU读取、执行指令的工作原理(图中只包括了和所要说明的问题 密切相关的部件,图中数字都为十六进制 汇输指令 吕 2312000 >mov ax,0123H 0120002 BB]2000 指令缓冲器 nov bx, 0003H 30位地址总线L0020005 8920006 部件 数据总线 D2007 ass ax. bx 输入输出 图2108096Pc读取和执行指令的相关部件 图2.10说明: (1)8086CPU当前状态:CS中的内容为2000H,P中的内容为1000H (2)内存2000-2000H4单元存放着可执行的机器码 (3)内存2000+12000H单元中存放的机器码对应的汇编指令如下 地址:20000-20002H,内容:B82301,长度:3B,对应汇编指令: mov ax012JH 地址:200032000H,内容:BB0300,长度:3B,对应汇编指令: mov bx.000H 地址:20006H12000H,内容:89D8,长度:2B,对应汇编指令: mov ax bx 地址:20008H-20009H,内容:01D8,长度:2B,对应汇编指令:adax.bx 卜面的一组图(图211-图2.19),以图2.10描述的情况为初始状态,展示了8086CPU 读取、执行一条指令的过程。注意每幅图中发生的变化。(下面对8086CPU的描述,是在 逻辑结构、宏观过程的层面上进行的,目的是使读者对CPU工作原理有一个清晰、直观的 认识,为汇编语言的学习打下基础。其中省略了CPU的物理结构以及具体的工作细节。) 图2.11所示为初始状态,这时,CS:2000H,1P00004,CPU将从内存2000H×16+00004 处读取指令执行。 图2.12中有了一点变化,即CS、IP中的内容送入地址加法器,由地址加法器完成: 物理地址=段地址×16+偏移地址