|
网站首页
|
业界新闻
|
小组
|
威客
|
人才
|
下载频道
|
博客
|
代码贴
|
在线编程
|
编程论坛
|
登录
注册
短消息
我发表的主题
我参与的主题
我收藏的贴子
我上传的附件
我下过的附件
编辑个人资料
我的博客
用户控制面板
搜索
道具
恢复默认风格
碧海青天
秋意盎然
棕红预览
粉色回忆
蓝雅绿
紫色淡雅
青青河草
e点小镇
橘子红了
红红夜思
水晶紫色
雪花飘飘
新年快乐
风格
短消息
论坛展区
帮助
编程论坛
→
开发语言
→
『 C语言论坛 』
→ C中的汇编
我的收件箱(0)
欢迎加入我们,一同切磋技术
用户名:
密 码:
共有
2548
人关注过本帖
标题:
C中的汇编
只看楼主
加入收藏
lgjandhch
等 级:
新手上路
帖 子: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
等 级:
论坛游民
帖 子:8
专家分:30
注 册:2009-7-9
第
2
楼
收藏
得分: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
等 级:
新手上路
帖 子:3
专家分:0
注 册:2009-7-20
第
3
楼
收藏
得分:0
那结果就是只取高32位且首位是符号位的吧
嗯 明白一点了
2009-08-16 11:15
举报帖子
使用道具
赠送鲜花
东海一鱼
等 级:
贵宾
威 望:
48
帖 子:757
专家分:4760
注 册:2009-8-10
第
4
楼
收藏
得分:3
这末简单的计算没必要用内嵌汇编函数,牛刀杀鸡了。而且这个汇编函数也并没有考虑编译器生成的‘栈桢’代码。
所以返回值的正确性只有50%,你调试跟踪一下就明白了。
举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-08-16 17:01
举报帖子
使用道具
赠送鲜花
wxjeacen
等 级:
禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
第
5
楼
收藏
得分: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
举报帖子
使用道具
赠送鲜花
幻影天擎
等 级:
论坛游民
帖 子:13
专家分:13
注 册:2009-8-16
第
6
楼
收藏
得分:3
个位大大们``
我还刚刚开始学习`这个``
想问下`
` 最基本的得先学些什么比较适合我呢``~?????????
2009-08-16 20:30
举报帖子
使用道具
赠送鲜花
prankmoon
等 级:
蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
第
7
楼
收藏
得分:3
楼主的汇编语法风格说明这段代码使用了支持intel语法风格的C编译器,那么它应该可以很好的工作,只要返回值放在eax寄存器了就可以了。
2009-08-17 13:26
举报帖子
使用道具
赠送鲜花
wxjeacen
等 级:
禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
第
8
楼
收藏
得分: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
等 级:
蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
第
9
楼
收藏
得分: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
等 级:
禁止访问
帖 子:1291
专家分:628
注 册:2009-3-22
第
10
楼
收藏
得分:0
回复 9楼 prankmoon
那断 汇编的入口和出口是怎么定义的。
我只写linux 下的汇编。
貌似是他的理解错了。不是求x*y
[
本帖最后由 wxjeacen 于 2009-8-17 18:47 编辑
]
生命不熄,战斗不止.
2009-08-17 18:41
举报帖子
使用道具
赠送鲜花
38
1/4页
1
2
3
4
快速回复:
C中的汇编
数据加载中...
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 0.033378 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved