Assembly 写入不带段寄存器的地址
我知道这段代码实际上会将数据写入ds:[100h]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系统上加载大于
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位段,让我这样做。