【问题标题】:Dissasembling simple ARM instructions?反汇编简单的 ARM 指令?
【发布时间】:2010-08-13 01:29:49
【问题描述】:

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

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

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

在 IDA 中是这样的:

我不明白很多事情:

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

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

这个文件是一个Framework(因此是一个Mach-O文件)。该函数来自CoreGraphics。

【问题讨论】:

  • 这是 ARM 程序集;它与马赫无关。 Mach-O 只是包含机器码的文件格式。
  • 您的标题具有误导性——这个问题与 Mach-O 无关。除非有任何异议,否则我会在几分钟内进行编辑以修复它。
  • -1 您能否将文本发布为文本而不是图像。这些图像可能会在一两个月内消失。

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


【解决方案1】:

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

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

为什么 MOVS 被调用了 3 次而不是 4 次(因为有四个参数)?

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

R0、R1、R2等是CPU寄存器吗?

是的。

谁能解释一下:

不连续的指令请不要拆开,因为第二条指令的r3和第三条指令的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 个参数上。

【讨论】:

  • +1。最后一个参数由STR 指令压入堆栈。
  • ARM 应用程序二进制接口 (ABI) 定义了调用约定。您可以从 ARM 自己的网站下载 ABI 规范:infocenter.arm.com/help/index.jsp?topic=/… 请注意 GNU/Linux 使用“EABI”(扩展 ABI),它是 GNU 对 ARM ABI 的实现。大多数情况下,两者现在是兼容的。从历史上看,情况并非如此。
  • 其实“EABI”的意思是“嵌入式ABI”,是ARM定义的。旧的 ABI 是“ADS”(ARM 开发人员套件)ABI。 ADS 已被 RVCT 取代,RVCT 使用新的 ABI 并且(大部分)与 GCC 兼容。
  • 优秀的答案。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2015-02-25
  • 2022-08-11
  • 2013-02-06
  • 1970-01-01
  • 2011-02-18
  • 2023-03-10
  • 2013-06-12
  • 1970-01-01
相关资源
最近更新 更多