[英]Dissasembling simple ARM instructions?
我一直在搞亂IDA Pro並試圖為了它而拆卸我自己的產品。
我注意到了一些我不理解的事情,因為我的匯編語言知識很糟糕。 這里有一小段代碼調用CGContextSetRGBStrokeColor 。
CGContextSetRGBStrokeColor(ctx, 1, 1, 1, 1);
在IDA中它看起來像這樣:
我不明白很多事情:
一些文字行http://a.imageshack.us/img836/4018/gah.png
該文件是一個框架 (因此是一個Mach-O文件)。 該功能來自CoreGraphics。
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]
只是意味着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個參數上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.