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,所以你需要%%
的寄存器名称。
所以要么在::
之前添加::
或者不重复%
字符。