|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
公式:X/N = int(H/N)*65536 + [rem(H/N)*65536 + L]/N
我所选用的数据就是例题的数据
X:被除数F4240H
N:除数 0AH
H:X高16位 000FH
L:X低16位4240H
推导公式:
F4240H / 0AH = int(000FH/0AH)*65536 +[rem(000FH/0AH) * 65536 + 4240H] / 0AH
这里我们想把被除数拆分出来拆分成两个字节一组的16位进制数,在这里我们就把他拆分成高位时000FH,低位是4240H,并对每个位数分别进行计算,我们先进行高位的除法计算int(000FH/0AH)*65536,在这里我们只需要得出他的商,并把它保留起来,在本次除法计算中的余数,我们把他滚入下一个除法计算中,使得下一个除法计算中形成被除数是32位的除数是16位的,在本次除法计算中*65536他的作用就是使得int(000FH/0AH)所得的商向左偏移16位使得他还是在高位。
第二个除法[rem(000FH/0AH)*65536 + 4240H] / 0AH,这里面rem(000FH/0AH)代表的是在上一个除法中所得的余数,把他乘65536在与4240H相加在这里得到的数是54240在把他与0AH相除。
把这两个除数完成后,我们最后得到了两个商和一个余数,并把他们放入相应的位置,这个就是我所理解这个公式所要表达的意思。
下面就是我做的对照这个公式做的相应的汇编程序:
- assume cs:code
- code segment
- start:
- mov ax, 4240H ;被除数低位
- mov dx, 000fH ;被除数高位
- mov cx, 0AH ;除数
-
- call divdw ;这里是一个跳转,跳转到divdw:标记处,遇到ret还会跳转回来并接着向下执行
-
- mov ax, 4C00H ;结束语句
- int 21H ;结束语句
- divdw:
- push ax ;把push放入栈中,以为这个解决溢出的方式是从高位先算的所以想把低位的压到栈中
- mov ax, dx ;把dx中的高位数据传给ax进行运算
- mov dx, 0 ;清除dx中的数据,因为在divdw跳转中,dx中有数据在debug中执行就会报错
- div cx ;除法运算,商储存在ax中余数在dx中
- mov bx, ax ;把商传给bx因为我们还需要进行第二次除法运算
-
- pop ax ;把低位的数据从栈中取出传给ax
- div cx ;这里是第二次除法运算,我们把上一个除法的余数dx中的数据和从栈中取出的ax中的数据做一个32位除以16位的运算,除数还是0AH
- mov cx, dx ;把dx中的数据传给cx,现在dx中储存的是最终结果的余数
- mov dx, bx ;把bx中的数据传给dx,bx中存放的是高位的结果,ax中存放的是低位的结果,cx中存放的是余数的结果
- ret ;返回call divdw处继续向下执行
-
-
-
- code ends
- end start
复制代码 |
|