求助:cpuid指令与gcc -fPIC选项的冲突

发布于 2022-09-11 04:59:21 字数 189 浏览 6 评论 8

我使用gcc -fPIC选项来编译一段代码,其中需要用到CPUID指令,
编译后出现Can't find register "BREG" while reloading "asm"的错误。
google后得知-fPIC选项要求独占ebx寄存器,因而导致编译失败。
这种情况下,我该怎么处理? 非常感谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

伴我老 2022-09-19 22:32:49

问题解决了,多谢!
我们公司主要是在Windows下开发,且是个没落了的小公司。你来就真的屈才了。
我也得努力啊,争取可以被prolj给卖了。

秋凉 2022-09-19 17:49:37

你去QNX看看吧,公司应该很不错。
前一段时间我遇到了内联mmx汇编的问题,寄存器分配的时候寄存器不够用了,ffmpeg的,是不是这个家伙写代码的时候没有手动保护现场啊?好像在x86目录下,啥templete.c文件里面。

要走就滚别墨迹 2022-09-19 17:41:05

QNX好像招人呢,O那SB没有留你?12同学被留下了吧?
prolj 发表于 2010-08-15 19:55

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

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

我爱人 2022-09-19 15:57:57

QNX好像招人呢,O那SB没有留你?12同学被留下了吧?

宁愿没拥抱 2022-09-19 10:42:21

你们公司做什么的啊,还有这种活,招人不?

始终不够爱げ你 2022-09-18 10:07:42

这样吧, 在汇编里头, 先pushl ebx, 再cpuid指令,然后把ebx的值赋给某个其他的寄存器(或内存位置),然后在pop 到ebx(恢复之前保存的ebx)。

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

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

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

心是晴朗的。 2022-09-17 20:37:09

本帖最后由 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. }

复制代码非常感谢。

夏了南城 2022-09-17 15:01:11

你的cpuid指令想必是在一段inline assembly中? 那好办, 声称ebx为clobbered, 就OK了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文