我正在向C程序编写程序集宏,而对于这个程序,我是一个新手,因此我陷入了某些难题。
我正在尝试编写一个宏,用于将数据从通用寄存器移动到专用寄存器。
我的问题是,我发现将数据从GPR转移到SPR的语法需要一个恒定的SPR值,而我想使用一个存储在另一个寄存器中的变量。
# SPR is constant, rA is the value to be written
mtspr SPR, rA
我正在寻找看起来像这样的东西:
# rA contains the number of the SPR, and rB the value to be moved.
AWESOMEmtspr rA, rB
有没有理由没有这样的宏,我该如何自己制作?
提前谢谢了。
----编辑:----
现在看来,我的C代码中有一个巨大的开关盒,可以跳转到正确的mtspr部分。我有二十几个部分用于读取和写入特殊SPR:s,每个部分看起来完全相同,但相差一个常数。
最佳答案
之所以不能这样做,是因为指令体系结构不接受寄存器间接寻址作为寄存器参数的寻址模式。老实说,我从未见过这样的机器架构,因为寄存器的数量通常很小,因此寄存器被编码为指令本身的一部分。如果您真的不喜欢现有的解决方案,则可以尝试自己合成指令(获取基本操作码,查看寄存器说明符的位置,或以适当的值进行或),然后执行该指令。取决于您的操作系统和编译器,这可能是不可能的(自修改代码通常是禁忌)。
如果您在汇编中编写跳转表,是否会使代码更简洁?也许传入SPR说明符(假设它是一个从零开始的整数,或者可以强制为1),将其向左移动以将偏移量获取到跳转表中,然后跳转到该表中,这将是一个序列
MTPSR PSRx, val
RET
MTPSR PSRx+1, val
RET
我不知道什么对您来说算是“清洁工”,只是以为我会把它扔掉。请注意,您可能必须使用NOP才能使所有内容对齐,我没有PowerPC手册,所以我不知道指令的大小或对齐要求是多少。