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汇编程序吗?

非常感谢!

编辑:谢谢克里斯,我做了你建议的更改,但Sparc编译器仍然告诉一些关于非法操作数…

SPARC不会像这样立即采取“立即行动”指令; 可以使用or %g0, 123, %l0可以使用or %g0, 123, %l0 g0,123 or %g0, 123, %l0 (或者使用零寄存器,不是11位常数, %g0 ,导致将所述常量移动到目标寄存器中),或者sethi指令,可用于设置寄存器的 21位。 因此,为了适应任何 (32位)常数,你必须先对高位进行sethi ,然后用低位or低位进行合成。

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

还要注意,在64位/ sparcv9中, set指令最终可以评估为最多五条指令的序列,将事物移位/或组合在一起。

你想要像mov 0, %%l0 – 源然后是目标,而常量只是常量,没有’#’字符。

编辑

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

所以要么在::之前添加::或者不重复%字符。