------------------BC31编译的代码为何总使用IMUL?---------------------

natrium11 2001-08-15 03:37:50
加精
有代码 unsigned b1=40000;
unsigned c1=40000;
long d1=b1*c1;
编译得到
;
; unsigned b1=40000;
;
fwait
mov word ptr [bp-46],-25536
;
; unsigned c1=40000;
;
mov word ptr [bp-48],-25536
;
; long d1=b1*c1;
;
mov ax,word ptr [bp-46]
imul word ptr [bp-48]
mov word ptr [bp-50],0
mov word ptr [bp-52],ax

明明是无符号数乘法,为何使用IMUL?这样能得到正确答案吗?
难道40000*40000==-25536*(-25536)??

另外,在汇编中的立即数是否都按带符号数识别?
写 MOV AX,40000 行吗?

多谢指教!!
...全文
89 点赞 收藏 9
写回复
9 条回复
蚊子王 2001年08月19日
MUL和IMUL的效率我也不太清楚,可能intel比较清楚;至于为何要这样用那就得问BORLAND。
回复 点赞
natrium11 2001年08月18日
哦,原来是这样.
可是他为何要这样用?MUL比IMUL效率低吗?
回复 点赞
zhangcc99 2001年08月17日
把你的a0、b0转换成2进制或16进制看,你就发现BC没错!
最主要的是你看BC怎么把c0输出,是unsigned long还是long?这里就有差别了。
回复 点赞
蚊子王 2001年08月17日
》》回复人: Areslee(易水) (2001-8-15 18:28:44)
》》因为结果是LONG类型啊。

事实上结果并不是long,因为int相乘结果是int,“long d1=b1*c1”只不过把相乘得到的int转化为long赋给d1;所以跟long无关。

事实上zhangcc99(zhangcc99)说的是有道理的。
40000*40000=1600000000,化为16进制为5f5e1000h,由于结果是int,所以高位溢出,得1000h;(-25536)*(-25536)=652087296,化为16进制为26de1000h,高位溢出得1000h。
所以事实上是一样的。

回复 点赞
natrium11 2001年08月17日
TO zhangcc99(zhangcc99):
拜托你能讲清楚些吗?我看不太懂.

我当然从不认为BC错了!我除了想知道为何对之外,还想知道他为何要这样用,MUL比IMUL效率低吗?

多谢!!
回复 点赞
natrium11 2001年08月16日
一样!!!

;
; unsigned a0=40000;
;
mov si,-25536
;
; unsigned b0=40000;
;
mov di,-25536
;
; unsigned long c0=b0*a0;
;
mov ax,di
imul si
fwait
mov word ptr [bp-38],0
mov word ptr [bp-40],ax
回复 点赞
Areslee 2001年08月16日
你把C0定义在UNSIGNED LONG 试试
回复 点赞
natrium11 2001年08月15日
结果是LONG类型为何就可以啊?
难道40000*40000==-25536*(-25536)??


而且,结果是UNSIGNED类型一样如此啊!!

unsigned a0=40000;
unsigned b0=40000;
unsigned c0=b0*a0;

得到:

;
; unsigned a0=40000;
;
mov si,-25536
;
; unsigned b0=40000;
;
mov di,-25536
;
; unsigned c0=b0*a0;
;
mov ax,di
imul si
回复 点赞
Areslee 2001年08月15日
因为结果是LONG类型啊。
是可以的
回复 点赞
发动态
发帖子
汇编语言
创建于2007-08-27

1.9w+

社区成员

4.1w+

社区内容

汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区公告
暂无公告