拆卸简单的ARM指令?

时间:2010-08-12 16:58:32

标签: objective-c assembly arm core-graphics ida

我一直在搞乱IDA Pro并试图为了它而拆卸我自己的产品。

我注意到了一些我不理解的事情,因为我的汇编语言知识很糟糕。这里有一小段代码调用 CGContextSetRGBStrokeColor

CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1);

在IDA中,它看起来像这样:

IDA Output

我不了解很多事情:

  1. 0x3F800000 与数字1有什么关系?我认为它是一个参考,但我没有得到它所指的。
  2. 为什么 MOVS 被调用三次而不是四次(因为有四个参数)?
  3. 是R0,R1,R2等CPU寄存器吗?
  4. 有人可以解释这些:
  5. Some text lines http://a.imageshack.us/img836/4018/gah.png

    此文件是框架(因此是 Mach-O 文件)。该功能来自CoreGraphics。

1 个答案:

答案 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。