我在汇编 / emu8086 中使用数组时遇到问题

I have trouble using arrays in assembly / emu8086

我是汇编的初学者。我想打印数组的 2 个成员。
这就是我第一次编写代码的方式:

        mov PRIME_NUMBERS[1],2
        mov ax,PRIME_NUMBERS[1]
        call PRINT
        
        mov PRIME_NUMBERS[2],3
        mov ax,PRIME_NUMBERS[2]
        call PRINT

它打印出“23”,没问题,但是当我这样编码时:

        mov PRIME_NUMBERS[1],2
        mov PRIME_NUMBERS[2],3
        mov ax,PRIME_NUMBERS[1]
        call PRINT
         
        mov ax,PRIME_NUMBERS[2]
        call PRINT

它打印“7703و”。 1号元素好像被770号代替了。我找不到我的错误了!

我的代码:

.MODEL SMALL
.STACK 100H
.DATA
max_num_check dw ?
current_num dw ?
prime_numbers dw 100 DUP (0)

.CODE

MAIN PROC

        ;define data segment 
        mov ax,@DATA
        mov DS,ax
        ;------------------
        
        mov PRIME_NUMBERS[1],2
        mov ax,PRIME_NUMBERS[1]
        call PRINT
        
        mov PRIME_NUMBERS[2],3
        mov ax,PRIME_NUMBERS[2]
        call PRINT
        
        HLT 
MAIN ENDP

; to print numbers , you should use mov ax,number and CALL PRINT
PRINT PROC  
         mov cx,0
         mov dx,0
         mov bx,10
         l1:
         cmp ax,0
         je l2
         
         div bx
         push dx
         inc cx
         xor dx,dx
         jmp l1
         
         l2:
         cmp cx,0
         je end
         pop dx
         add dx,'0'
         dec cx
         mov ah,2h
         int 21h
         jmp l2
         
         end:
         xor ax,ax
ret   
PRINT ENDP

MAX_NUM_TO_CHECK PROC 
    mov cx,0
    here:
    mov ax,cx
    mul cx
    cmp ax,current_num
    jge store
    inc cx
    jmp here
    
    store:
    mov max_num_check,cx
ret
MAX_NUM_TO_CHECK ENDP

END MAIN

770 是十六进制的 0302。请注意,值 3 出现在高位字节。

汇编程序不会按数组成员的大小缩放下标,因此 PRIME_NUMBERS[1] 是 PRIME_NUMBERS+1 而不是 PRIME_NUMBERS+2,如您所愿.

每个数字占两个字节。它将第一个数字存储到字节 PRIME_NUMBERS+1 和 PRIME_NUMBERS+2 中。 它将第二个数字存储到字节 PRIME_NUMBERS+2 和 PRIME_NUMBERS+3 中,覆盖第一个数字的高位字节。然后,当它尝试读取第一个数字时,它会将第一个数字的一​​个字节和第二个数字的一​​个字节压缩成一个值。

(实际上,您可能打算将第一个数字存储在 PRIME_NUMBERS+0 中,将第二个数字存储在 PRIME_NUMBERS+2 中。)