📄 汇002.txt
字号:
计算存储单元物理地址的公式可用“左移4位”和“加”运算来实现。图2.5是物理地址的计算示意图。
图2.5 16位CPU物理地址计算示意图 图2.6 物理地址和逻辑地址之间的关系
对物理地址来说,当段地址变化时,只要对其偏移量进行相应的调整就可对应同一个物理地址,所以,同一个物理地址可有多个逻辑地址。如图2.6所示。
在汇编语言程序中,存储单元通常不是用其物理地址标识的,而是用其逻辑地址标识的。逻辑地址的段地址由段寄存器给出,偏移量可由寄存器(SI、DI、BP和BX等)给出,也可用符号地址或具体的数值给出。至于在指令中如何指出存储单元的逻辑地址将在第3章“寻址方式”中给出详细说明。
3、段寄存器的引用
段寄存器是因为对内存的分段管理而设置的。16位CPU有四个段寄存器,所以,其程序可同时访问四个不同含义的段。段寄存器及其偏移量的引用关系如图2.7所示。
段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。
段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。
段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。
图2.7 段和段寄存器的引用示意图
通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES。当然,在一般指令中,我们还可以用强置前缀的方法来改变操作数的段寄存器(见:第3.3节中的强置前缀的书写格式)。
一般情况下,段寄存器及其指针寄存器的引用关系如下表所示。表2.2中的“可选用的段寄存器”即是可以用强置说明这些段寄存器的值来作为其操作数地址的段地址。
表2.2 段寄存器及其指针寄存器的引用关系
访问存储器方式 缺省的段寄存器 可选用的段寄存器 偏移量
取指令 CS IP
堆栈操作 SS SP
一般取操作数 DS CS、ES、SS 有效地址
串操作 源操作数
DS CS、ES、SS SI
目标操作数
ES DI
使用指针寄存器BP
SS CS、DS、ES 有效地址
由上表可以看出16位CPU在段寄存器的引用方面有如下规定:
、取指令所用的段寄存器和偏移量一定是用CS和IP;
、堆栈操作所用的段寄存器和偏移量一定是SS和SP;
、串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI;
、其它情况,段寄存器除了其默认引用的寄存器外,还可以强行改变为其它段寄存器。
对于上述规定,随着后续内容的叙述,将会对它们有更进一步理解。
4、存储单元的内容
上面,我们讲述了16位微机的内存管理及其相关知识,知道了内存单元物理地址的计算方法,这使我们能很容易地指定所要访问的存储单元。但存储单元里的内容是如何存放的呢?下面就能描述数值在内存的存放形式。
存储单元中所存放的二进制信息通常称为该存储单元的内容或值,并且规定:
、一个字节的内容是该字节单元内存放的二进制信息;
、一个字的内容是该字地址所指向的单元及其后继一个单元的内容拼接而成;
、一个双字的内容是该字地址所指向的单元及其后继三个单元的内容拼接而成。
在拼接“字内容”时,我们按“高高低低”的原则来处理,即:高存储单元(地址大的存储单元)的值是“字内容”的高8位,低存储单元(地址小的存储单元)的值是“字内容”的低8位。在拼接“双字内容”时也是如此。
右图2.8是一段内存单元存放数据的例子。
从图中可看出下列存储结果:
图2.8 内存单元存放内容示意图
、字节12340H、12341H的内容分别为:12H和34H等;
、字12340H、12341H的内容分别为:3412H和5634H等;
、双字12340H、12341H的内容分别为:78563412H和90785634H等。
2.2.2 32位微机的内存管理模式
32位微机的内存存管理仍然采用“分段”的管理模式,存储器的逻辑地址同样由段地址和偏移量两部分组成。32位微机的内存管理与16位微机的有相同之处,也有不同之处,因为它提供了两种不同工作方式:实方式和保护方式。
1、物理地址的计算方式
实方式:段地址仍然是16的倍数,每个段的最大容量仍为64K。段寄存器的值是段的起始地址,存储单元的物理地址仍为段寄存器的值乘16,再加上段内偏移量。在此方式下,32位微机的内存管理与16位微机是相一致的。
保护方式:段地址可以长达32位,其值可以不是16的倍数,每个段的最大容量可达4G。段寄存器的值是表示段地址的“选择器”(Selector),用该“选择器”可从内存中得到一个32位的段地址,存储单元的物理地址就是该段地址加上段内偏移量,这与16位微机的物理地址计算完全不同。
2、段寄存器的引用
32位CPU内有6个段寄存器,程序在某一时刻可访问6个不同的段。其段寄存器的值在不同的方式下具有不同的含义:
(1)、在实方式下,段寄存器的值就是段地址;
(2)、在保护方式下,段寄存器的值不是段地址,是段地址的“选择器”。它间接指出一个32位的段地址。
下面分别说明各段寄存器的用法和作用。
代码段寄存器:32位微机在取指令时,系统自动引用CS和EIP来取出下条指令。在实方式下,由于段的最大容量不超过64K,所以,EIP的高16位全为0,其效果相当于16位CPU中的IP。
堆栈段寄存器:32位微机在访问堆栈段时,总是引用堆栈段寄存器SS。但在不同的方式下其堆栈指针有所不同:
1)、在实方式下,32位微机把ESP的低16位SP作为指向堆栈的指针,所以,我们可以认为栈顶单元是由SS和SP来指定的。这就与16位微机访问栈顶单元的方法相一致;
2)、在保护方式下,堆栈指针可用32位的ESP和16位的SP。
数据段寄存器:DS是主要的数据段寄存器。通常情况下,它是除访问堆栈以外数据时的默认段寄存器。在某些串操作中,其目的操作数的段寄存器被指定为ES是另一个例外。
另外,段寄存器CS、SS、ES、FS和GS也都可以作为访问数据时的段寄存器,但它们必须用段超越前缀的方式在指令中直接写出。用这种方式会增加指令的长度,指令的执行时间也有所延长。
一般来说,程序频繁访问的数据段用DS来指向,不太经常访问的数据段可用ES、FS和GS等来指向。
3、存储单元的内容
32位微机存储单元内容的存储格式与16位微机的完全一致,也都采用“高高低低”的原则来存放数据。
2.3 习题
2.1、在16位CPU中,有哪些8位寄存器、16位寄存器?哪些16位寄存器可分为二个8位寄存器来使用?
2.2、和16位CPU相比,在32位CPU中,扩展了哪些寄存器?哪些寄存器的位数没变?所增加的寄存器是什么?
2.3、简述各通用寄存器的主要功能?
2.4、简述各段寄存器所指段的含义。
2.5、IP/EIP寄存器的用途是什么?它是《计算机组成原理》中的什么概念在CPU中的具体体现?
2.6、在标志寄存器中,用于反映运算结果属性的标志位有哪些?它们每一位所表示的含义是什么?在Debug环境下,用什么符号来表示之?
2.7、在标志寄存器中,用于反映CPU状态控制的标志位有哪些?它们每一位所表示的含义是什么?在Debug环境下,用什么符号来表示之?
2.8、填空
1)、16位/32位CPU在取指令时,分别需要用到的寄存器有 和 、 和 ;
2)、访问堆栈段栈顶单元要由 段寄存器和 寄存器组合来寻址,访问堆栈段中的单元要由 段寄存器和 寄存器组合来寻址;
3)、用基指针(BP)寻址存储器,则其用到的段寄存器是 ;
4)、访问数据段中的单元要由 段寄存器和 寄存器组合来寻址;
5)、在16位/32位微机系统中,程序最多能同时使用 数据段和 数据段;
2.9、假设用以下寄存器组合来访问存储单元,试求出它们所访问单元的物理地址。
1)、DS=1000H和DI=2000H
3)、SS=2300H和BP=3200H
5)、SS=2900H和SP=3A00H
2)、DS=2000H和SI=1002H
4)、DS=A000H和BX=1000H
2.10、在实方式下,一个20位的物理地址最多可有 个段值和偏移量来表示。
2.11、在默认情况下,哪些寄存器可用于读取堆栈段的数据?
2.12、按组画出下列数值在内存中的存储形式(假设同组分配在连续存储单元中)。
1)、字节值:1、2、'1'、'A'、'a'和0;
2)、字值:12H、6502H、-1和0;
3)、双字值:-765H、12345678H和0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -