surongre 发表于 2011-11-16 12:00:00

关于汇编div指令的问题

书上是这样说的
div word ptr es:
含义:(ax) = [(dx)*10000H+(ax)]/((es)*16+0)的商
         (dx) = [(dx)*10000H+(ax)]/((es)*16+0)的余数
问题来了,我始终搞不懂为什么dx要乘上10000H?看了小甲鱼关于div指令的视频,还是一头雾水{:5_107:}

求解释

cfer 发表于 2011-11-16 12:20:37

本帖最后由 cfer 于 2011-11-16 12:28 编辑

dx中存放的是被除数的高16位。ax存放的是被除数的低16位。dx * 10000h +ax就是一个求出被除数的过程。
拿十进制举例子吧。比如2344这个十进制数,如果23放在x中,44放在y中,那么要得到2344是不是就是要用
x* 100 +y呢?任何进制的数,如果乘上该进制的模值,就相当于在该数后面加一个0,乘两次模值,相当于加两个0.比如8进制数56,56*10=560,56*10*10=5600,注意这里所有都是8进制形式。同样的dx和ax要装配出被除数,就要在dx的数后加4个0,再和ax相加。怎样做相当于在dx的数后加4个0呢,那就是乘4次10h,也就是乘10000h了。不知道这样能不能说明白。

surongre 发表于 2011-11-16 12:57:26

cfer 发表于 2011-11-16 12:20 static/image/common/back.gif
dx中存放的是被除数的高16位。ax存放的是被除数的低16位。dx * 10000h +ax就是一个求出被除数的过程。
拿十 ...

好像有点懂了,你的意思是把高16位放DX中,把低16位放AX中,把高16位乘10000H再加上低16位乘10000H就等于原来的数?
不过这一句:任何进制的数,如果乘上该进制的模值   16进制的模值不是16么,应该乘上16啊

cfer 发表于 2011-11-16 19:11:10

注意是10h,是16进制形式,其实进制都是相通的,只是我们比较熟悉十进制,所以容易不自觉地化成十进制,其实在16进制的世界里,一切都是16进制的,暂时忘了十进制吧。

surongre 发表于 2011-11-17 13:26:50

cfer 发表于 2011-11-16 19:11 static/image/common/back.gif
注意是10h,是16进制形式,其实进制都是相通的,只是我们比较熟悉十进制,所以容易不自觉地化成十进制,其实 ...

还是不太懂,继续研究去。。。。

kane080824 发表于 2011-11-17 19:17:21

本帖最后由 kane080824 于 2011-11-17 19:19 编辑

呵呵 好笨,举个例子你就ok了
比如一个十进制数48去除以2对吧,可是呢我是个超超级大笨蛋,不懂48,只知道48是4和8两部分拼起来的,就像有两块木板,一块上写4一块上写8,然后并排放一起.我做除法所以也就只好一个一做,搞成4/2和8/2,可是这样怎么行,毕竟结果不对啊,于是有聪明人跟我总结了:说,结果应该是4/2必须乘以10然后加上8/2,我就纳闷啦,搞什么东东啊,这什么意思,他说,你把48拆开成高位和低位分别去除2可以,但4在高位上其实是40,你用4去除了,所以高位结果必须乘以10,哦这样啊原来,我问如果是一个16进制数那杂办,他说那就除后乘以16即可,我说如果我有一个16进制数是12345678H/xxxx,我分两部分高位为1234,低位为5678分别去除法,那杂办,他说,1234/xxxx后必须*16*16*16*16然后加上5678/xxxx,而连乘4个16就等于16进制数10000H,于是结果为[(1234)*10000H+5678]/xxxx;好比:十进制数12345678/xxxx,可以写成[(1234)*10*10*10*10+5678]/xxxx一样

surongre 发表于 2011-11-17 19:38:46

kane080824 发表于 2011-11-17 19:17 static/image/common/back.gif
呵呵 好笨,举个例子你就ok了
比如一个十进制数48去除以2对吧,可是呢我是个超超级大笨蛋,不懂48,只知道48是 ...

{:2_25:}
额,这例子举得。。。。

兰陵啸天 发表于 2015-6-29 09:33:15

我觉得回答得非常精辟,楼主估计是陷入了一个死循环,哈哈:lol::lol:

fast 发表于 2015-6-30 15:37:15

{:1_1:}
页: [1]
查看完整版本: 关于汇编div指令的问题