我是组装新手。我正在尝试将一些数字移动到从
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
开始,然后在行 0000
之后转到
MOV DS, AX
MOV AL, NUM1
尝试加载标记为NUM1
(即1)的字节的offset。如果要加载这个字节的contents,总是写
MOV AL,[NUM1]
比较好。这样的指令从标记为AL
的内存中加载寄存器NUM1
,并使用默认段寄存器DS
进行内存寻址,因为没有指定段覆盖。 las,您的寄存器 DS
未初始化为指向 .data
所在的 NUM1
段。
尝试另一种选择:
.data
NUM0 DB 00H
NUM1 DB 22H
NUM2 DB 00H
NUM3 DB 35H
NUM4 DB 71H
NUM5 DB 03H
.code
MOV AX, .data ; or whichever syntax emu8086 supports
MOV DS, AX ; Source segment address.
MOV AX, 0800H
MOV ES, AX ; Destination segment address.
MOV AL, [NUM1]
MOV ES:[0010], AL
MOV AL, [NUM2]
MOV ES:[0011], AL
MOV AL, [NUM3]
MOV ES:[0012], AL
MOV AL, [NUM4]
MOV ES:[0013], AL
MOV AL, [NUM5]
MOV ES:[0014], AL
或者,当 NUM* 值在写入时已知时,您可以使用它们的立即值:
.code
MOV AX, 0800H
MOV BYTE [0010],22H ; NUM1
MOV BYTE [0011],00H ; NUM2
MOV BYTE [0012],35H ; NUM3
MOV BYTE [0013],71H ; NUM4
MOV BYTE [0014],03H ; NUM5
另一种选择是使用 STOSB 的 mem2mem 复制:
.data
NUM0 DB 00H
NUM1 DB 22H
NUM2 DB 00H
NUM3 DB 35H
NUM4 DB 71H
NUM5 DB 03H
.code
.code
MOV AX, .data ; or whichever syntax emu8086 supports
MOV DS, AX ; Source segment address.
MOV AX, 0800H
MOV ES, AX ; Destination segment address.
MOV SI,OFFSET NUM1 ; Source offset.
MOV DI,0010H ; Destination offset.
MOV CX,5 ; Number of copied bytes.
CLD ; Direction of transfer.
REP MOVSB ; Copy CX bytes from DS:SI to ES:DI.