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

ac1kyiln  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(150)

我是一个汇编新手。我想把一些数字从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

czfnxgou

czfnxgou1#

大多数汇编器中的MOV AL, NUM1尝试加载标记为NUM1的字节的偏移量(即1)。如果要加载该字节的内容,最好写MOV AL,[NUM1]。此类指令从标记为NUM1的内存中加载寄存器AL,并使用默认段寄存器DS进行内存寻址,因为没有指定段覆盖。遗憾的是,您的寄存器DS没有初始化为指向NUM1所在的.data段。请尝试另一种方法:

.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:[0010H], AL
    MOV AL, [NUM2]
    MOV ES:[0011H], AL
    MOV AL, [NUM3]
    MOV ES:[0012H], AL
    MOV AL, [NUM4]
    MOV ES:[0013H], AL
    MOV AL, [NUM5]
    MOV ES:[0014H], AL

或者,当NUM* 值在写入时已知时,您可以使用其立即值:

.code            
        MOV AX, 0800H 
        MOV DS,AX
        MOV BYTE [0010H],22H ; NUM1
        MOV BYTE [0011H],00H ; NUM2
        MOV BYTE [0012H],35H ; NUM3
        MOV BYTE [0013H],71H ; NUM4
        MOV BYTE [0014H],03H ; NUM5

另一种方法是使用MOVSB复制mem2mem:

.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 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.

相关问题