首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPARC组装问题

SPARC组装问题
EN

Stack Overflow用户
提问于 2011-03-03 17:32:19
回答 2查看 1.2K关注 0票数 1

我想在我的C程序中编写一个非常简单的内联汇编例程,它不做任何其他操作,然后将本地寄存器%l0 - %l7设置为不同的值。我尝试了以下简单的方法:

代码语言:javascript
复制
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编译器仍然告诉我们一些关于非法操作数的事情.

EN

回答 2

Stack Overflow用户

发布于 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个指令的序列,将事物移动到一起。

票数 2
EN

Stack Overflow用户

发布于 2011-03-03 17:52:49

您需要像mov 0, %%l0这样的行--源行然后是目的地,而常量只是常量,而不是“#”字符。

编辑

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

因此,要么在::之前添加),要么不复制%字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5184258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档