算法汇编
⑴ 汇编如何通过移位和减法实现32位除法,求具体算法
;2进制完成除法运算就是移位和相减,比如1011011除以1110顺序如下:
; 1 - 1110 不够减, 结果添0, 1左移一位再加上原来1后的0,为10
; 10 - 1110 不够减, 结果添0, 10左移一位再加上原来10后的1,为101
; 101 - 1110 不够减, 结果添0, 101左移一位再加上原来101后的1,为1011
; 1011 - 1110 不够减, 结果添0, 1011左移一位再加上原来1011后的0,为10110
;10110 - 1110 = 1000 结果添1,同上左移加原来10110后的1得 10001
;10001 - 1110 = 11 结果添1,同上左移加原来101101后的1得 111
; 111 - 1101 不够减,结果添0,此时1011011所有位都已移完,运算完毕
;即 1011011 = 1110 * 0110 + 111
;也即 91 = 14 * 6 + 7
bcs0 dw ? ;被除数
bcs1 dw ? ;被除数
cs0 dw ? ;除数
cs1 dw ? ;除数
shang0 dw ? ;商
shang1 dw ? ;商
ys0 dw ? ;余数
ys1 dw ? ;余数
;此程序可实现32BIT/32BIT,也可实现32BIT/16BIT,无溢出错误,除16位是CS1要送0
; call DIV_32_32BIT ;in cs:[bcs0,1],cs:[cs0,1],get cs:[shang0,1],dw
DIV_32_32BIT Proc Near
push cx
mov ax,0
mov cs:[shang0],ax
mov cs:[shang1],ax
mov cs:[ys0],ax
mov cs:[ys0],ax ;商和余数清零
mov cx,32 ;循环次数
NEXT_BIT:
mov ax,cs:[bcs0]
rcl ax,1
mov cs:[bcs0],ax
mov ax,cs:[bcs1]
rcl ax,1
mov cs:[bcs1],ax ;被除数左移一位,最高位送CF
mov ax,cs:[ys0]
rcl ax,1
mov cs:[ys0],ax
mov ax,cs:[ys1]
rcl ax,1
mov cs:[ys1],ax ;被除数最高位经CF移入余数
mov ax,cs:[ys1]
cmp ax,cs:[cs1]
jb GET_SHANG_0
je CMP_LOW_BYTE
GET_SHANG_1:
mov ax,cs:[ys0]
sub ax,cs:[cs0]
mov cs:[ys0],ax
mov ax,cs:[ys1]
sbb ax,cs:[cs1] ;带借位减法
mov cs:[ys1],ax
stc
jmp CF_IN_SHANG
GET_SHANG_0:
clc
CF_IN_SHANG:
mov ax,cs:[shang0]
rcl ax,1
mov cs:[shang0],ax
mov ax,cs:[shang1]
rcl ax,1
mov cs:[shang1],ax
loop NEXT_BIT
pop cx
ret
CMP_LOW_BYTE:
mov ax,cs:[ys0]
cmp ax,cs:[cs0]
jb GET_SHANG_0
jmp GET_SHANG_1
DIV_32_32BIT endp