【问题标题】:SPARC Assembly questionSPARC 装配问题
【发布时间】:2011-03-03 17:32:19
【问题描述】:

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

【问题讨论】:

  • 这里真的需要两个 %% 吗?

标签: c assembly inline-assembly sparc


【解决方案1】:

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

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

另请注意,在 64 位/sparcv9 中,set 指令最终可能会评估为最多 5 条指令的序列,将事物一起移位/或运算。

【讨论】:

    【解决方案2】:

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

    编辑

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2013-07-05
      相关资源
      最近更新 更多