我想在我的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编译器仍然告诉我们一些关于非法操作数的事情.
发布于 2011-03-04 09:07:39
SPARC不像这样“立即移动”指令;有可以像or一样使用的or %g0, 123, %l0 (或者用零寄存器%g0使用不超过11位的常量,从而将所述常量移动到目标寄存器中),或者可以用来设置寄存器的上21位的sethi指令。因此,为了容纳任何(32位)常量,您必须先对上位执行一个sethi,然后对较低的位执行一个or,从而合成一个两步的or。
SPARC汇编程序通常知道创建此序列的set ..., %tgtregister快捷方式,并且/或在常量适合时删除一条指令。
还需要注意的是,在64位/ sparcv9中,set指令可能最终计算成最多5个指令的序列,将事物移动到一起。
发布于 2011-03-03 17:52:49
您需要像mov 0, %%l0这样的行--源行然后是目的地,而常量只是常量,而不是“#”字符。
编辑
如果asm指令中没有约束(只是一个字符串),那么gcc不会处理%-转义的字符串。因此,在这种情况下,您只需要在寄存器名之前使用单个%字符。但是,如果添加任何约束(甚至在字符串后面添加:: --一个空约束集),它将查找%-转义,因此注册名需要%%。
因此,要么在::之前添加),要么不复制%字符。
https://stackoverflow.com/questions/5184258
复制相似问题