rlwinm (Rotate Left Word Immediate Then AND with Mask)包含一个AND,因此一些原始信息丢失。您必须将原始的r3值保存在某个地方,以便以后恢复。 举个简单的例子,考虑and reg, 0x0f,撤销它所需的信息(高位的状态)消失了,因为目标和源是同一个寄存器,所以源被修改后的值覆盖。 是的,这个rlwinm确实把一些位归零了;掩码的位范围不保留所有32位,并且 * 仅 * 循环移位。实际上,移位(循环移位)计数是0,asm源代码语法中的第一个立即数操作数。因此,它只是将其用于立即数AND。它执行类似r3 &= ~0x0000003c、(1<<(31-25)) - (1<<(31-29))的操作,因为IBM向后编号位,MSB=0,LSB=31或63,具体取决于操作数大小! 我可以在掩码开始和掩码结束立即数中的一个或两个中具有off-by-one;我没有仔细阅读文档,但是0x3c或~0x3c看起来像是一个合理的掩码值。我认为它实际上清除了一些位,并保留了其余的位,因为mask-begin高于mask-end。所以~0x3c。除非该位字段保存在其他地方,以便您可以使用旋转和插入来恢复它。屏蔽rlwinm的具体操作并不重要,重要的是它是一个不可逆的操作。
1条答案
按热度按时间xeufq47z1#
rlwinm
(Rotate Left Word Immediate Then AND with Mask)包含一个AND,因此一些原始信息丢失。您必须将原始的r3
值保存在某个地方,以便以后恢复。举个简单的例子,考虑
and reg, 0x0f
,撤销它所需的信息(高位的状态)消失了,因为目标和源是同一个寄存器,所以源被修改后的值覆盖。是的,这个
rlwinm
确实把一些位归零了;掩码的位范围不保留所有32位,并且 * 仅 * 循环移位。实际上,移位(循环移位)计数是0
,asm源代码语法中的第一个立即数操作数。因此,它只是将其用于立即数AND。它执行类似r3 &= ~0x0000003c
、(1<<(31-25)) - (1<<(31-29))
的操作,因为IBM向后编号位,MSB=0,LSB=31或63,具体取决于操作数大小!我可以在掩码开始和掩码结束立即数中的一个或两个中具有off-by-one;我没有仔细阅读文档,但是
0x3c
或~0x3c
看起来像是一个合理的掩码值。我认为它实际上清除了一些位,并保留了其余的位,因为mask-begin高于mask-end。所以~0x3c
。除非该位字段保存在其他地方,以便您可以使用旋转和插入来恢复它。屏蔽rlwinm
的具体操作并不重要,重要的是它是一个不可逆的操作。