Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 分解简单的手臂指令?_Objective C_Assembly_Arm_Core Graphics_Ida - Fatal编程技术网

Objective c 分解简单的手臂指令?

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

我一直在摆弄IDA Pro,试图为了它而拆卸我自己的产品

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

CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1);
在IDA中,它看起来是这样的:

我不明白很多事情:

  • 0x3F800000与数字1的关系如何?我认为这是一个参考,但我没有得到它所指的
  • 为什么MOVS被调用三次而不是四次(因为有四个参数)
  • R0、R1、R2等是否为CPU寄存器
  • 有人能解释一下吗:
  • 该文件是一个框架(因此是一个Mach-O文件)。该函数来自CoreGraphics

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

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

    为什么mov被调用三次而不是四次(因为有四个参数)

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

    R0、R1、R2等是否为CPU寄存器

    有人能解释一下吗:

    请不要拆分非连续指令,因为第2条指令中的r3与第3条指令中的r3不同

    如果您检查整个函数,您应该看到“var_4C”是堆栈上变量
    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兼容。回答得很好。谢谢。