王爽 汇编语言 附注5 公式证明那里不懂,谁帮我看一下

书上说DIV指令只能得出余数和商,而我们只保留商,余数必然小于除数,一次正确的除法运算只能丢掉一个余数,到这里我就糊涂了,为什么要丢掉余数啊?

对于除法溢出的问题,他是用“做两次除法”来解决的。

前一次除法,只是保留商数。

余数,并没有丢掉,而是放在第二次除法了。

80x86 的除法指令本身,就含有溢出的可能性。

一般时,不要轻易使用。

或者在使用前,加以判断,确定不会溢出时,再去执行除法指令。

其实,可以利用除法指令,编写一个“不会溢出的除法程序”。

示意图如下:

在这个程序中,被除数和商数,字节数,是相等的。

因此,就绝不会溢出。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-05
其他的地方能看明白么?
其他的地方能看明白就不用管那句了,那个附录的主要目的不是让你弄明白如何在做除法的时候不溢出么?
把最后那个公式弄明白就行了

大概意思好像是用那个公式计算的结果只有商,没有余数.为了结果不溢出,只能不计算余数

其实我感觉那个公式有点过于复杂了,那个公式生成的指令肯定会非常多,而且仅根据结果无法判断那个数是否溢出了
如果那样还不如在具体的程序里加个判断语句来防止溢出,比如一个除以10的除法运算,你只要判断被除数是否大于9FFF6(FFFF*A)就行了,如果大于,则结果会溢出.效率比那个公式高
进一步的,你可以将除数和FFFF相乘,看结果是否大于等于被除数,如果大于等于,则这个除法不会溢出,这样效率可能(我不太确定,这个可能会有很多指令)还是比那个公式高.这样通用性更强,而且能得到余数
===========================================
楼主你先别结贴,我还要补充一点东西
===========================================
这个问题里汤叔说的方法也不错:
http://zhidao.baidu.com/question/117361812.html
无视我的那个回答吧,人家问怎样吃饭能不噎着我告诉人家别吃饭
那个余数的问题可以把余数除以原来的除数,然后把商放到后来的那个商的后面,余数就是正确的余数,举个例子(都是十六进制的数,不表示了):
1234/10=123......4
1234/100=12......34
用34除以10,商3,余4,将12左移4位,加上3就是正确的商了,然后4就是正确的余数

我刚才搜索了一下,发现有个可以秒杀以上所有方法的东西:
http://www.baidu.com/s?wd=div+%D2%E7%B3%F6+divdw
点开第一个就是
===========================================
好了,我补充完了
第2个回答  2010-05-04
虽然我不知道您的汇编语言是用于什么的,毕竟8086与单片机的汇编语言不同。 如果是教材的话一般是以8086/8088为例。我简单说下,因为汇编语言中我们是需要把除数和被除数都放在两个不同的reg当中,所以在运算的时候,会自动将商(整数)放在结果reg中,而并没有余数的reg,这个并不是为什么的问题,而是器件的本身特性。本回答被提问者采纳
相似回答