有没有一种标准方法可以在实模式下找出物理地址的 seg:off 表示形式?

Is there a standard way to figure out a seg:off representation of a physical address in real mode?

所以,我知道 segment:offset 的物理地址等于 segment * 0x10 + offset,但是反过来我该怎么做呢?

如果我有一个地址 0x1038 将线性物理地址转换为 segment:offset 分段地址的公式是什么。

(它是 0x10 而不是普通的 10,只是为了确保我们在同一页上。)

这取决于上下文,有许多不同的方法可以通过这种方式寻址相同的内存位置。其实有0x1000(4096)种方式1.

Segment = Address >> 4Offset = Address & 0xF 是一种方式,Segment = (Address & 0xF0000) >> 4Offset = Address & 0xFFFF 是另一种方式,但还有很多很多。

这是因为最终地址的段和偏移量的范围重叠:

  SSSS   Segment
+  OOOO  Offset
----------------
= AAAAA  Address

因此,地址 0x12345 可以由所有这些 segment/offset 对表示:

0235:FFF5
0236:FFE5
0237:FFD5
...
0FFD:2375
0FFE:2365
0FFF:2355
1000:2345
1001:2335
1002:2325
1003:2315
...
1232:0025
1233:0015
1234:0005

当然,如果您已经知道段或偏移量应该是什么,这很容易 - 然后您可以使用简单的代数来计算另一个。


1:这在地址范围的低端(低于 0x0FFF0)附近不成立,其中某些段和偏移量的组合会导致大于 0xFFFFF 的物理地址,如果没有活动的第 21 地址线(A20),则只能用于表示低地址,导致地址回绕,否则表示相同地址的方法会更少。