2010-08-12 35 views
2

我一直在与IDA Pro搞混,试图为了它而反汇编我自己的产品。解散简单的ARM指令?

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

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

在IDA它看起来像这样:

IDA Output

我不明白一些事情:

  1. 如何0x3F800000涉及1号?我认为这是一个参考,但我没有得到它所指的。
  2. 为什么MOVS被称为三次而不是四次(因为有四个参数)?
  3. R0,R1,R2等CPU寄存器?
  4. 可能有人explaing这些:

Some text lines http://a.imageshack.us/img836/4018/gah.png

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

+1

这是ARM组件;它与马赫无关。 Mach-O只是包含机器码的文件格式。 – Gabe 2010-08-12 17:14:22

+0

您的标题有误导性 - 这个问题与Mach-O无关。除非有任何异议,否则我会在几分钟内编辑修复它。 – 2010-08-12 17:15:18

+0

-1您能否将文字发布为文字而不是图片。这些图像可能会在一两个月内消失。 – starblue 2010-08-13 07:37:00

回答

10

0x3F800000与数字1有什么关系?我认为这是一个参考,但我没有得到它所指的。

0x3F800000在IEEE单精度表示中为1.0。您可以右键单击该0x3F800000并选择浮点表示将其转换为1.0。

为什么MOVS被称为三次而不是四次(因为有四个参数)?

在标准ARM调用约定中,前4个参数分别存储在R0到R3中。 ldr r1, =0x3f800000指令已经存储了第二个参数。

是R0,R1,R2等CPU寄存器?

是。

可能有人explaing这些:

请不要随意拆卸非连续的指令,因为R3的第二个指令,并且在第3是不同的。

如果您检查整个函数,您应该看到“var_4C”是栈上变量ctx的地址。因此,

add r3, sp, #0x50+var_4c 
ldr r2, [r3] 

只是意味着r2 = ctx。指令movs r0, r2很久以后才将上下文作为第一个参数。

另外,在ARM中,var_?相当于值-0x ??。在ARM中,第五参数,上述在[SP,#0],[SP,#4],等。因此,指令

ldr r3, =0x3f800000 
str r3, [sp, #0]  ;// #0x50+var_50 = 0x50 - 0x50 = 0 

把1.0上,在第5自变量存储在栈上。

+2

+1。最后一个参数被'STR'指令推送到堆栈。 – 2010-08-12 17:16:03

+1

ARM应用程序二进制接口(ABI)定义了调用约定。您可以从ARM自己的网站下载ABI规范:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.swdev.abi/index.html请注意,GNU/Linux使用GNU的ARM ABI实现的“EABI”(扩展ABI)。大多数情况下,两者现在是兼容的。从历史上看,情况并非如此。 – RobM 2010-08-12 17:31:58

+1

实际上,“EABI”是指“嵌入式ABI”,由ARM定义。旧的ABI是“ADS”(ARM开发人员套件)ABI。 ADS已被RVCT所取代,它使用新的ABI,并且(大部分)兼容GCC。 – 2010-08-12 17:45:03