2012-07-19 66 views
5
.MODEL SMALL 
.STACK 1000 
.DATA 

MSGA DB 13,10,"Input first number: ","$" 
MSGB DB 13,10,"Input second number:","$" 
MSGC DB 13,10,"The sum is: ","$" 

NUM1 db ? 
NUM2 db ? 
NUM3 db ? 

.CODE 

MAIN PROC NEAR 

MOV AX, @DATA 
MOV DS, AX 

; get first number 
LEA DX, MSGA 
MOV AH, 09h 
INT 21h 

MOV AH, 01 
INT 21H 
SUB AL, '0' 

MOV BL, AL 

MOV AH, 01 
INT 21H 
SUB AL, '0' 

MOV CL, AL 

; get second number 
LEA DX, MSGB 
MOV AH, 09h 
INT 21h 

MOV AH, 01 
INT 21H 
SUB AL, '0' 

MOV DL, AL 

MOV AH, 01 
INT 21H 
SUB AL, '0' 

MOV DH, AL 

; add 
ADD CL, DH 
ADC BL, DL 
MOV NUM1, CL 
ADD NUM1, '0' 
MOV NUM2, BL 
ADD NUM2, '0' 

; output sum 
LEA DX, MSGC 
MOV AH, 09h 
INT 21h 

MOV DL, NUM2 
MOV AH, 02H 
INT 21h 

MOV DL, NUM1 
MOV AH, 02H 
INT 21h 

MOV AH, 4Ch 
INT 21h 

MAIN ENDP 
END MAIN 

以上是我的代碼,用於在程序集中添加2位兩位數字。我想知道爲什麼ADC不起作用。如果這些數字在添加時沒有獲得進位,我的代碼就可以工作。但並非如此。我誤解了ADC的真正用途嗎?我應該如何處理我的代碼?如何在裝配中使用ADC?

+1

'ADC'確實沒有用處,因爲添加2位永遠不會給出無法修復的字節結果。 – m0skit0 2012-07-19 14:30:16

+0

我的意思是「適合」而不是「修復」對不起 – m0skit0 2012-07-19 14:36:57

回答

4

您似乎正在使用十進制數學,但您沒有使用AAAADC可以達到你所期望的效果,但是通過該代碼,從第一次加法算起就不會有實際的進位(畢竟9 + 9不大於255)。

所以溶液,當然,是使用AAA,像這樣(未測試):

add al,dl 
aaa  ; takes no arguments and works on al 
add ah,dh ; adc not necessary, aaa already incremented ah if there was a carry 

AAAASCII Adjust for Addition)測試al比9大,如果是這樣:

  • 調整al
  • 設置進位標誌,和
  • 增量ah
+0

我很抱歉,我是新的裝配。aaa和xchg實際上做了什麼? – 2012-07-19 14:48:25

+0

@jrmeasures它交換(eXCHanGes)兩件事 – harold 2012-07-19 14:49:06

+0

aaa怎麼樣? – 2012-07-19 14:54:39

1

看看這個問題在SO這個答案解釋瞭如何ADC - 增加隨身攜帶的作品。基本上你需要首先使用簡單的ADD指令將低位字節加在一起。然後使用ADC加上高位字節(加上進位),如果低位字節加進位產生進位,則加進位。抓住每一個ASCII字符,然後

add al, bl 
adc ah, bh ; include the carry if previous add generated one 

至於你的問題的評論都提到,你實際上是執行十進制算術減去':

例如,如果要添加AX和BX你會做以下0「。這些操作中的每一個只會生成一個0到9之間的二進制數,並將其存儲在一個8位寄存器中。正如評論所說,將每個小於10的兩個數相加將永遠不會導致進位,只有當結果大於256時纔會發生進位。

如果您繼續使用執行此任務的方法,那麼您需要通過檢查加法結果是否大於10,並且如果它從數字中減去10,然後在高位數字計算中加1,手動檢查兩個較低位十進制數的加法是否導致進位。

這有道理嗎?

這是一個家庭作業嗎?如果是,那麼作業的目的是學習如何進行工作,或只編寫一個程序來將兩個兩位數的數字加在一起?

+0

請看我的代碼,我有兩行相同的例子。 – 2012-07-19 14:33:52

+0

查看@harold發佈的答案。他的解決方案更好,因爲它使用了一個名爲[Additon之後的Ascii Adjust]的指令(http://docs.oracle.com/cd/E19957-01/816-1323/instructionset-52/index.html),它可以完成您所需的任務要做並且使用進位標誌來完成你需要做的事情。 – HeatfanJohn 2012-07-19 14:47:22

+0

我只是想寫一個程序,增加兩位數的數字 – 2012-07-19 14:49:38