+ -
当前位置:首页 → 问答吧 → 设在缓冲区DATA中存放着12个组合的BCD码,求他们的和,把结果存放到缓冲区SUM中。

设在缓冲区DATA中存放着12个组合的BCD码,求他们的和,把结果存放到缓冲区SUM中。

时间:2011-01-27

来源:互联网

num1:db 23h,45h,67h,89h,32h,93h,36h,12h,66h,78h,43h,99h
result db 2 dup(0)
.......
mov ax,seg num1
mov ds,ax
mov bx,offset data
mov cx,10
xor al,al
xor ah,ah
next:add al,[bx]
daa
adc ah,0
xchg ah,al
daa
xchg ah,al
inc bx
loop next
xchg ah,al
mov word ptr result,ax
问题1:为什么12个BCD码相加只要循环10次

问题2:next:add al,[bx]
daa -->这里用daa,给举个例子,还不太理解DAA,DAA就是用来干什么的。

问题3:adc ah,0 -->这里不懂。
xchg ah,al

作者: yangxiang1   发布时间: 2011-01-27

问题1:为什么12个BCD码相加只要循环10次
因为程序中的cx=10

问题2:next:add al,[bx]
DAA(Decimal Adjust for Addition)加法的十进制调整指令

问题3:adc ah,0 -->这里不懂。
adc,带进位加法, 如果al的结果产生进位, 那么把进位值加到ah中

作者: masmaster   发布时间: 2011-01-27

回答你第二个问题:daa是BCD码的十进制调整指令,add指令是按十六进制来加的如:最后两个数43h+99H加完后,用debug可以看到al里是什么吗?应是:DCh,是十进制的,用一个Daa就把他们进行一下调整,会加上06h,让它产生一个进位,因为你想让十进制按十六进制来进行运算,就必须每次相加给它补加上6因为他们相差6.
第三个问题是,加0是了为把低位al相加时产生的进位也加到ah里来,明白了吗,
,第一个问题,还是看不明白,要上机试一下才行。

作者: mengtao1235   发布时间: 2011-01-27