c++ - 我需要帮助将此 ppc 指令翻译成 c++
问题描述
有人可以给我看一个 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,52,56
blr
.long 0
.byte 0,0,0,0,0,0,0,0
(r3 是参数和返回寄存器)
推荐阅读
- excel - 根据今天的日期更改单元格的值
- c# - 我无法理解如何在 c# 中使用正则表达式或如何解决我的问题
- python - 为什么使用拆分功能后我的列表为空?
- java - 有没有办法查询用户是否存在于基于 SAML 的身份提供者中?
- reactjs - 如何在airbnb日历中添加多个阻塞日期颜色?
- azure-devops - 使用 azure rest api 添加对测试计划、测试套件、测试用例不起作用“ShallowReference”的测试结果
- python - 在 Google Colab 中使用 plotly 绘制超过 6M 行的数据集
- html - 如何使 Bootstrap 4 禁用输入看起来与常规输入相同?
- if-statement - 为什么我的 Lua if-else 不能正常工作?
- uwp - 如何在 UWP 中制作更好的折线图?