在真实的模式内存寻址中,有16个大小为64KB的段,并且有4个段寄存器,那么系统在哪里存储这16个地址呢?
0. 00000 1. 10000 2. 20000 3. 30000 : : 14. E0000 15. F0000
例如,如果我的系统分别使用CS、DS、ES和SS中的前4个段起始地址,那么剩余的12个地址将存储在哪里?
ogsagwnx1#
不需要将它们存储在任何地方。当你使用段地址时,你可以将它加载到你选择/需要的段寄存器中(顺便说一句,段地址不一定要在64 K的边界上,只要是16的倍数即可)。例如,假设我想将物理地址为0x 12345的某个值加载到al中,那么我会先执行mov ds, 0x1234,然后执行mov al, [0x5](注意,该指令隐含地使用ds:,但是您也可以手动地指定它)-或者mov ds, 0x1000; mov al, [0x2345],或者任何其他组合,只要其总和达到我想要的值(物理地址=段 * 16 +偏移量)。我通常会以这样一种方式组织我的内存:我经常一起需要的东西可以通过同一个段访问,也就是说,在64 K以内,这样我就不必一直切换段。
al
mov ds, 0x1234
mov al, [0x5]
ds:
mov ds, 0x1000; mov al, [0x2345]
1条答案
按热度按时间ogsagwnx1#
不需要将它们存储在任何地方。当你使用段地址时,你可以将它加载到你选择/需要的段寄存器中(顺便说一句,段地址不一定要在64 K的边界上,只要是16的倍数即可)。
例如,假设我想将物理地址为0x 12345的某个值加载到
al
中,那么我会先执行mov ds, 0x1234
,然后执行mov al, [0x5]
(注意,该指令隐含地使用ds:
,但是您也可以手动地指定它)-或者mov ds, 0x1000; mov al, [0x2345]
,或者任何其他组合,只要其总和达到我想要的值(物理地址=段 * 16 +偏移量)。我通常会以这样一种方式组织我的内存:我经常一起需要的东西可以通过同一个段访问,也就是说,在64 K以内,这样我就不必一直切换段。