;先假定16个数都为16位,即两个字,并且都为压缩的BCD码,也就是说,每个数字最大为9999
;如果是非压缩的bcd码,进程类似,自行修改
dseg segment
num1 dw ..........................; //16个压缩BCD码数字
sum dw ?
sum1 dw 0 ;初始化为0,
dseg ends
cseg segment
main proc far
assume cs:cseg, ds:dseg
start:
push ds
xor ax, ax
push ax
mov ax, dseg
mov ds, ax
;----------------------------------
mov cx, 15 ;//执行15次相加
mov si, 0
mov si, bx
mov ax, [si];//第一项
mov sum, ax ;ax中数据放在sum, sum+1两个byte中
next:
add si, 2
mov al, byte ptr sum
add al, [si]
daa ;压缩BCD调整
mov byte ptr sum, al; 结果放入sum中
mov al, byte ptr sum+1; //高8位
adc al, [si+1] ;高位相加
daa
mov byte ptr sum+1, al
jnc loop_next ;如果两个数相加,没有更加进位,则进行下一个元素相加
mov al, byte ptr sum1
adc al, 0 ;如果有进位,则处理
daa
mov byte ptr sum1, al
jnc loop_next
mov al, byte ptr sum1+1
adc al,0
daa
mov byte ptr sum1+1, al
loop_next:
loop next
ret
main endp
cseg ends
end start