1、大数加法:两个128位相加
; 名称 add128
; 功能 两个128位数据相加
; 参数 ds:si 指向第一个数;ds:di指向第二个数;结果存放于ds:si
add128:
push ax ; 保护数据
push cx
push si
push di
sub ax,ax ; 清零CX
mov cx,8 ; 128位8字节
s: mov ax,[si] ; 循环
adc ax,[di] ; 计算
mov [si],ax
inc si ; 不用add si.2
inc si
inc di
inc di
loop s ; 循环结束
pop di
pop si
pop cx
pop ax
ret
2、不会产生溢出的除法运算
;名称:divdw
;功能:进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
;参数:(ax)=dword型数据的低16位;
; (dx)=dword型数据的高16位;
; (cx)=除数。
;返回:(dx)=结果的高16位;
; (ax)=结果的低16位;
; (cx)=余数。
divdw:
push si ; 保存数据
push bx
push ax
mov ax,dx
mov dx,0
div cx ;被除数的高位/cx,高位在ax,余数在dx
mov si,ax
pop ax
div cx ;(被除数高位的商+低位)/cx,高位在ax,余数在dx
mov cx,dx ;余数入cx
mov dx,si ;高位的商入dx
pop bx
pop si
ret
公式x/n=int(h/n)*65536+[rem(h/n)*65536+l]/n解析:
把一个会溢出的除法 变成几个除法来做!
如果高位除法有商,那么商就是结果的高位值,如果会有余数,那么余数自然不能丢弃,余数就作为低位除法的dx(也就是高位的被除数,因为他是从高位除法中余下的)
做低位除法的时候,就拿余下的dx+低位数的ax除以除数,会得到 一个低位的商 和 余数
高位的商+低位数的商+余数 就是结果