汇编语言子函数——128位的加法运算

时间:2020-12-18 01:21:24

之前的那篇博文,讲到了大数据的加法运算,这里像之前那样编写一个子函数,以后调用方便

根据上一次的公式有下面的解决办法,(功能写在代码中),如下:

;实现的是:将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

运行结果如下:

汇编语言子函数——128位的加法运算