2012-10-31 19 views
2

只是好奇如何開始瞭解iOS下的ARM。任何幫助將是非常好的。我如何在iOS上開始使用ARM?

+0

請閱讀Matt Galloway寫的[這篇出色的文章](http://www.raywenderlich.com/37181/ios-assembly-tutorial)。它清楚地解釋了基礎知識。 – DavidS

回答

20

在我看來,最好的辦法上手是

  1. 編寫的C代碼(後來的Objective-C)
  2. 查看相應的彙編代碼的小片段
  3. 瞭解不夠了解彙編代碼
  4. 重複!

要做到這一點,你可以使用Xcode中:

  1. 創建一個新的iOS項目(單個視圖應用程序是罰款)
  2. 添加一個C文件scratchpad.c
  3. 在項目生成設置中,將「生成調試符號」爲「否」
  4. 確保目標是iOS設備,而不是模擬器
  5. 打開scratchpad.c並打開助理編輯
  6. 設置助理編輯到大會並選擇「釋放」

例1

添加下面的函數來scratchpad.c:

void do_nothing(void) 
{ 
    return; 
} 

如果你現在刷新大會在助理編輯器,你應該看到很多以點(指令)開頭的行,接着是

_do_nothing: 
@ BB#0: 
    bx lr 

現在讓我們忽略這些指令並查看這三行。通過在互聯網上搜索一下,你會發現這些行是:

  1. 一個標籤(函數的名稱帶有下劃線的前綴)。
  2. 只是編譯器發出的評論。
  3. return語句。 b表示分支,現在忽略x(它與指令集之間的切換有關),lr是鏈接寄存器,其中調用方存儲返回地址。

例2

讓牛肉它一點和代碼更改爲:

extern void do_nothing(void); 

void do_nothing_twice(void) 
{ 
    do_nothing(); 
    do_nothing(); 
} 

保存並刷新組裝後,你會得到下面的代碼:

_do_nothing_twice: 
@ BB#0: 
    push {r7, lr} 
    mov r7, sp 
    blx _do_nothing 
    pop.w {r7, lr} 
    b.w _do_nothing 

再次,通過在互聯網上搜索一下,你會發現每一行的含義。需要做更多的工作,因爲需要撥打兩個電話:第一個電話需要返回給我們,所以我們需要更改lr。這是通過blx指令完成的,該指令不僅分支到_do_nothing,還將下一條指令的地址(返回地址)存儲在lr中。

因爲我們改變了返回地址,所以我們必須把它存儲在某個地方,所以它被壓入堆棧。第二跳有一個.w後綴,但現在讓我們忽略它。爲什麼功能不是這樣?

_do_nothing_twice: 
@ BB#0: 
    push {lr} 
    blx _do_nothing 
    pop.w {lr} 
    b.w _do_nothing 

這將工作爲好,但在iOS中,慣例是幀指針存放在r7。幀指針指向堆棧中我們存儲前一幀指針和前一個返回地址的位置。

那麼什麼代碼所做的是:第一,它推動r7lr到堆棧中,然後將其設置r7指向新的堆棧幀(這是在堆棧的頂部,並sp點上方然後它第一次分支,然後恢復r7lr,最後它第二次分支。最後不需要一個bx lr,因爲被調用的函數將返回到lr,它指向我們的調用者。

例3

讓我們來看看最後一個例子:

void swap(int *x, int *y) 
{ 
    int temp = *x; 
    *x = *y; 
    *y = temp; 
} 

的彙編代碼:

_swap: 
@ BB#0: 
    ldr r2, [r0] 
    ldr r3, [r1] 
    str r3, [r0] 
    str r2, [r1] 
    bx lr 

帶着幾分搜索,你會學到,論據和返回值存儲在寄存器r0-r3中,我們可以將這些值用於我們的計算。代碼的作用很簡單:它將r0r1指向的值加載到r2r3中,然後將它們按交換順序存回,然後分支回去。

就是這樣:寫小片段,獲得足夠的信息來大致瞭解發生了什麼事中的每一行,重複。希望有所幫助!

+2

好答案,壞問題。 – Sara

+0

謝謝@Sara!我最近在iOS上進行了一次關於學習ARM彙編的討論,答案是前半部分的總結。 :) –

+0

嗨,很好的回答,兩個問題,當你說確保目標是iOS設備,你可以做到這一點,而無需加入開發人員計劃?我對你已經給出的例子輸出不同的是:_donothing:## @donothing ## BB#0: \t pushl \t%EBP \t MOVL \t%ESP,EBP% \t popl等\t%EBP \t RET – fixulate