我一直在搞乱IDA Pro并试图为了它而拆卸我自己的产品。
我注意到了一些我不理解的事情,因为我的汇编语言知识很糟糕。这里有一小段代码调用 CGContextSetRGBStrokeColor 。
CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1);
在IDA中,它看起来像这样:
我不了解很多事情:
Some text lines http://a.imageshack.us/img836/4018/gah.png
此文件是框架(因此是 Mach-O 文件)。该功能来自CoreGraphics。
答案 0 :(得分:10)
0x3F800000如何与数字1相关?我认为它是一个参考,但我没有得到它所指的。
0x3F800000在IEEE单精度表示中为1.0。您可以右键单击该0x3F800000并选择浮点表示将其转换为1.0。
为什么MOVS被调用三次而不是四次(因为有四个参数)?
在标准的ARM调用约定中,前4个参数分别存储在R0到R3中。 ldr r1, =0x3f800000
指令已经存储了第二个参数。
R0,R1,R2等是CPU寄存器吗?
是
有人可以解释这些:
请不要拆开非连续指令,因为第2条指令的r3和第3条指令的r3不同。
如果检查整个函数,您应该看到“var_4C”是堆栈上变量ctx
的地址。因此,
add r3, sp, #0x50+var_4c
ldr r2, [r3]
只是意味着r2 = ctx
。指令movs r0, r2
后来将上下文作为第一个参数。
另外,在ARM中,var_ ??相当于值-0x ??。在ARM中,第5个参数及以上参数存储在[sp,#0],[sp,#4]等堆栈上。因此,指令
ldr r3, =0x3f800000
str r3, [sp, #0] ;// #0x50+var_50 = 0x50 - 0x50 = 0
在第五个参数上加上1.0。