我想在我的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编译器仍然告诉了一些关于非法操作数的内容......答案 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,因此你需要%%
作为寄存器名称。
因此,要么在::
之前添加)
,要么在%
字符不重复。