我是一个汇编新手。我想把一些数字从0800:0010
开始移到内存位置,但是找不到。
下面是代码:
.data
NUM0 DB 00H
NUM1 DB 22H
NUM2 DB 00H
NUM3 DB 35H
NUM4 DB 71H
NUM5 DB 03H
.code
MOV AX, 0800H
MOV DS, AX
MOV AX, 0010H
MOV ES, AX
MOV DS:[0010], NUM1
MOV DS:[0011], NUM2
MOV DS:[0012], NUM3
MOV DS:[0013], NUM4
MOV DS:[0014], NUM5
代码给出一个错误:
(15)错误参数:MOV [0000], NUM1
所以我尝试了一个替代代码:
.data
NUM0 DB 00H
NUM1 DB 22H
NUM2 DB 00H
NUM3 DB 35H
NUM4 DB 71H
NUM5 DB 03H
.code
MOV AX, 0800H
MOV DS, AX
MOV AX, 0010H
MOV ES, AX
MOV AL, NUM1
MOV DS:[0010], AL
MOV AL, NUM2
MOV DS:[0011], AL
MOV AL, NUM3
MOV DS:[0012], AL
MOV AL, NUM4
MOV DS:[0013], AL
MOV AL, NUM5
MOV DS:[0014], AL
这不会给予任何错误,但是我想要的内存位置0800:0010是空的。而且,即使NUM0
是无用的,如果我不包括它,NUM1
会变成57H。当我包括它时,问题似乎消失了。
此外,看起来DS寄存器似乎从0100
开始,然后在MOV DS, AX
行之后转到0000
。
1条答案
按热度按时间czfnxgou1#
大多数汇编器中的
MOV AL, NUM1
尝试加载标记为NUM1
的字节的偏移量(即1)。如果要加载该字节的内容,最好写MOV AL,[NUM1]
。此类指令从标记为NUM1
的内存中加载寄存器AL
,并使用默认段寄存器DS
进行内存寻址,因为没有指定段覆盖。遗憾的是,您的寄存器DS
没有初始化为指向NUM1
所在的.data
段。请尝试另一种方法:或者,当NUM* 值在写入时已知时,您可以使用其立即值:
另一种方法是使用MOVSB复制mem2mem: