【问题标题】:Physical address calculation assembly IAPX8088物理地址计算组件 IAPX8088
【发布时间】:2015-08-21 16:17:43
【问题描述】:

假设:CS=0x5645,DS=0x1000,ES=0x6783,SS=0x0FFF,BX=0x4567,SI=0x1000,DI=0x2000,BP=0x4500
如果 ax=0,则写入下面指令读取或写入的内存位置的物理地址。

mov ax,[si]        
mov ax,[bp]        
mov ax,cs:[bp+20]
mov ax,[bx+si+10]  
mov ss:[bx+di],ax  
mov es:[bp+si+0x200],20 

这种方式计算地址的公式是什么,如何处理段寄存器。

【问题讨论】:

    标签: assembly x86-16


    【解决方案1】:

    要计算物理地址,请执行以下操作:

    • 方括号之间的所有组件必须使用 64KB 环绕相加,因此总和在 [0,65535] 中。
    • 段寄存器的值必须先乘以 16,然后使用 1MB 环绕加到结果中,因此总和在 [0,1048575] 中。注意使用正确的段寄存器!

    例子:

    mov ax,es:[bx+si+123]
    

    物理地址为(((bx+si+123) and 0x0000'FFFF)+es*16) and 0x000F'FFFF

    【讨论】:

    • 和第一个mov ax一样,[si]地址就是si的值?
    • 没有。您需要将 DS*16 添加到 SI 的值。使用当前数字你得到 0x1000 * 16 + 0x1000 给出 0x11000
    • 所有内存访问都使用段寄存器,如果没有指定,则使用默认值。对于[si],这是ds 段。如果使用bp,则默认为ss段,否则为ds
    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2021-04-17
    • 2017-03-27
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多