【问题标题】:How to make 20 bit address by using two 16 bit registers?如何使用两个 16 位寄存器制作 20 位地址?
【发布时间】:2011-01-29 20:45:50
【问题描述】:

IAPX88可以处理1兆字节内存(20位寻址),现在我的问题是我们如何使用两个16位寄存器来制作20位地址。请举个例子。

【问题讨论】:

    标签: assembly x86-16 real-mode memory-segmentation


    【解决方案1】:

    我们可以使用移位加法来做到这一点。我们处理 2 位地址:逻辑地址表示为两个 16 位地址,物理地址是实际的 20 位地址。

    请记住,由于我们处理的是十六进制,每个数字代表 4 位。

    例如我们要使用两个 16 位地址来表示地址:7 2 3 A 5,我们可以使用两个地址:7 2 3 A 和 0 0 0 5。

    首先,我们将第一个地址向左移动四位:7 2 3 A 0,称为base。

    然后,我们添加第二个地址:0 0 0 5,称为偏移量。

    此操作的结果是一个新的 20 位地址:7 2 3 A 5。

    如果我们的基是CS,它是代码段的开始,我们的偏移量是指令指针IP,我们可以将前面的操作描述为:(CS << 4) + IP

    注意:我们可以使用许多 16:16 位的逻辑地址来描述任何 20 位的物理地址,但是每个 2 位逻辑地址只有一个物理地址。

    【讨论】:

      【解决方案2】:

      IAPX88 物理地址的计算方法是获取段寄存器,将其左移 4 位,然后加上偏移寄存器。

      例如,代码执行的内存物理地址是(CS<<4)+IP,其中CS是代码段,IP是指令指针。

      您可以通过Intel 8086 wikipedia page获取详细信息。

      【讨论】:

        猜你喜欢
        • 2022-10-16
        • 2018-03-31
        • 1970-01-01
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多