我已經撰寫了添加兩個陣列并將結果存盤在第三個陣列中的代碼。但是在處理 NEGATIVE SIGN 數字以顯示 (-) 符號時會出現問題。下面是下面列出的代碼,同時用陣列 2 減去陣列 1 的第 6 個元素,結果是 GARBAGE 值 需要立即幫助。運行執行代碼后,所有簽名值均未正確顯示。
org 100h
Array1 db 1,3,2,2,2,2,2,2,2,2
Array2 db 4,5,6,7,8,9,0,1,2,3
Array3 db 10 dup (?)
lea dx, msg1
mov ah, 9
int 21h
mov cx, 10
mov bx, 0
L1001:
mov al, Array1 [bx]
; Extend (unsigned) AL to AX (to print)
mov ah, 0
call printd
mov ah, 2
mov dl, 09 ;TAB Character
int 21h
inc bx
loop L1001 ;End Loop1
mov ah,2
mov dl,10
int 21h
mov dl,13
int 21h
; print msg2
lea dx, msg2
mov ah, 9
int 21h
; Use loop to print values of Array2
mov cx, 10
mov bx, 0
L1002:
mov al, Array2 [bx]
; Extend (unsigned) AL to AX (to print)
mov ah, 0
call printd
mov ah, 2
mov dl, 09 ;TAB Character
int 21h
inc bx
loop L1002 End Loop2
mov ah,2
mov dl,10
int 21h
mov dl,13
int 21h
; print msg3
lea dx, msg3
mov ah, 9
int 21h
mov cx,10
mov bx, 0
L1003: ; Main Addition
mov al, Array1 [bx]
sub al, Array2 [bx]
mov Array3 [bx], al
; Extend (unsigned) AL to AX (to print)
mov ah, 0
call printd
mov ah, 2
mov dl, 09 ;TAB Character
int 21h
inc bx
loop L1003 ; End of lOOP3
lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx
; wait for any key....
mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
printd proc
; preserve used registers
push ax
push bx
push cx
push dx
; if negative value, print - and call again with -value
cmp ax, 0
jge L1
mov bx, ax
; print -
mov dl, '-'
mov ah, 2
int 21h
; call with -AX
mov ax, bx
neg ax
call printd
jmp L3
L1:
; divide ax by 10
; ( (dx=0:)ax / cx(= 10) )
mov dx, 0
mov cx, 10
div cx
; if quotient is zero, then print remainder
cmp ax, 0
jne L2
add dl, '0'
mov ah, 2
int 21h
jmp L3
L2:
; if the quotient is not zero, we first call
; printd again for the quotient, and then we
; print the remainder.
; call printd for quotient:
call printd
; print the remainder
add dl, '0'
mov ah, 2
int 21h
L3:
; recover used registers
pop dx
pop cx
pop bx
pop ax
ret
printd endp
printud proc ;Print Undecimal Numbers
push ax
push bx
push cx
push dx
mov dx, 0
mov cx, 10
div cx
cmp ax, 0
jne L4
add dl, '0'
mov ah, 2
int 21h
jmp L5
L4:
call printud
add dl, '0'
mov ah, 2
int 21h
L5:
pop dx
pop cx
pop bx
pop ax
ret
printud endp ;
ret
msg1 db "Array 1 = $"
msg2 db "Array 2 = $"
msg3 db "Array 3 = : $"
pkey db "press any key...$"
uj5u.com熱心網友回復:
mov al, Array1 [bx] sub al, Array2 [bx] mov Array3 [bx], al ; Extend (unsigned) AL to AX (to print) mov ah, 0 call printd
您說您的程式無法顯示負數,但您的代碼從未向printd例程提供任何負數!無論 in 減法的簽名結果AL可能是什么,后面mov ah, 0的將產生一個正數 inAX并且它是printd處理...
您應該替換為.AXmov ah, 0cbw
但是,非常錯誤的是 3 個陣列的位置。他們不能像那樣處于程式的頂端。cpu 正在執行它們的位元組(資料),就好像它是指令(代碼)一樣!
將這 3 行移向源的底部。
看到這些顯示十進制數的遞回解決方案讓我感到驚訝。我相信他們是正確的,但有一個例外!如果您輸入負數-32768,則程式將陷入無限回圈。發生這種情況是因為該特定值的否定再次為 -32768。
您可能需要調查使用 DOS 顯示數字以獲取有關肯定更快的迭代解決方案的資訊(并且可以通過一次輸出所有數字來進一步改進)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/430134.html
