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中它看起来像这样:

我不明白很多事情:
一些文字行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个参数上.