之前的那篇博文,讲到了大数据的加法运算,这里像之前那样编写一个子函数,以后调用方便
根据上一次的公式有下面的解决办法,(功能写在代码中),如下:
;实现的是:将data中的0~15的数和16~31的数加起来,将结果放在32~47 assume cs:code, ds:data ;这里的128位在data空间中是逆序放置的,就是从低位到高位排列的 data segment dw 0A452H, 0A8F5H, 78E6H, 0A8EH, 8B7AH, 54F6H, 0F04H, 671EH dw 0E71EH, 0EF04H, 54F6H, 8B7AH, 0A8EH, 78E6H, 58F5H, 0452H dw 8 dup(0) data ends code segment start: mov ax, data mov ds, ax mov si, 0 mov di, 16 call add128 mov ax, 4C00H int 21H add128: push ax push bx push cx push dx push si push di sub ax, ax ;将CF清零 mov ax, ds:[si] add ax, ds:[di] ;对低位用add指令 mov ds:[si + 32], ax ;存放在32~47内 mov cx, 7 s: mov dx, ds:[si + 2] ;对之后的每一位实行adc指令 adc dx, ds:[di + 2] mov ds:[si + 32 + 2], dx ;将结果存放在结果区域 inc si ;这里不能使用add,只要使用add,就会使CF置零 inc si inc di inc di loop s pop di pop si pop dx pop cx pop bx pop ax ret code ends end start
当然也有简便一点儿的办法,因为adc可以认为等于add + CF
所以第一步的add操作也可以一起归在循环中进行,对代码进行改进,如下:
;实现的是:将data中的0~15的数和16~31的数加起来,将结果放在32~47 assume cs:code, ds:data data segment dw 0A452H, 0A8F5H, 78E6H, 0A8EH, 8B7AH, 54F6H, 0F04H, 671EH dw 0E71EH, 0EF04H, 54F6H, 8B7AH, 0A8EH, 78E6H, 58F5H, 0452H dw 8 dup(0) data ends code segment start: mov ax, data mov ds, ax mov si, 0 mov di, 16 call add128 mov ax, 4C00H int 21H add128: push ax push bx push cx push dx push si push di sub ax, ax ;将CF清零 mov cx, 8 s: mov dx, ds:[si] adc dx, ds:[di] mov ds:[si + 32], dx inc si ;这里不能使用add,只要使用add,就会使CF置零 inc si inc di inc di loop s pop di pop si pop dx pop cx pop bx pop ax ret code ends end start
运行结果如下: