在PPC反汇编遇到的一些坑
2020-09-06 本文已影响0人
不毛
1.将两个int合成一个double
image.png以这三行为例,第一行是将r0的值放在了var_60+4的位置,此时赋值的是一个整型,第二行则在var_60处赋值了一个整型,第三行直接从var_60取指向的值,且这个值为float(或者double)类型。
我们知道int类型占4字节,float也是4个字节,所以这里合成的是一个double。
具体转换为C语言可以参考如下代码
//hex2double
int a = 0; //存入低4字节
*(&a+1) = 3FF00000; //存入高4字节
double final = *(double *) &a; //强制类型转换,将a的地址转换为double类型的指针,然后取这个指针的指向的值
printf("%f",final); //输出1.0
反过来的话
//double2hex
//第一个数
int a = *(int*)(&final+1);
//第二个数
int b = *(int*)(&final);
2.数组
经常会看到类似于这样的代码
在这里涉及到偏移,同时r0如果是循环体内递增的变量,那么很可能这是一个数组array,每次循环取数组内某个元素array[i]
比如这里我们取r0=1(每次递增1,用1来算增量,以确定数组大小)
左移位n位即相当于乘了2^n
从第二行到第四行,得出最后一个r9 = (r02+r0)2^5 = 0x60,于是我们可以得出数组的每个元素大小为0x60。
后面stwx r0,r9,r11 ; 这里的操作就是把r0的值存入r11偏移r9的位置。
r11从上一句看出是var_38这个变量,那么从上面的结论我们可以看出var_38是个大小为0x60的数组。所以到这里为止,翻译成C语言大概是
var_38[r0] = 1;
3.函数指针
因为汇编可以先将函数地址保存在某个寄存器中,在后续需要使用的时候才调用,前面可能会有一个判断,来选择后续执行哪一个函数(但是由于参数后面才会获得,所以不会立刻执行)
这种情况对于C语言来说不太好直接处理
比如上图只是判断后,将后续要执行的函数保存在r21寄存器中
这个时候我们可以使用到函数指针操作
对于函数指针的话这一篇文章讲的比较详细易懂,不再赘述了
http://c.biancheng.net/view/228.html