首页 > 解决方案 > 我需要帮助将此 ppc 指令翻译成 c++

问题描述

有人可以给我看一个 c++ 的例子,我试着练习我的汇编语言技能,语言是 powerpc 从我得到的,我们正在寻找 44 位移到 r0 的右侧,从那里我们正在提取前 8 位

extrdi r0, r0, 8,44

标签: c++assemblybit-manipulationpowerpc

解决方案


ISA 说extrdi是'提取并右对齐立即',它是rldicl('旋转左双字立即并清除左')的扩展助记符 - v2.07 pg 717。所以你的陈述相当于rldicl r0, r0, 52, 56.

因此,您希望从位置 44 开始提取 8 位,然后将其右对齐,这将使其成为最不重要的 8 位。值得注意的是,IBM 位数与您可能期望的相反:conventional bit = 63 - IBM bit. 因此 IBM 位 44 到 51 是“常规”位号 12 到 19。

我们简单地向下移位,使第 12 位变为第 0 位,第 19 位变为第 7 位——移位 12 位。然后我们需要屏蔽它,所以我们只得到最低有效的 8 位。

unsigned long extrdi(unsigned long a) {
  return (a >> 12) & 0xff;
}

查看 godbolt.org: https://godbolt.org/z/rGe3EW,我们看到这确实是:

extrdi:
        rldicl 3,3,52,56
        blr
        .long 0
        .byte 0,0,0,0,0,0,0,0

(r3 是参数和返回寄存器)


推荐阅读