Objective c 分解简单的手臂指令?
我一直在摆弄IDA Pro,试图为了它而拆卸我自己的产品 我注意到一些我不理解的事情,因为我的汇编语言知识很糟糕。下面是调用CGContextSetRGBStrokeColor的一小段代码Objective c 分解简单的手臂指令?,objective-c,assembly,arm,core-graphics,ida,Objective C,Assembly,Arm,Core Graphics,Ida,我一直在摆弄IDA Pro,试图为了它而拆卸我自己的产品 我注意到一些我不理解的事情,因为我的汇编语言知识很糟糕。下面是调用CGContextSetRGBStrokeColor的一小段代码 CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1); 在IDA中,它看起来是这样的: 我不明白很多事情: 0x3F800000与数字1的关系如何?我认为这是一个参考,但我没有得到它所指的 为什么MOVS被调用三次而不是四次(因为有四个参数) R0、R1、R2等是否为CP
CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1);
在IDA中,它看起来是这样的:
我不明白很多事情:
ctx
的地址。因此,
add r3, sp, #0x50+var_4c
ldr r2, [r3]
只是意味着r2=ctx。指令movsr0,r2
之后将上下文作为第一个参数
此外,在ARM中,var_u??等于值-0x??。在ARM中,第5个及以上参数存储在堆栈上的[sp,#0]、[sp,#4]等处。因此,指令
ldr r3, =0x3f800000
str r3, [sp, #0] ;// #0x50+var_50 = 0x50 - 0x50 = 0
在第5个参数处启用1.0。这是臂组件;这与马赫数无关。Mach-O只是包含机器代码的文件格式。你的标题有误导性-这个问题与Mach-O无关。我会在几分钟内编辑以修复它,除非有任何异议。-1请你将文本作为文本而不是图像发布。这些图像可能会在一两个月内消失。最后一个参数由
STR
指令推送到堆栈中。ARM应用程序二进制接口(ABI)定义调用约定。您可以从ARM自己的网站下载ABI规范:请注意GNU/Linux使用“EABI”(扩展ABI),这是GNU对ARM ABI的实现。现在,这两者基本上是兼容的。历史上并非如此。实际上,“EABI”是指“嵌入式ABI”,由ARM定义。旧的ABI是“ADS”(ARM开发者套件)ABI。ADS已被RVCT取代,RVCT使用新的ABI,并且(大部分)与GCC兼容。回答得很好。谢谢。