我在理解rlwinm的PPC汇编指令时遇到了一点麻烦(立即向左旋转,然后使用掩码)。
我正在尝试反转函数的这一部分
rlwinm r3, r3, 0, 28, 28我已经知道r3是什么了。本例中的r3是一个4字节的整数,但我不确定这条指令rlwinm到底对它做了什么。
顺便说一下,这是在32位机器上。
发布于 2018-04-30 17:35:21
@paxdiablo的答案是正确的,但要添加更多上下文:
各种r*指令(rlwinm、rlwimi等)被设计用于提取其大小在编译时已知的位域,例如C结构位域,或者甚至只是将一个字分割成字节(使用一个lw和四个rlwinm指令可能比几个单独的lbzu更快)。
lw r4, r3 ; load the word at the address pointed at by r3
rlwinm r5, r4, 8, 24, 31 ; first byte in r5
rlwinm r6, r4, 16, 24, 31 ; second byte in r6
rlwinm r7, r4, 24, 24, 31 ; third byte in r7
rlwinm r8, r4, 0, 24, 31 ; fourth byte in r8, identical to andi r8, r4, 255在这种情况下,也可以将rlwinm指令用作andi的特殊形式,用于连续的位集。由于PowerPC中的指令总是32位,取立即值的指令只有16位来保存这些值-因此,如果你想屏蔽一组跨越高/低半字边界的位,比如23到8,你需要使用多次操作。
lis r4, r4, 0x00ff ; first set bits 23 to 16 of the mask
ori r4, r4, 0xff00 ; then bits bits 15 to 8
and r3, r3, r4 ; then perform the actual masking 但是,使用rlwinm指令,我们可以在单个指令中执行相同的操作:
rlwinm r3, r3, 0, 8, 23在您的示例中,该值可能包含某些内容的标志,并且此指令正在提取其中的一个标志。下一条指令可能是r3上的条件分支。
Peter Cordes纠正了我的一些错误,我对此表示感谢,并补充说,在这种情况下,可能没有必要使用rlwinm,这可能只是编译器的一个特性,导致生成此指令而不是andi。
https://stackoverflow.com/questions/46869705
复制相似问题