我在汇编 / 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 中。)
我是汇编的初学者。我想打印数组的 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 中。)