SPARC大会问题

时间:2011-03-03 17:32:20

标签: c assembly inline-assembly sparc

我想在我的C程序中编写一个非常简单的内联汇编程序,它什么都不做 否则将本地寄存器%l0 - %l7设置为不同的值。我尝试了以下简单的方法:

asm volatile (
    ".text\n\t"
    "mov 0, %%l0             \n\t"
    "mov 1, %%l1             \n\t"
    "mov 2, %%l2             \n\t"
    "mov 3, %%l3             \n\t"
    "mov 4, %%l4             \n\t"
    "mov 5, %%l5             \n\t"
    "mov 6, %%l6             \n\t"
    "mov 7, %%l7             \n\t"
);  

不幸的是,汇编程序告诉:每条指令的非法操作数。有人可以非常高兴地指出我如何正确地将立即值传递给SPARC汇编程序吗?

非常感谢!

编辑:谢谢Chris,我做了你建议的更改,但是Sparc编译器仍然告诉了一些关于非法操作数的内容......

2 个答案:

答案 0 :(得分:2)

SPARC不会像这样立即采取“立即行动”指令;有or可以像or %g0, 123, %l0一样使用(或者使用零寄存器,%g0使用不超过11​​位的常量,导致将所述常量移动到目标中寄存器),或sethi指令,可用于设置寄存器的 upper 21位。为了容纳任何(32位)常量,你必须首先对高位进行set后跟{{1}来合成两步sethi。与较低的。

SPARC汇编程序通常知道or快捷方式来创建此序列,和/或如果常量适合该序列,则删除一条指令。

另请注意,在64位/ sparcv9中,set ..., %tgtregister指令最终可以评估最多五条指令的序列,将所有内容移位/组合。

答案 1 :(得分:0)

你想要像mov 0, %%l0这样的行 - 来源然后是目的地,而常量只是常量,没有'#'字符。

修改

如果你的asm指令没有约束(只是一个字符串),那么gcc不处理%-escapes的字符串。因此,在这种情况下,您只需要在注册名称前加上%个字符。但是如果你在字符串之后添加任何约束(甚至只是:: - 一个空约束集),它将寻找%-escapes,因此你需要%%作为寄存器名称。

因此,要么在::之前添加),要么在%字符不重复。