Assembly 写入不带段寄存器的地址

Assembly 写入不带段寄存器的地址,assembly,x86,nasm,x86-16,real-mode,Assembly,X86,Nasm,X86 16,Real Mode,我知道这段代码实际上会将数据写入ds:[100h] mov [100h], ax 但我如何直接写入线性地址100H,而不使用任何段寄存器作为段基址?无法绕过段寄存器;每个内存访问都与某个段寄存器有关。如果要写入绝对地址,请首先加载具有适当段的段寄存器: xor cx, cx mov es, cx ; es = 0000 mov [es:100h], ax ; [0000:0100] = ax 要在8086或80286系统上加载大于

我知道这段代码实际上会将数据写入ds:[100h]

mov [100h], ax

但我如何直接写入线性地址
100H
,而不使用任何段寄存器作为段基址?

无法绕过段寄存器;每个内存访问都与某个段寄存器有关。如果要写入绝对地址,请首先加载具有适当段的段寄存器:

        xor cx, cx
        mov es, cx        ; es = 0000
        mov [es:100h], ax ; [0000:0100] = ax
要在8086或80286系统上加载大于16位的线性地址,请尝试以下操作:

addr    dd 0x12345        ; the address we want to load from
        ...
        mov bl, [addr]    ; load low part
        xor bh,bh
        mov cx, [addr+1]  ; load high part
        shl cx, 4         ; adjust high part for segment selector
        mov es, cx        ; load segment register
        mov [es:bx], ax   ; store ax

afair实模式不支持平面内存寻址,仅支持分段寻址,但如果地址超过16位怎么办?例如0x12345h?@Jack如果您有386或更高版本,您可以使用我用32位地址概述的方法。否则,您必须手动将地址分解为段和偏移量。如果你愿意,我可以为第二种情况添加代码。好的,我理解。你能告诉我第二个案子的密码吗?我想学习。谢谢@杰克加了一个例子。@PeterCordes哦,是的,的确如此。我还可以将其规格化为8位偏移量和12位段,让我这样做。