利用移位和減法的除法演算法

2021-05-25 14:44:34 字數 2648 閱讀 9468

楊季文 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...