免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6147 | 回复: 8
打印 上一主题 下一主题

求助:cpuid指令与gcc -fPIC选项的冲突 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-11 10:27 |只看该作者 |倒序浏览
我使用gcc -fPIC选项来编译一段代码,其中需要用到CPUID指令,
编译后出现Can't find register "BREG" while reloading "asm"的错误。
google后得知-fPIC选项要求独占ebx寄存器,因而导致编译失败。
这种情况下,我该怎么处理? 非常感谢!

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
2 [报告]
发表于 2010-08-11 17:13 |只看该作者
你的cpuid指令想必是在一段inline assembly中? 那好办, 声称ebx为clobbered, 就OK了

论坛徽章:
0
3 [报告]
发表于 2010-08-14 12:46 |只看该作者
本帖最后由 qizhanglu 于 2010-08-14 12:54 编辑

抱歉现在才来回复,我的cpuid确实是在inline assembly当中,将ebx放入 clobber list当中没能解决我的问题,编译器会给出新的错误"PIC register'ebx' clobbered in 'asm' "。

内嵌汇编代码如下:
  1. void cpuid_t(int* p, unsigned int param)
  2. {
  3. _asm_ _volatile_
  4. ( "cpuid;"
  5. : "=a"(p[0]), "=b"(p[1]), "=c"(p[2]), "=d"(p[3])
  6. : "a" (param)
  7. : "ebx"
  8. );
  9. }
复制代码
非常感谢。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
4 [报告]
发表于 2010-08-15 14:53 |只看该作者
这样吧, 在汇编里头, 先pushl ebx, 再cpuid指令,然后把ebx的值赋给某个其他的寄存器(或内存位置),然后在pop 到ebx(恢复之前保存的ebx)。

这样子,你在汇编中虽然明确用到了ebx,但是不必向gcc声称这一点。 亦即: 不必明确写"=b",也不比在clobber list中添加ebx。

这个写法,算是一个tricky的workaround, gcc会通过的。

PS,你在3楼的写法, 既然output中已经有"=b"了,那意味着ebx已经在clobber list中了,没必要再写一遍了。 所以gcc会给那个新的错误。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
5 [报告]
发表于 2010-08-15 14:54 |只看该作者
你们公司做什么的啊,还有这种活,招人不?

论坛徽章:
0
6 [报告]
发表于 2010-08-15 19:55 |只看该作者
QNX好像招人呢,O那SB没有留你?12同学被留下了吧?

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
7 [报告]
发表于 2010-08-16 11:23 |只看该作者
QNX好像招人呢,O那SB没有留你?12同学被留下了吧?
prolj 发表于 2010-08-15 19:55



12肯定留下, 除非自己想走。  现在大家都不知道能不能拿到offer, 不过看样子, 一堆人不想要这个offer了。

QNX去年说要在中国成立研发中心, 也不知道现在情况如何了。 如果是真的, 去了就爽了啊

论坛徽章:
0
8 [报告]
发表于 2010-08-16 13:26 |只看该作者
你去QNX看看吧,公司应该很不错。
前一段时间我遇到了内联mmx汇编的问题,寄存器分配的时候寄存器不够用了,ffmpeg的,是不是这个家伙写代码的时候没有手动保护现场啊?好像在x86目录下,啥templete.c文件里面。

论坛徽章:
0
9 [报告]
发表于 2010-08-22 12:16 |只看该作者
问题解决了,多谢!
我们公司主要是在Windows下开发,且是个没落了的小公司。你来就真的屈才了。
我也得努力啊,争取可以被prolj给卖了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP