2016-11-29 38 views
2

我正在製作一個程序,我要從用戶處取得兩個4位數字並顯示它們的總和。添加4位數字並顯示總和 - 彙編語言

我知道如何從用戶處取得4位數的輸入,但我無法將4位數的數字相加並顯示結果。

幫助需要知道如何添加和顯示兩個4位數字的總和。

我使用emu8086彙編

這是我迄今所做的。總和計算不正確。而不是顯示一個總和,一些跡象顯示,如「$」等

.model small 
.data 
st9 db 13,10,"Enter First Number : ",'$' 
st10 db 13,10,"Enter Second Number : ",'$' 
st11 db 13,10,"Result = ",'$' 
num dw ? 
num2 dw ? 
a dw 1000 
b db 100 
c db 10 
.code 
main proc 
    mov AX,@data 
    mov DS,AX 

    addition:  
    mov AH,9H 
    mov DX,offset st9 
    INT 21H 

    mov AH,1 
    INT 21H 
    SUB AL,30H 
    MUL a      ;1st digit 
    mov num,AX 

    mov AH,1 
    INT 21H 
    SUB AL,30H 
    MUL b      ;2nd digit 
    add num,AX 

    mov AH,1 
    INT 21H 
    SUB AL,30H 
    MUL c      ;3rd digit 
    ADD num,AX 

    mov AH,1 
    INT 21H      ;4th digit 
    SUB AL,30H 
    ADD num,AX 

    mov AH,9H 
    mov DX,offset st10 
    INT 21H 

    mov AH,1 
    INT 21H 
    SUB AL,30H 
    MUL a      ;1st digit 
    mov num2,AX 

    mov AH,1 
    INT 21H 
    SUB AL,30H 
    MUL b     ;2nd digit 
    ADD num2,AX 

    mov AH,1 
    INT 21H 
    SUB AL,30H 
    MUL c      ;3rd digit 
    ADD num2,AX 

    mov AH,1 
    INT 21H    ;4th digit 
    SUB AL,30H 
    ADD num2,AX 

    call addfunc 

    exit: 
    mov AH,4CH 
    INT 21H 

    addfunc proc near 

     mov BX,num2 
     ADD BX,num 
     SUB BX,48D 

     mov AH,9H 
     mov DX,offset st11 
     INT 21H 

     mov AH,2 
     mov DL,bH 
     INT 21H 

     mov AH,2 
     mov DL,bl 
     INT 21H 

     ret 

end main 
+0

那麼,你會得到什麼?參見[mcve]瞭解如何編寫更完整的問題。另外,當你單步執行內置於emu8086的調試器時,你會看到什麼? –

+0

您的代碼沒有任何評論,所以IDK爲什麼要從總和中減去'48D',但我沒有看到任何會將整數轉換回十進制數字的東西。 –

+0

@PeterCordes而不是顯示總和,一些標誌顯示在屏幕上,如$等。我也編輯了我的問題。 – Yousaf

回答

3

之前擔心的總和在控制檯上,你需要確保輸入是正確的。可悲的是他們錯了!

計算您使用的第一位數字時mul a。由於變量被定義爲一個字(值爲1000),因此該乘法是一個字大小的操作,所以它實際上將AX寄存器與變量相乘。您的程序只能在AL寄存器中獲得一個值,這只是AX寄存器的低一半。 您需要事先將上半部分AH清零。

mov AH,1 
INT 21H 
SUB AL,30H 
mov ah,0   <<<<<<<<<< Add this 
MUL a    ;1st digit 
mov num,AX 

的第二和第三位的代碼是確定的,但第4位是錯了。 add num,ax指令依賴於您未設置的上半部分AH的內容。

mov AH,1 
INT 21H   ;4th digit 
SUB AL,30H 
mov ah,0   <<<<<<<<<< Add this 
ADD num,AX 

你需要NUMNUM2這些修正。


addfunc proc near 
    mov BX,num2 
    ADD BX,num 
    SUB BX,48D 

有從您在addfunc程序計算總和減去48D沒有任何意義。
此外,使用顯示字符從DOS的函數BL和BH中的字節不顯示結果數字。
下面是如何在AX中的屏幕上顯示一個16位數一個版本:

addfunc proc near 
mov ax,num2 
add ax,num 

xor cx,cx ;Counts the digits 
mov bx,10 ;Fixed divider 
more: 
xor dx,dx ;Word division needs to zero DX! 
div bx 
push dx  ;Remainder [0,9] 
inc cx  ;One digit more 
test ax,ax 
jnz more ;Continu until AX is empty 
next: 
pop dx 
add dl,48 ;Turn into a character, from [0,9] to ["0","9"] 
mov ah,02h ;DOS DisplayCharacter function 
int 21h 
loop next ;Continu for all digits (*) 

(*)由於兩個4位數字的總和爲0至19998,的位數即顯示從1到5不等。

+0

感謝您的詳細和良好解釋的答案 – Yousaf