实验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 公式
上不是说先把余数乘65536再加上低16位的被除数在除以除数么,为什么直接除以低16位啊 本帖最后由 奥普瓯江 于 2019-5-8 20:18 编辑
小白100000000 发表于 2019-5-8 11:04
公式
上不是说先把余数乘65536再加上低16位的被除数在除以除数么,为什么直接除以低16位啊
公式上说的乘以65536是说要做位移也就是把低位的数据的数位向高位转移跟shl和shr相似我这里在运算上一个处罚运算时已经把余数放入了dx中所以所以就直接进行了运算 小甲鱼说学完十一章就可以学破解了 ,那么我还需不需要学win32汇编,如果不需要了接下来需要学什么 小白100000000 发表于 2019-5-9 21:57
小甲鱼说学完十一章就可以学破解了 ,那么我还需不需要学win32汇编,如果不需要了接下来需要学什么
这个不能准确的回答你,但是有一点他这个视频是在10年或者11年左右录制的,那时候主流还是xp和不成熟的vista现在都是windows10了所以还是建议你学一下wind32吧,以后主流应该是64位 64位汇编教程有么 为什么不行
页:
[1]