汇编程序:无符号64位除32位的除法子程序(
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
看到这里可能你已经有些理解了,其实这和我们在草稿纸上计算除法是差不多的

6、A=01000000,向左移一位,把低位补零,结果为:
A=10000000
把A的原本的高1位左移进R
R=100
而B=1010
若R-B ,结果为负数
把0左移进商Q,把100存进R
所以结果就变为Q=110,R=100。
看到这里你可能会问为什么,这里结果是负数就左移一个零,上面就没有左移一个零进商,这是因为前面如果结果是负数,其实也是要左移一个零进商的,当前面的时候,Q还只是等于0而已,所以左移一个零也不会有任何变化,所以没有提到,这也是为什么我们一开始就左移四位,而不是一位一位来,这也是为了减少运算次数,在程序里也体现这个做法。

7、按照上述步骤再继续一步,就可以得到,商为1100,余数为1001的答案。
正如上面的说法一样其实这和我们在草稿纸上计算除法是差不多的,当时由于这是在计算机上运算的,所以还是要按照计算机的语言来理解,以便写程序。
8、接下来我们来看一下程序,可以说程序的原理是基于移位相减的,但考虑到实用性,增加了一些内容,让程序变得复杂了一些
程序主要是考虑以下的问题
1、判断够减或不够减的方法
2、够减时的处理方法
3、不够减时的处理方法
4、商上1的位置和方法
5、商上零的方法
明白这个后,接下我们来看看程序,请看第二篇