| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1366 人关注过本帖
标题:《汇编语言》王爽附注5 公式证明当n<0时貌似有漏洞...
取消只看楼主 加入收藏
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
结帖率:97.22%
收藏
已结贴  问题点数:100 回复次数:11 
《汇编语言》王爽附注5 公式证明当n<0时貌似有漏洞...
题目太长了打不全,但是公式我看懂了:

1.L<= 65535
2.rem(H/n)<=n-1
由2有:
3 rem(H/n)*65536<=(n-1)*65536

4. rem(H/n)*65536+L<=(n-1)*65536+65535

5. [rem(H/n)*65536+L]/n<=[(n-1)*65536+65535]/n

6. [rem(H/n)*65536+L]/n<=65536-(1/n)
所以[rem(H/n)*65536+L]/n不会产生除法溢出

因为n为除数,所以不会为0,所以65536-(1/n)<=65535
但是细细一想,如果n为负数的话呢?那65536-(1/n)岂不是大于了一个16位寄存器了?
而且如果n比较大的话如n = 3时,65536 - 1/3也同样大于65535,感觉有些错误...
看过汇编语言的童鞋帮帮忙,能不能解析下这个问题,再爆个红贴...
搜索更多相关主题的帖子: 寄存器 而且 童鞋 
2013-02-24 01:12
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
诶哈,貌似又发错地方了....

I have not failed completely
2013-02-24 01:15
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
求看过汇编语言的童鞋们解答啊,没看过的也可以去度娘那查查208页和附注5的公式证明,是不是n不表示负数和分数?可是那里只声明了n!=0啊...

I have not failed completely
2013-02-24 11:42
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
以下是引用清微御宇在2013-2-24 12:13:16的发言:

[rem(H/n)*65536+L]/n=int( [rem(H/n)*65536+L]/n)(商)+rem( [rem(H/n)*65536+L]/n)(余数)
由 [rem(H/n)*65536+L]/n<=65536-(1/n)得
int( [rem(H/n)*65536+L]/n)<=65535所得商未超过字长不会溢出!
嗯...那右边就是int(65536-(1/n))
这怎么算啊...怎么解析成65535,而且左边的解析式只是[rem(H/n)*65335+L]/n,木有int啊
即便int( [rem(H/n)*65536+L]/n)<=65535
[rem(H/n)*65536+L]/n也未必<=65535啊
求详细过程...

I have not failed completely
2013-02-24 13:24
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
以下是引用清微御宇在2013-2-24 13:51:00的发言:

[rem(H/n)*65536+L]/n的结果应该当做商和余数的形式看待(以为div或idiv指令只能得到余数和商,判断溢出也是根据商的大小决定的)[rem(H/n)*65536+L]/n<=65536-(1/n)那么n>0时[rem(H/n)*65536+L]/n的结果为商(必然<=65535)和一个小于n的余数!
对了,因为n!=0再3和4得n>0;
如果还是不行
今 [rem(H/n)*65536+L]/n=65536-(1/n)那么[rem(H/n)*65536+L]/n的商为65535余数为n-1;
有点懵了...不介意一个一个问题的来吧...就当你不介意了啊
对了,因为n!=0再3和4得n>0;
3和4是第3步和第4步吗?我并没有看出来那里能证明n>0,希望解答

I have not failed completely
2013-02-24 14:02
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
这作者耍赖啊...

I have not failed completely
2013-02-24 14:19
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
[rem(H/n)*65536+L]/n=65536-(1/n)那么[rem(H/n)*65536+L]/n的商为65535余数为n-1

为何商为65535余数为n-1

I have not failed completely
2013-02-24 14:31
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
啊...脑细胞都死光了...不过终于弄懂了...
ax寄存器只负责存商,不负责存余数,所以商最大为65535,真不知道是哪位牛人能想出这么牛逼的公式...

I have not failed completely
2013-02-24 16:12
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
诶啊,信箱有效不是我坑你啊,纯属意外,可能T版的头像太有爱了,把楼下的你给看漏了...

亲微其实我只学到第10章的子程序2,只是对公式十分好奇才跳到附注五看的,你好像对《汇编语言》蛮有研究的啊,公式能分析的这么透,童鞋你专门学过汇编吗?《汇编语言》这本书平心而论到底怎么样?

I have not failed completely
2013-02-24 16:21
神龙赖了
Rank: 10Rank: 10Rank: 10
来 自:萨塔星
等 级:青峰侠
威 望:2
帖 子:711
专家分:1788
注 册:2012-10-13
收藏
得分:0 
是清微...

I have not failed completely
2013-02-24 16:23
快速回复:《汇编语言》王爽附注5 公式证明当n<0时貌似有漏洞...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012813 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved