我想在我的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(或不超过11位常量的零寄存器,or %g0, 123, %l0,导致将该常量移动到目标寄存器),或%g0指令,可用于设置寄存器的上21位。因此,为了适应任何(32位)常数,必须先对高位执行sethi,然后对低位执行set,从而合成两步sethi。SPARC汇编程序通常知道一个cc>快捷方式来创建这个序列,和/或消除一个指令,如果常数适合于此。还要注意,在64位/sparcv9中,or指令可能最终计算为最多5个指令的序列,同时移动/或“组合”事物。关于c - SPARC assembly 问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5184258/
10-12 22:15