当我有物理地址时,如何获取段内存地址?

How to get segment memory address, when i have physical address?

存储单元的物理地址以1A32H的形式给出。内存段的起始地址是什么。或者更准确地说,我应该用来访问它的 seg:off 地址。

谁能一步步向我解释如何解决这个问题?

在x86实模式下,物理地址计算为:

16 * segment + offset

所以物理地址1A32H可以通过不同的方式访问:

Segment = 1A3H, Offset = 2 or
Segment = 1A2H, Offset = 12H or
Segment = 1A1H, Offset = 22H or
...
Segment = 0, Offset = 1A32H

这取决于您选择的段和偏移量组合的用例:

如果地址是内存范围的起始地址(例如数组的第一个元素),您将使用更高的段值(段 1A3H,偏移量 2H)。

如果地址是内存范围的结束地址(例如初始堆栈指针),您将使用较低的段值(段 0,偏移量 1A32H)。

另请注意,偏移量是一个 16 位数字。

所以物理地址 >= 2^16 不能使用段值 0 访问:

可以使用以下方式访问地址 1A325H(作为示例):

Segment = 1A32H, Offset = 5 or
Segment = 1A31H, Offset = 15H or
...
Segment = 0A33H, Offset = 0FFF5H