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

Alc*_*isz 1 assembly real-mode memory-segmentation x86-16

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

有人可以逐步解释我如何解决这个问题吗?

Mar*_*nau 5

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

16 * 段 + 偏移

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

段 = 1A3H,偏移 = 2 或
段 = 1A2H,偏移 = 12H 或
段 = 1A1H,偏移 = 22H 或
...
段 = 0,偏移 = 1A32H

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

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

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

另请注意,偏移量为 16 位数字。

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

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

段 = 1A32H,偏移 = 5 或
段 = 1A31H,偏移 = 15H 或
...
段 = 0A33H,偏移 = 0FFF5H