楊季文 80x86組合語言程式 p352,子程式 divx ,使用移位和減法進行除法運算,
嘗試舉例驗證之。
程式如下:
;子程式名:divx
;功 能:64 位數除以32 位數,商用64 位表示
;入口引數:edx:eax=被除數
; ebx=除數
;出口引數:edx:eax=商
; ebx=餘數
divx proc near
push ecx
push esi
mov cx, 54
xor esi, esi
div1: shl eax, 1 ;這3 句**相當於把esi,edx,eax
rcl edx, 1 ;作為1 個整體向左移位
rcl esi, 1
jc short divx2
cmp esi, ebx
jb short divx3
divx2: sub esi, ebx
bts ax, 0
divx3: loop divx1
mov ebx, esi
pop esi
pop ecx
retdivx endp
下面以例項跟蹤驗證之。
為簡單,假設有暫存器,ax、bx、cx、dx、si 都是8 bit 暫存器
cf si dx ax cx
0 00000000 10100111 01011110 16(loop前)
bx即 dx:ax=a75e,被除數 bx=d9,以計算器算之,商=c5,餘數=61
根據演算法,迴圈8 次後,
cf si dx ax cx
0 10100111 01011110 00000000 08(loop前)
bx再左移 1 bit
cf si dx ax cx
1 01001110 10111100 00000000 08(loop前)
bx執行 sub si, bx, bts ax, 0
cf si dx ax cx
0 01110101 10111100 00000001 08(loop前)
bx再左移1 bit
cf si dx ax cx
0 11101011 01111000 00000010 07(loop前)
bx執行 sub si, bx, bts ax, 0
cf si dx ax cx
0 00010010 01111000 00000011 07(loop前)
bx再左移4 bit
cf si dx ax cx
1 00100111 10000000 00110000 03(loop前)
bx執行 sub si, bx, bts ax, 0
cf si dx ax cx
0 01001110 10000000 00110001 03(loop前)
bx再左移1 bit
cf si dx ax cx
0 10011101 00000000 01100010 02(loop前)
bx再左移1 bit
cf si dx ax cx
1 00111010 00000000 11000100 01(loop前)
bx執行 sub si, bx, bts ax, 0
cf si dx ax cx
1 01100001 00000000 11000101 01(loop前)
bx到此結束,可以看出,si 中餘數是 61h,dx:ax=0c5h,與計算器結果一致。
使用移位運算和加減法實現乘除法
這個想法是在做leetcode 的題目29 divide two integers時產生的,原題描述如下 divide two integers without using multiplication,division and mod operator.if it is overflow,retu...
除法和乘法的移位處理
用移位實現乘除法運算 a a 4 b b 4 可以改為 a a 2 b b 2 說明 除2 右移1位 乘2 左移1位 除4 右移2位 乘4 左移2位 除8 右移3位 乘8 左移3位 通常如果需要乘以或除以2的n次方,都可以用移位的方法代替。大部分的c編譯器,用移位的方法得到 比呼叫乘除法子程式生成的...
除法運算就是移位和相減
2進製完成除法運算就是移位和相減,比如1011011除以1110順序如下 1 1110 不夠減,結果添0,1左移一位再加上原來1後的0,為10 10 1110 不夠減,結果添0,10左移一位再加上原來10後的1,為101 101 1110 不夠減,結果添0,101左移一位再加上原來101後的1,為1...