鱼C论坛

 找回密码
 立即注册
查看: 3787|回复: 6

[汇编作业] 实验10问题2解决除法溢出

[复制链接]
发表于 2018-11-19 01:26:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-8 11:04:29 From FishC Mobile | 显示全部楼层
公式
上不是说先把余数乘65536再加上低16位的被除数在除以除数么,为什么直接除以低16位啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-8 20:16:03 | 显示全部楼层
本帖最后由 奥普瓯江 于 2019-5-8 20:18 编辑
小白100000000 发表于 2019-5-8 11:04
公式
上不是说先把余数乘65536再加上低16位的被除数在除以除数么,为什么直接除以低16位啊


2019-05-08_20-10-58.png
公式上说的乘以65536是说要做位移也就是把低位的数据的数位向高位转移跟shl和shr相似我这里在运算上一个处罚运算时已经把余数放入了dx中所以所以就直接进行了运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-9 21:57:25 From FishC Mobile | 显示全部楼层
小甲鱼说学完十一章就可以学破解了 ,那么我还需不需要学win32汇编,如果不需要了接下来需要学什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-11 10:50:58 | 显示全部楼层
小白100000000 发表于 2019-5-9 21:57
小甲鱼说学完十一章就可以学破解了 ,那么我还需不需要学win32汇编,如果不需要了接下来需要学什么

这个不能准确的回答你,但是有一点他这个视频是在10年或者11年左右录制的,那时候主流还是xp和不成熟的vista现在都是windows10了所以还是建议你学一下wind32吧,以后主流应该是64位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-12 08:12:12 From FishC Mobile | 显示全部楼层
64位汇编教程有么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-12 16:14:58 From FishC Mobile | 显示全部楼层
为什么不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 09:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表