自从我开始使用 8086 汇编语言编程以来,我一直在思考这些段和段寄存器。我面临的问题是,我无法对脑海中的片段有一个直观的图像,因此我不清楚这些概念。
- 谁能帮我理解这个概念将其与现实世界场景联系起来?我还有以下问题:
问题一:
据我了解,在启用20条地址线的16位实模式下,我们可以将物理内存分为16个段,每个段64KiB。第一段开始于0x00000
。下一个段的起始地址是什么。会不会是通过添加0x10000
(65536 = 64KiB)?
问题2:
在这里问这个问题有点奇怪,但仍然是我唯一的选择。假设如果给我一个偏移地址0x6000
,如何找到它所属的段以便对其进行寻址。
Thanks
...我们可以将物理内存分为 16 段,每段 64KiB。
确实如此,但更准确的说法是“16不重叠段”,因为也可以将内存分为 65536 个重叠段。
当A20线启用时,我们有超过1MB的空间可以使用。 (1048576+65536-16) 当将相关段寄存器设置为0xFFFF时,我们可以访问0x0FFFF0和0x10FFEF之间的内存。
两种细分市场的主要特点是:
- Non-overlapping segments
- 包含65536字节。
- 内存中相距 65536 字节。
- This is the way us people often conveniently view memory. It enables us to say that we've put
- A 段中的图形窗口 (0xA0000-0xAFFFF)
- B段中的文本视频窗口(0xB0000-0xBFFFF)
- F 段中的 BIOS (0xF0000-0xFFFFF)
-
重叠线段
假设如果给我一个偏移地址0x6000,我怎样才能找到它所属的段以便寻址它。
问题又出在措辞上!
如果“偏移地址 0x6000”指的是像我们通常在实地址模式编程中使用的偏移量,那么这个问题就无法回答,因为每个存在的段中都有这样一个偏移量0x6000!
另一方面,如果措辞“0x6000 的偏移地址”实际上指的是线性地址0x6000 那么该段寄存器的解决方案有很多:
segment:offset
--------------
0000:6000
0001:5FF0
0002:5FE0
0003:5FD0
...
05FD:0030
05FE:0020
05FF:0010
0600:0000
正如您所看到的,有 0x0601 可能的段寄存器设置可以到达线性地址 0x6000。
以上适用于 A20 线确实启用时。如果 A20 处于非活动状态,则可以通过精确的 0x1000 (4096) 方式到达线性地址 0x6000(就像从 0 到 1MB-1 的任何其他线性地址一样):
segment:offset
--------------
F601:FFF0
F602:FFE0
F603:FFD0
...
FFFD:6030
FFFE:6020
FFFF:6010
0000:6000
0001:5FF0
0002:5FE0
0003:5FD0
...
05FD:0030
05FE:0020
05FF:0010
0600:0000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)