Я очень новичок в сборке. Я хочу напечатать 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.)