| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2548 人关注过本帖
标题:C中的汇编
只看楼主 加入收藏
lgjandhch
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-7-20
结帖率:0
收藏
已结贴  问题点数:20 回复次数:37 
C中的汇编
在C中有如下一段汇编代码  看了很多资料  知道imul是无符号乘法  猜想可能是计算x*y  但具体过程也不太清楚  请高手指点指点
static __inline int MULSHIFT32(int x, int y)  //计算x*y???   
{
    __asm {
                mov             eax, x
            imul        y
            mov         eax, edx
            }
}
搜索更多相关主题的帖子: 汇编 
2009-08-16 10:09
dealwithme
Rank: 2
等 级:论坛游民
帖 子:8
专家分:30
注 册:2009-7-9
收藏
得分:3 
imul指令是带符号乘,
mov eax,x该指令将x存放到32位寄存器eax中
imul y   该指令实现双字乘,将结果的低32位放到eax中,高32位放到edx中
mov eax,edx  将edx中的内容放到eax中
2009-08-16 10:32
lgjandhch
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-7-20
收藏
得分:0 
那结果就是只取高32位且首位是符号位的吧  嗯 明白一点了  
2009-08-16 11:15
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:3 
这末简单的计算没必要用内嵌汇编函数,牛刀杀鸡了。而且这个汇编函数也并没有考虑编译器生成的‘栈桢’代码。
所以返回值的正确性只有50%,你调试跟踪一下就明白了。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-08-16 17:01
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:3 
小实牛刀,

AT&T汇编写的,windows能不能执行不晓得。

标准的内联汇编的写法。

[ 本帖最后由 wxjeacen 于 2009-8-16 18:23 编辑 ]

test_c.tar.gz (10.47 KB)


Screenshot-22.png (142.87 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册

生命不熄,战斗不止.
2009-08-16 18:22
幻影天擎
Rank: 2
等 级:论坛游民
帖 子:13
专家分:13
注 册:2009-8-16
收藏
得分:3 
个位大大们``
我还刚刚开始学习`这个``
想问下`
` 最基本的得先学些什么比较适合我呢``~?????????
2009-08-16 20:30
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:3 
楼主的汇编语法风格说明这段代码使用了支持intel语法风格的C编译器,那么它应该可以很好的工作,只要返回值放在eax寄存器了就可以了。
2009-08-17 13:26
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
以下是引用prankmoon在2009-8-17 13:26的发言:楼主的汇编语法风格说明这段代码使用了支持intel语法风格的C编译器,那么它应该可以很好的工作,只要返回值放在eax寄存器了就可以了。
是个c的compile就支持汇编,linux是at&t, windows是intelimul的值本来就是放在eax reg里面的。  我估计他的代码出错是因为edx本来是作为imul操作之后如果eax溢出,edx将作为溢出位,存放结果, edx:eax才是imul的最后结果。

生命不熄,战斗不止.
2009-08-17 14:48
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:0 
以下是引用wxjeacen在2009-8-17 14:48的发言:是个c的compile就支持汇编,linux是at&t, windows是intelimul的值本来就是放在eax reg里面的。  我估计他的代码出错是因为edx本来是作为imul操作之后如果eax溢出,edx将作为溢出位,存放结果, edx:eax才是imul的最后 ...
你说的没错,edx:eax是乘积的结果。

你看那个函数的名字"MULSHIFT32",它是要故意把乘积的结果仅取其高32位,所以,只需要把edx赋值给eax就OK;如果函数名字取名为"MULSHL32"就更直观了,所以,这段代码并没有错。

[ 本帖最后由 prankmoon 于 2009-8-17 18:35 编辑 ]
2009-08-17 18:34
wxjeacen
Rank: 7Rank: 7Rank: 7
等 级:禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
收藏
得分:0 
回复 9楼 prankmoon

那断 汇编的入口和出口是怎么定义的。

我只写linux 下的汇编。

貌似是他的理解错了。不是求x*y

[ 本帖最后由 wxjeacen 于 2009-8-17 18:47 编辑 ]

生命不熄,战斗不止.
2009-08-17 18:41
快速回复:C中的汇编
数据加载中...
 
   



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

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