assembly - 带扩展的循环移位有何用途?

标签 assembly bit-shift cpu-architecture instruction-set 68000

我记得在汇编课上,我们学习了 m68k 处理器,并且可以进行 3 种移位。线性移位、循环移位和带扩展的循环移位。

最后一个是带有扩展的循环移位,基本上将所有位向左或向右旋转,但它将最外面的一位放入扩展位,然后再将其移至开头(如果您再次移位 1)。

我画了一张小图:

enter image description here

基本上,第 33 位用于循环移位,但当然不会出现在 32 位字中。第33位是处理器的X标志,代表extend。您可以轻松地使用任何状态标志,例如进位标志,但我猜摩托罗拉的人想保留该标志,这样它就不会被覆盖,以防万一您需要进位标志来执行其正常职责。一些算法也需要旋转和扩展。

无论如何,旋转和扩展的目的是什么?它是干什么用的?需要它做什么?看起来很奇怪。为什么需要第 33 位?

我已阅读 thisthis ,两个相关的问题,但他们没有讨论循环移位和扩展

我知道正常轮类的一些用途。基本上是除以二,或测试整除性,并排列位的随机性。像这样的东西。但我无法想象为什么您需要在旋转中插入一些扩展位,但在结果中却没有出现。

编辑:我对它的任何使用都很感兴趣,无论是现代的还是旧的,并且无论它是否在 m68k 上。 m68k 只是我第一次遇到它(而且我什至从未在那里使用过它)。

最佳答案

假设您想要将 32 位字右移,但您拥有的只是 16 位寄存器。为此,您必须将 32 位字的两个 16 位部分向右移位,并将从高位字移出的位转移到低位字中。

如果您只有逻辑转变,那么这样做很麻烦,因为您必须手动修复该位。循环进位指令允许您将需要传输的位保留在进位标志中,并将其一次性移入。循环进位指令将移出的位放入进位标志中,以便您可以轻松地将其链接在一起以右移任意大小的数据。

关于assembly - 带扩展的循环移位有何用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47621901/

相关文章:

c++ - 移位 `char` 与 `unsigned char`

c - 二元加法

verilog - 如何以现实的方式实现存储字节和存储半字

cpu-architecture - 32位Windows下使用Amd64指令的轻量级方法?

c - 汇编语言是如何工作的?

c - '[' 标记之前的汇编语言解析错误

仅使用按位操作将 float 转换为 int (float2int)

c - ISRS 没有接到电话

go - 在一个变量中存储 2 个值

performance - 现代 CPU 中的小分支