解读简单的ARM指令?

Kri*_*oks 2 assembly arm core-graphics objective-c ida

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

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

CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1);
Run Code Online (Sandbox Code Playgroud)

在IDA中它看起来像这样:

IDA输出

我不明白很多事情:

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

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

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

ken*_*ytm 10

0x3F800000如何与数字1相关?我认为它是一个参考,但我没有得到它所指的.

在IEEE单精度表示中,0x3F800000是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]
Run Code Online (Sandbox Code Playgroud)

只是意味着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
Run Code Online (Sandbox Code Playgroud)

将1.0放在第5个参数上.

  • +1.最后一个参数被`STR`指令推送到堆栈. (2认同)