SPARC Assembly question

旧时模样 提交于 2019-12-11 08:47:22

问题


I wanna write a very simple inline assembly routine in my C program which does nothing else then setting the local registers %l0 - %l7 to different values. I tried the following straightforward approach:

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"
);  

unfortuantely, the assembler tells: illegal operand for each instruction. Could somebody please be so nice to point me out how I can properly pass immediate values to the SPARC assembler?

Thanks so much!

EDIT: Thanks Chris, I made the changes you suggested but the Sparc compiler still tells some something about illegal operands...


回答1:


SPARC doesn't mave "immediate move" instructions as such; there's either or which can be used like or %g0, 123, %l0 (or'ing a no-more-than 11-bit constant with the zero register, %g0, resulting in moving said constant into the target register), or the sethi instruction that can be used to set the upper 21 bits of a register. In order to accommodate any (32bit) constant, you therefore have to synthesise a two-step set by doing a sethi first for the upper bits followed by an or with the lower ones.

SPARC assemblers usually know a set ..., %tgtregister shortcut to create this sequence, and/or eliminate one instruction should the constant be fit for that.

Also note that in 64bit / sparcv9, the set instruction may ultimately evaluate to a sequence of up to five instructions, shifting/or'ing things together.




回答2:


You want lines like mov 0, %%l0 -- source then destination, and constants are just constants, no '#' character.

edit

If you have no constraints in your asm directive (just a string), then gcc doesn't process the string for %-escapes. So in that case you need just single % characters before the register name. But if you add any constraints (or even just :: after the string -- an empty constraint set), it will look for %-escapes, so you need %% for register names.

So either add a :: just before the ) or un-duplicate the % characters.



来源:https://stackoverflow.com/questions/5184258/sparc-assembly-question

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!