汇编程序:无符号64位除32位的除法子程序(

2025-10-27 04:10:26

1、程序如下(R4R5R6R7/R2R3=R6R7):

;This program for:R4R5R6R7/R2R3=R6R7 ;Remainder=(R4R5)

;----------------------------------------------------------------

;define stack segment

STACK           SEGMENT STACK 'STACK'

                DB 1024 DUP (0)

STACK           ENDS

;define data segment

DATA            SEGMENT

BWORD   EQU     THIS    BYTE            

                R0      DW      (?)

                R1      DW      (?)

                R2      DW      (?)

                R3      DW      (?)

                R4      DW      (?)

                R5      DW      (?)

                R6      DW      (?)

                R7      DW      (?)

DATA            ENDS

;define code segment

NBDIV           SEGMENT

;

MAIN            PROC FAR

                ASSUME  CS:NBDIV,DS:DATA,SS:STACK

;

START:          PUSH    DS        ;return DOS standard program

                MOV     AX,0

                PUSH    AX

                MOV     AX,DATA   ;set DS

                MOV     DS,AX

                MOV     AX,R5

                SUB     AX,R3

                MOV     AX,R4

                SBB     AX,R2

                JNC     DIV4    ;Over process

                MOV     CX,32                 

DIV1:           CLC

                RCL     R7,1

                RCL     R6,1

                RCL     R5,1

                RCL     R4,1

                PUSHF

                POP     R0      ;Store RF to R0

                MOV     AX,R5

                SUB     AX,R3

                MOV     R1,AX

                MOV     AX,R4

                SBB     AX,R2

                PUSHF

                TEST    BYTE PTR R0,01H

                JNZ     DIV21

                POPF

                JNC     DIV2

                JMP     DIV3

DIV21:          POPF

DIV2:           MOV     R4,AX

                MOV     AX,R1

                MOV     R5,AX

                INC     R7

DIV3:           LOOP    DIV1

                STC

DIV4:           RET

MAIN            ENDP

NBDIV           ENDS

                END     START

2、要理解这个程序,我们首先要理解什么是移位相减的除法,不懂的可以百度一下,也可以看下面

首先

我们假设一个方程

A/B=Q,余数是R

其中(二进制)

A=10000001

B=1010

那么R和Q等于多少?

3、我们运用移位相减来解决上面的问题

A=10000001,向左移四位,把低位补零,结果为:

A=00010000

把A的原本的高4位左移进R,即R原来是都等于0的,现在

R=1000

而B=1010

若R-B ,结果为负数

则Q=0

这里解释一下,为什么是左移四位,因为我们看到B的有效数字是四位的,所以我们就直接左移四位,但为什么要这么做,别急,请看下面

4、A=00010000,向左移一位,把低位补零,结果为:

A=00100000

把A的原本的高1位左移进R

R=10000

而B=1010

若R-B ,结果为正数110

这里就发生了变化,我们应该把1左移进商Q,把结果存进R

所以结果就变为Q=1,R=110。

这里解释一下,为什么这次是左移一位,因为我们看到B的有效数字是四位的,所以我们就直接左移四位,移了四位仍不够减,所以继续移一位就够减了,接下也是一位一位的移,但为什么要这么做,别急,还是请看下面

5、A=00100000,向左移一位,把低位补零,结果为:

A=01000000

把A的原本的高1位左移进R

R=1100

而B=1010

若R-B ,结果为正数10

把1左移进商Q,把结果存进R

所以结果就变为Q=11,R=10

看到这里可能你已经有些理解了,其实这和我们在草稿纸上计算除法是差不多的

汇编程序:无符号64位除32位的除法子程序(

6、A=01000000,向左移一位,把低位补零,结果为:

A=10000000

把A的原本的高1位左移进R

R=100

而B=1010

若R-B ,结果为负数

把0左移进商Q,把100存进R

所以结果就变为Q=110,R=100。

看到这里你可能会问为什么,这里结果是负数就左移一个零,上面就没有左移一个零进商,这是因为前面如果结果是负数,其实也是要左移一个零进商的,当前面的时候,Q还只是等于0而已,所以左移一个零也不会有任何变化,所以没有提到,这也是为什么我们一开始就左移四位,而不是一位一位来,这也是为了减少运算次数,在程序里也体现这个做法。

汇编程序:无符号64位除32位的除法子程序(

7、按照上述步骤再继续一步,就可以得到,商为1100,余数为1001的答案。

正如上面的说法一样其实这和我们在草稿纸上计算除法是差不多的,当时由于这是在计算机上运算的,所以还是要按照计算机的语言来理解,以便写程序。

8、接下来我们来看一下程序,可以说程序的原理是基于移位相减的,但考虑到实用性,增加了一些内容,让程序变得复杂了一些

程序主要是考虑以下的问题

1、判断够减或不够减的方法

2、够减时的处理方法

3、不够减时的处理方法

4、商上1的位置和方法

5、商上零的方法

明白这个后,接下我们来看看程序,请看第二篇

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢