无法将变量分配给所需的内存位置

问题描述 投票:0回答:1

我是组装新手。我正在尝试将一些数字移动到从

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

assembly memory-address emu8086
1个回答
0
投票
大多数汇编程序中的

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.
© www.soinside.com 2019 - 2024. All rights reserved.