Alc*_*isz 1 assembly real-mode memory-segmentation x86-16
存储单元的物理地址以 1A32H 的形式给出。内存段的起始地址是什么。或者更准确地说,我应该用来访问它的 seg:off 地址。
有人可以逐步解释我如何解决这个问题吗?
在 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