计算段:从绝对地址偏移

时间:2012-02-27 11:52:49

标签: assembly x86-16 memory-segmentation

我可以将地址Segment:Offset计算为Segment * 0x10 + Offset。但是我如何计算相反的结果?

E.g。如何从0xF4170F400:0170以及从0xACF04ABCD:1234

1 个答案:

答案 0 :(得分:3)

您需要具有基数或偏移量以及线性地址,因为多个Segment:Offset对可以映射到相同的线性地址。

因此,如果我们有细分0xF400和线性地址0xF4170,我们会得到0xF4170 - (0xF400 << 4)的偏移0x170


这样做只知道线性地址没有唯一的解决方案,所以你必须选择一个约定,将20位地址拆分成16字节对齐的seg部分和字节偏移量。一个可能的功能是:

  • Segement = linear >> 4(前16位)
  • offset = linear & 0x0F(低4位)

您可以选择12:8位的规范形式,为将来扩展留出更宽的线性地址。