我是組裝的初學者。我想列印一個陣列的 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
uj5u.com熱心網友回復:
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 中。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/457486.html
上一篇:C中的行內匯編
下一篇:GDB中ASM標簽的地址
