首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误: SPARC上未知的"%“符号

错误: SPARC上未知的"%“符号
EN

Stack Overflow用户
提问于 2016-09-19 22:09:10
回答 1查看 173关注 0票数 1

我的程序在Ubuntu上运行得很好。

当我在Solaris SPARC系统上用gcc编译它时,它会遇到错误。

我有几个代码如下:

代码语言:javascript
复制
printf("endian_convert: %s\n", endian_convert);

asm("movl $8, %esi\n\t"
                "movl $.LC0, %edi\n\t"
                "movl $0, %eax");

这是我在SPARC上遇到的错误:

代码语言:javascript
复制
gcc -g -Wall -Werror -pedantic -Wextra src/utfconverter.c -o bin/utf 

/usr/ccs/bin/as: "/var/tmp//cc9czJEf.s", line 957: error: unknown "%"-symbol
/usr/ccs/bin/as: "/var/tmp//cc9czJEf.s", line 957: error: statement syntax
.......
/usr/ccs/bin/as: "/var/tmp//cc9czJEf.s", line 1058: error: unknown "%"-symbol
/usr/ccs/bin/as: "/var/tmp//cc9czJEf.s", line 1058: error: statement syntax
*** Error code 1 make: Fatal error: Command failed for target `utf'

那么,"%“符号在SPARC上被认为是未知的吗?

我如何解决这个问题并让它在SPARC上工作呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-19 22:47:49

(问题的原始版本没有提到这些错误来自SPARC Solaris系统,而只是将其命名为C90,因为安装在上面的gcc的旧版本默认为-std=c90,从而导致了关于C90中非法内容的错误消息。)

等等,“在Ubuntu上工作得很好,但在C90上不工作”?/usr/ccs/bin/as (在您的屏幕截图中)看起来像Solaris。这个主机名提示这可能是一台SPARC机器,而不是x86。

显然x86程序集不是有效的x86程序集语法。这是一种不同的CPU架构。

如果您使用了gcc foo.c -S并查看了生成的foo.s asm输出文件,您会发现它充满了asm asm,除了asm语句插入的文本之外。

SPARC语法确实在寄存器名上使用%修饰器,但是寄存器名不同。例如,add %i0, %i1, %o0添加输入寄存器i0i1,将结果存储在输出寄存器o0中。(输入为函数arg,输出为函数结果。SPARC在大型虚拟寄存器文件上使用滑动窗口。可能会或不会溢出到内存中,这取决于运行save指令时,save微体系结构是否没有寄存器。)

请记住,这些错误来自Solaris汇编程序,而不是gcc。您使用的是gcc,但它使用的是系统汇编程序,而不是GNU汇编程序。

无论如何,我建议将您的代码重写为纯可移植的C,而不是使用#ifdef __x86__继续使用内联的asm,或者编写它的SPARC端口。

顺便说一句,你的asm声明看起来糟透了。gcc的不同版本可能会在.LC0上存储一个不同的常量,从而破坏代码。更重要的是,您没有使用输入/输出约束来告诉编译器什么值在哪里。如果您假设在函数中设置asm中的eax是可以的,这是不正确的。该函数可以并将内联,然后您的asm只是在您的函数内联的中间自由浮动。有关一些GNU内联asm教程的链接,请参见答案的结尾

此外,您也不需要内联asm到endian转换。您将从使用endian.h .h函数 (如uint32_t le32toh(uint32_t little_endian_32bits); )获得更好的asm,后者使用gcc内置或内联asm来使编译器生成最优的程序集输出本身。

还请参阅https://gcc.gnu.org/wiki/DontUseInlineAsm,即使您知道如何正确使用它也适用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39582855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档