奥普瓯江 发表于 2018-11-19 01:26:49

实验10问题2解决除法溢出

公式:X/N = int(H/N)*65536 + /N

我所选用的数据就是例题的数据
X:被除数F4240H
N:除数 0AH
H:X高16位 000FH
L:X低16位4240H
推导公式:
F4240H / 0AH = int(000FH/0AH)*65536 + / 0AH

这里我们想把被除数拆分出来拆分成两个字节一组的16位进制数,在这里我们就把他拆分成高位时000FH,低位是4240H,并对每个位数分别进行计算,我们先进行高位的除法计算int(000FH/0AH)*65536,在这里我们只需要得出他的商,并把它保留起来,在本次除法计算中的余数,我们把他滚入下一个除法计算中,使得下一个除法计算中形成被除数是32位的除数是16位的,在本次除法计算中*65536他的作用就是使得int(000FH/0AH)所得的商向左偏移16位使得他还是在高位。
第二个除法 / 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

小白100000000 发表于 2019-5-8 11:04:29

公式
上不是说先把余数乘65536再加上低16位的被除数在除以除数么,为什么直接除以低16位啊

奥普瓯江 发表于 2019-5-8 20:16:03

本帖最后由 奥普瓯江 于 2019-5-8 20:18 编辑

小白100000000 发表于 2019-5-8 11:04
公式
上不是说先把余数乘65536再加上低16位的被除数在除以除数么,为什么直接除以低16位啊


公式上说的乘以65536是说要做位移也就是把低位的数据的数位向高位转移跟shl和shr相似我这里在运算上一个处罚运算时已经把余数放入了dx中所以所以就直接进行了运算

小白100000000 发表于 2019-5-9 21:57:25

小甲鱼说学完十一章就可以学破解了 ,那么我还需不需要学win32汇编,如果不需要了接下来需要学什么

奥普瓯江 发表于 2019-5-11 10:50:58

小白100000000 发表于 2019-5-9 21:57
小甲鱼说学完十一章就可以学破解了 ,那么我还需不需要学win32汇编,如果不需要了接下来需要学什么

这个不能准确的回答你,但是有一点他这个视频是在10年或者11年左右录制的,那时候主流还是xp和不成熟的vista现在都是windows10了所以还是建议你学一下wind32吧,以后主流应该是64位

小白100000000 发表于 2019-5-12 08:12:12

64位汇编教程有么

小白100000000 发表于 2019-5-12 16:14:58

为什么不行
页: [1]
查看完整版本: 实验10问题2解决除法溢出