2014-02-09 55 views
1

我在8086中編寫這個彙編程序,但它不能正常工作。即使我使用單位數字,商和餘數也會打印爲一些隨機符號。有人可以指出程序中的錯誤/錯誤嗎?謝謝。在8086彙編MASM中的分部

.model small 
.stack 50h 

.data 
Divisor db ? 
Dividend db ? 
Quotient db ? 
Remainder db ? 

.code 
main_method proc 
       mov ax, @data 
       mov ds, ax 

       mov ah, 01 
       int 21h 
       sub al, 48 
       mov Divisor, al 

       mov ah, 01 
       int 21h 
       sub al, 48 
       mov Dividend, al 
       mov bl, 00 
       mov al, 00 
       mov bl, Divisor 
       mov al, Dividend 
       div bl 

       mov Quotient, al 
       mov Remainder, ah 

       mov dl, Quotient 
       add dl, 48 
       mov ah, 02 
       int 21h 

       mov dl, Remainder 
       add dl, 48 
       mov ah, 02 
       int 21h 
       mov ah, 4ch 
       int 21h 
main_method endp 
       end main_method 
+1

_ 「它不能正常工作」 _可能意味着什麼。更加詳細一些。 – Michael

+0

即使我使用單個數字的數字,商和餘數也會打印出一些隨機符號。 – user3226056

+0

如果您評論您的代碼,這將有所幫助!特別是因爲這是許多年來沒有使用過的代碼!另外,它會幫助你發現錯誤。 – Gunner

回答

4

DIV BL共分AXBL 16位的值,所以你應該清除你不使用(在這種情況下,整個高字節)的AX那些位。在DIV之前所以,正確的,要麼添加:

MOV AH,0 

XOR AH,AH ; XORing something with itself clears all bits 


或者,如果你靶向80386或以上,你可以用MOVZX AX, BYTE PTR Dividend

+0

哦!非常感謝,邁克爾!重置(清除)阿解決了這個問題。我之前並沒有把它清楚,認爲它會取代現有的價值,儘管我錯了。謝謝。 – user3226056

1

基本上DIV更換Mov Al, Dividend函數除以AX然後將商數放入AL和其餘部分AHAXAHAL組成。因此,如果您只想劃分AL那麼您必須確保AH是。你可以用下面的方法做零。

MOV AH, 0 

OR

AND AH, 0 

OR

XOR AH, AH