assembly - PowerPC 转向可变 SPR

标签 assembly powerpc machine-code

我正在为 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 代码中有一个巨大的 switch case,可以跳转到正确的 mtspr 部分。我有二十几个部分用于读取和编写特定的 SPR:s,每个部分看起来完全相同,但有一个常数值不同。

最佳答案

不能这样做的原因是指令架构不接受寄存器间接作为寄存器参数的寻址模式。老实说,我从未见过这样的机器架构,因为寄存器的数量通常相当小,因此寄存器被编码为指令本身的一部分。如果您确实不喜欢现有的解决方案,您可以尝试自己合成指令(获取基本操作码,查看寄存器说明符的位置以及适当值中的“或”),然后执行它。根据您的操作系统和编译器,这可能是不可能的(自修改代码通常是禁忌)。

如果用汇编语言编写跳转表,是否会使代码更简洁?也许传入 SPR 说明符(假设它是一个从零开始的整数,或者可以强制为 1),将其向左移动以获得跳转表中的偏移量,然后跳转到表中,这将是一个序列

MTPSR PSRx, val
RET
MTPSR PSRx+1, val
RET

我不知道什么对你来说算“更干净”,只是想我会把它扔掉。请注意,您可能必须用 NOP 填充才能使所有内容对齐,我没有 PowerPC 手册,因此我不知道指令大小或对齐要求是什么。

关于assembly - PowerPC 转向可变 SPR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3236791/

相关文章:

linux - FEC 和 Gianfar 派生器

gcc - 使用 YDL 6.1 和 Cell SDK 3.1 的 PS3 上的 math.h 未定义对 'sqrt' 的引用?

c++ - 编译器是否按照您编写它们的相同顺序放置 && 语句的子句?

assembly - 如何阅读英特尔操作码符号

assembly - 英特尔和 AT&T 汇编语法在 TextMate 中突出显示

debugging - 尝试在 $esp 处查看内存时,Ubuntu gdb 无法访问地址处的内存

linux - Linux 中的返回信号

gcc - GNU 汇编程序没有生成我可以执行的程序

c - 有什么方法可以找到关键部分中函数所花费的时间(在禁用和启用中断之间)

linux - x86-64 AMD 上 CALL 指令的操作数生成