问题描述
有人可以用 C++ 给我看一个例子,我试着练习我的汇编语言技能,我得到的语言是 powerpc,我们正在寻找 44 位移动到 r0 的右侧,然后从那里开始我们正在提取第一个 8 位
extrdi r0,r0,8,44
解决方法
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,56
blr
.long 0
.byte 0,0
(r3 是参数和返回寄存器)