利用移位和减法的除法算法

来源:互联网 发布:网上药店软件下载 编辑:程序博客网 时间:2024/05/15 12:44

杨季文 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

             RET

DIVX     ENDP 

 

下面以实例跟踪验证之。

为简单,假设有寄存器,AX、BX、CX、DX、SI 都是8 bit 寄存器

CF            SI                DX                AX          CX

0       00000000    10100111    01011110     16(LOOP前)

                                                       BX

                                                 11011001

即 dx:ax=A75E,被除数 bx=D9,以计算器算之,商=C5,余数=61

 

根据算法,循环8 次后,

CF            SI                DX                AX          CX

0       10100111    01011110    00000000     08(LOOP前)

                                                       BX

                                                 11011001

再左移 1 bit

CF            SI                DX                AX          CX

1       01001110    10111100    00000000     08(LOOP前)

                                                       BX

                                                 11011001

 执行 SUB SI, BX, BTS AX, 0

CF            SI                DX                AX          CX

0       01110101    10111100    00000001     08(LOOP前)

                                                       BX

                                                 11011001

再左移1 bit

CF            SI                DX                AX          CX

0       11101011    01111000    00000010     07(LOOP前)

                                                       BX

                                                 11011001

执行 SUB SI, BX,    BTS  AX, 0

CF            SI                DX                AX          CX

0       00010010    01111000    00000011     07(LOOP前)

                                                       BX

                                                 11011001

再左移4 bit

CF            SI                DX                AX          CX

1       00100111    10000000    00110000     03(LOOP前)

                                                       BX

                                                 11011001

执行 SUB SI, BX,    BTS  AX, 0

CF            SI                DX                AX          CX

0       01001110    10000000    00110001     03(LOOP前)

                                                       BX

                                                 11011001

再左移1 bit

CF            SI                DX                AX          CX

0       10011101    00000000    01100010     02(LOOP前)

                                                       BX

                                                 11011001

再左移1 bit

CF            SI                DX                AX          CX

1       00111010    00000000    11000100     01(LOOP前)

                                                       BX

                                                 11011001

执行 SUB  SI, BX,   BTS   AX, 0

CF            SI                DX                AX          CX

1       01100001    00000000    11000101     01(LOOP前)

                                                       BX

                                                 11011001

到此结束,可以看出,SI 中余数是 61H,DX:AX=0C5H,与计算器结果一致。

原创粉丝点击