1

我想在我的 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 编译器仍然告诉一些关于非法操作数的东西......

4

2 回答 2

2

SPARC 没有这样的“立即移动”指令;要么or可以像这样使用or %g0, 123, %l0(或者使用零寄存器使用不超过 11 位的常量%g0,从而将所述常量移动到目标寄存器中),要么sethi可以用于设置高位21的指令寄存器的位。为了适应任何(32 位)常量,因此您必须通过对高位执行第一个,然后对低位set执行一个来合成一个两步。sethior

SPARC 汇编器通常知道set ..., %tgtregister创建此序列的快捷方式,和/或在常量适合的情况下消除一条指令。

另请注意,在 64bit / sparcv9 中,该set指令最终可能会评估为最多五个指令的序列,将事物一起移位/或组合。

于 2011-03-04T09:07:39.120 回答
0

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

编辑

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

因此,要么::在 the 之前添加一个,)要么取消重复的%字符。

于 2011-03-03T17:52:49.603 回答