Assembly 在x&;y点

Assembly 在x&;y点,assembly,nasm,x86-16,Assembly,Nasm,X86 16,我想在X和Y位置显示一个字符,但不在屏幕上打印任何内容。我的ASCII字符是“9829”。有什么想法吗 org 100h MOV AX,0b800h MOV ES,AX MOV AX,poz_y MOV BX,80 MUL BX ADD AX,poz_x MOV BX,2 MUL BX MOV DI,AX MOV [ES:DI],Word 9829h mov ax, 0x4c00 int 21h poz_x dw 10 poz_y dw 10 NASM要求将poz_x和poz_y放

我想在X和Y位置显示一个字符,但不在屏幕上打印任何内容。我的ASCII字符是“9829”。有什么想法吗

 org 100h

MOV AX,0b800h
MOV ES,AX
MOV AX,poz_y
MOV BX,80
MUL BX
ADD AX,poz_x
MOV BX,2
MUL BX
MOV DI,AX
MOV [ES:DI],Word 9829h  


mov ax, 0x4c00
int 21h
poz_x dw 10
poz_y dw 10

NASM要求将
poz_x
poz_y
放在括号内,如
[poz_x]


如果没有括号,它会将这些变量的偏移量加载到寄存器中。括号导致变量的地址被取消引用,以便读取其值。

,这意味着您需要使用
[poz_y]
[poz_x]
。另外,我的nasm甚至不能按原样组装,因为缺少
MOV[ES:DI],9829h
的操作数大小,应该是
MOV-WORD[ES:DI],9829h
是的,我知道
WORD
,我只是错过了这里,抱歉。@Jester好的,用括号表示它真的工作了,谢谢m8!)你有什么办法把心放在这里吗?因为我以为它是“9829h”,但不起作用,所以我必须检查:p.
29h
=
。要乘以二的幂,你只需按幂向左移动。在您的例子中,*2乘以二的一次幂,即整个偏移量计算可能如下:
。设置es..
mov ax,[poz_y]
mov dx,80
mov di,[poz_x]
mul dx
add di,ax
shl di,1
mov[es:di],word 980h
(对*80也使用
dx
,因为
mul
会以任何方式修改
dx
,所以也没有必要修改
bx
)。CPU做
shl
而不是
mul
的难度要小得多(它过去在几十个时钟周期中产生差异,现在差异很小,但仍然存在)。