qizhanglu 发表于 2010-08-11 10:27

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

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

帅绝人寰 发表于 2010-08-11 17:13

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

qizhanglu 发表于 2010-08-14 12:46

本帖最后由 qizhanglu 于 2010-08-14 12:54 编辑

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

内嵌汇编代码如下:void cpuid_t(int* p, unsigned int param)
{
_asm_ _volatile_
( "cpuid;"
: "=a"(p), "=b"(p), "=c"(p), "=d"(p)
: "a" (param)
: "ebx"
);
}非常感谢。

帅绝人寰 发表于 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会给那个新的错误。

帅绝人寰 发表于 2010-08-15 14:54

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

prolj 发表于 2010-08-15 19:55

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

帅绝人寰 发表于 2010-08-16 11:23

QNX好像招人呢,O那SB没有留你?12同学被留下了吧?
prolj 发表于 2010-08-15 19:55 http://linux.chinaunix.net/bbs/images/common/back.gif


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

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

prolj 发表于 2010-08-16 13:26

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

qizhanglu 发表于 2010-08-22 12:16

问题解决了,多谢!
我们公司主要是在Windows下开发,且是个没落了的小公司。你来就真的屈才了。
我也得努力啊,争取可以被prolj给卖了。
页: [1]
查看完整版本: 求助:cpuid指令与gcc -fPIC选项的冲突