2010-08-12 52 views
2

我一直在與IDA Pro搞混,試圖爲了它而反彙編我自己的產品。解散簡單的ARM指令?

我注意到了一些我不明白的東西,因爲我的彙編語言知識很糟糕。這裏有一小段代碼調用CGContextSetRGBStrokeColor

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

在IDA它看起來像這樣:

IDA Output

我不明白一些事情:

  1. 如何0x3F800000涉及1號?我認爲這是一個參考,但我沒有得到它所指的。
  2. 爲什麼MOVS被稱爲三次而不是四次(因爲有四個參數)?
  3. R0,R1,R2等CPU寄存器?
  4. 可能有人explaing這些:

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

該文件是一個框架(因此一個的Mach-O文件)。該功能來自CoreGraphics。

+1

這是ARM組件;它與馬赫無關。 Mach-O只是包含機器碼的文件格式。 – Gabe 2010-08-12 17:14:22

+0

您的標題有誤導性 - 這個問題與Mach-O無關。除非有任何異議,否則我會在幾分鐘內編輯修復它。 – 2010-08-12 17:15:18

+0

-1您能否將文字發佈爲文字而不是圖片。這些圖像可能會在一兩個月內消失。 – starblue 2010-08-13 07:37:00

回答

10

0x3F800000與數字1有什麼關係?我認爲這是一個參考,但我沒有得到它所指的。

0x3F800000在IEEE單精度表示中爲1.0。您可以右鍵單擊該0x3F800000並選擇浮點表示將其轉換爲1.0。

爲什麼MOVS被稱爲三次而不是四次(因爲有四個參數)?

在標準ARM調用約定中,前4個參數分別存儲在R0到R3中。 ldr r1, =0x3f800000指令已經存儲了第二個參數。

是R0,R1,R2等CPU寄存器?

是。

可能有人explaing這些:

請不要隨意拆卸非連續的指令,因爲R3的第二個指令,並且在第3是不同的。

如果您檢查整個函數,您應該看到「var_4C」是棧上變量ctx的地址。因此,

add r3, sp, #0x50+var_4c 
ldr r2, [r3] 

只是意味着r2 = ctx。指令movs r0, r2很久以後纔將上下文作爲第一個參數。

另外,在ARM中,var_?相當於值-0x ??。在ARM中,第五參數,上述在[SP,#0],[SP,#4],等。因此,指令

ldr r3, =0x3f800000 
str r3, [sp, #0]  ;// #0x50+var_50 = 0x50 - 0x50 = 0 

把1.0上,在第5自變量存儲在棧上。

+2

+1。最後一個參數被'STR'指令推送到堆棧。 – 2010-08-12 17:16:03

+1

ARM應用程序二進制接口(ABI)定義了調用約定。您可以從ARM自己的網站下載ABI規範:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.subset.swdev.abi/index.html請注意,GNU/Linux使用GNU的ARM ABI實現的「EABI」(擴展ABI)。大多數情況下,兩者現在是兼容的。從歷史上看,情況並非如此。 – RobM 2010-08-12 17:31:58

+1

實際上,「EABI」是指「嵌入式ABI」,由ARM定義。舊的ABI是「ADS」(ARM開發人員套件)ABI。 ADS已被RVCT所取代,它使用新的ABI,並且(大部分)兼容GCC。 – 2010-08-12 17:45:03