assembly 逆转PowerPC的规则

kiz8lqtg  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(134)

我目前正在寻找了解和修改一些源代码的游戏模块我发现。在开始一些调整是通过使用这个:
rlwinm r3, r3, 0, 29, 25
我现在正试图找到一种方法来逆转这个调整后,在游戏中-所以我不想删除它从游戏中完全,只是使它可逆时,某些条件得到满足。
这条生产线所做的反向更改的装配命令是什么?

xeufq47z

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的具体操作并不重要,重要的是它是一个不可逆的操作。

相关问题