2

我一直在玩弄 IDA Pro,并试图为此拆解我自己的产品。

我注意到一些我不明白的事情,因为我的汇编语言知识很糟糕。这是一小段调用CGContextSetRGBStrokeColor的代码。

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

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

IDA 输出

我不明白一些事情:

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

一些文本行 http://a.imageshack.us/img836/4018/gah.png

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

4

1 回答 1

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 放在第 5 个参数上。

于 2010-08-12T17:02:07.943 回答