2012-07-19 18 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