前言
个人正在学习PowerPC逆向,这里记录一下自己遇到的一些难点汇编代码。
三目运算符
遇到以下汇编代码,直接使用三目运算符。参考: ARM/MIPS/PowerPC/RISC-V 指令集快速入门 | FANG - 🍉 (moooc.cc)
汇编指令 | 对应C代码 |
---|---|
subfic rA, rB, 0 adde rC, rA, rB | rC = (rB ? 0 : 1) |
addic rA, rB, -1 subfe rC, rA, rB | rC = (rB ? 1 : 0) |
addic rA, rB, -1 subfe rC, rA, rA | rC = (rB ? 0 : -1) |
extsb rA, rA<br/>srawi rB, rA, 0x1F xor rC, rB, rA subf rC, rC, rB srawi rC, rC, 0x1F | rC = (rA ? -1 : 0) |
extsb rA, rA xor rC, rA, rS srawi rB, rC, 0x1F xor rC, rB, rC subf rC, rC, rB srawi rC, rC, 0x1F | rC = (rA == rS) ? 0 : -1 |
整形浮点转换
这里指的是int和double的转换。
我们先使用C语言来实现两个int转换为double(也研究了一小会才整出来):
//两个int合成double应该是这样的: |
这样,我们就实现了两个int⇔double
。
在PowerPC中,我们只需要注意若是int转double,汇编代码若操作了较大的数,那么就是注释中的第一个数(即*(&a+1)),操作了较小的数,就是注释中的第二个数(即a)。反之是double转int,则相反。然后直接根据上面的C代码更改对应的数字即可。
其它重要汇编语句
其实有些IDA里反应的语句实际翻译起来无需实际代码,只是内部逻辑需要,但这部分往往难以理解。
clrlwi
关于 clrlwi 常见的语句:
clrlwi r0, r9, 24 |
所以上面的语句其实就是r9的值传入r0 。至于为什么要使用这条语句来传值,就是适应高位清零之类的需求。
clrlwi r0, r9, 16 |
是一个short。
extsh
extsh r9, r11 |
即将r11中的一个半字扩展成一个单字(WORD),放入r9寄存器中。 一般涉及这条指令的变量,为有符号的。