ARM CPU 的移位器的进位是什么

问题描述 投票:0回答:2

我正在阅读《ARM 架构参考手册》来编写一个具有 ARM7TDMI CPU 的 Game Boy Advance 模拟器。我对ARM架构不太熟悉。手册中提到“从变速杆中取出”。

< shifter_operand > 值是通过将 8 位立即数旋转(向右)到任意偶数位而形成的 32 位字中的位置。如果旋转立即数为零,则移位器的进位为 C 的值 标志,否则,它被设置为 < shifter_operand > .

的值的位[31]

那是什么?它是干什么用的?我需要实施它吗? CPSR的C标志和“从移位器中输出”有什么关系吗?

assembly arm bit-shift carryflag status-register
2个回答
2
投票

ARM 的其他报价 ARM 有些接近您的报价。

除了产生移位器操作数外,移位器还产生一个 一些指令写入进位标志的进位。

...

数据处理操作数 - 立即数

还有一张图表显示 27:25 = 0b001,11:8 是rotate_imm,7:0 是immed_8

shifter_operand 值是通过旋转(向右)一个 8 位立即值到 32 位字中的任何偶数位位置。如果 旋转立即数为零,移位器的进位为 C 标志的值,否则,它被设置为值的位[31] .

考虑哪些指令想要循环但不驱动进位标志,例如 ADD 不是其中之一

C 标志 = CarryFrom(Rn + shifter_operand)

但是 MOV 将是主要候选者

C 标志=shifter_carry_out

那么如果rotate_imm为零,这意味着立即数在0x00000000和0x000000FF之间,对吗?那么shifter_carry_out就是C标志,基本上C标志不会改变或更新。但如果rotate_imm非零,则shifter_carry_out来自结果移位的位31,对于MOV指令(也许还有其他一些指令)(设置了S位)成为新的C标志。

一点也不模糊,记录得很清楚。

请注意,有许多像这样的有记录和无记录的 gem,用于查看克隆是否确实是克隆和/或被盗 IP。据我所知,并没有那么多克隆人。 google picoturbo 为了做到这一点,您需要成为一个准确的克隆,并正确掌握所有这些说明,包括不可预测的结果,其中一些结果是可以预测的。

ARM 几年前就发布了 Armulator 源代码,基本上都是制作 ARM 的代码,逻辑必须与 Armulator 相匹配。我们可以获取并使用它,并且人们会认为根据许可证在法律上可以自由地这样做。 QEMU 有一个指令集模拟器,还有其他一些模拟器,因此,虽然围绕法律语言制作模拟器并可能以某种形式发布它(一些 ARM 文档专门指出了这一点),但到目前为止,他们已经允许这些模拟器存在。但当然不要试图将其变成自己的逻辑克隆或出售/发布。

所以你可以在硬件上尝试这个,但你进一步在合法性的边缘跳舞。不要认为您需要这样做,因为您的报价已包含在同一份文件中。


0
投票

在缺乏任何具体架构信息以及您希望模拟哪些移位操作的信息的情况下,我只能给出一个模糊的答案。但一般来说,进位位保存已从寄存器“移出”的最后一位的值,无论这是否导致该位“丢失”。

移位器的进位和进位标志(存储在 PSR 中)之间的关系与几乎所有其他数据处理指令一样,只有在指令助记符中出现

S
后缀时才会更新进位标志。

因此,假设正在设置标志,对于算术和逻辑移位(例如

ASL
LSL
),进位标志会告诉您最近“丢失”位的值。对于旋转无进位操作(例如
ROR
),进位标志镜像旋转后的 MSB(用于右移)或 LSB(用于左移)。对于旋转进位(例如
RRX
),进位标志我们用作第 33 位。

请参阅 armasm 用户指南的此页 及其相当有用的图表。

© www.soinside.com 2019 - 2024. All rights reserved.