天天看点

13、王爽《汇编语言》笔记_子程序二

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除以除数,会得到 一个低位的商 和 余数

高位的商+低位数的商+余数 就是结果