⑴ 匯編如何通過移位和減法實現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