只是好奇如何開始瞭解iOS下的ARM。任何幫助將是非常好的。我如何在iOS上開始使用ARM?
2
A
回答
20
在我看來,最好的辦法上手是
- 編寫的C代碼(後來的Objective-C)
- 查看相應的彙編代碼的小片段
- 瞭解不夠了解彙編代碼
- 重複!
要做到這一點,你可以使用Xcode中:
- 創建一個新的iOS項目(單個視圖應用程序是罰款)
- 添加一個C文件scratchpad.c
- 在項目生成設置中,將「生成調試符號」爲「否」
- 確保目標是iOS設備,而不是模擬器
- 打開scratchpad.c並打開助理編輯
- 設置助理編輯到大會並選擇「釋放」
例1
添加下面的函數來scratchpad.c:
void do_nothing(void)
{
return;
}
如果你現在刷新大會在助理編輯器,你應該看到很多以點(指令)開頭的行,接着是
_do_nothing:
@ BB#0:
bx lr
現在讓我們忽略這些指令並查看這三行。通過在互聯網上搜索一下,你會發現這些行是:
- 一個標籤(函數的名稱帶有下劃線的前綴)。
- 只是編譯器發出的評論。
- 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
。幀指針指向堆棧中我們存儲前一幀指針和前一個返回地址的位置。
那麼什麼代碼所做的是:第一,它推動r7
和lr
到堆棧中,然後將其設置r7
指向新的堆棧幀(這是在堆棧的頂部,並sp
點上方然後它第一次分支,然後恢復r7
和lr
,最後它第二次分支。最後不需要一個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
中,我們可以將這些值用於我們的計算。代碼的作用很簡單:它將r0
和r1
指向的值加載到r2
和r3
中,然後將它們按交換順序存回,然後分支回去。
等
就是這樣:寫小片段,獲得足夠的信息來大致瞭解發生了什麼事中的每一行,重複。希望有所幫助!
相關問題
- 1. ARM開始地址
- 2. 如何開始使用UDP IN IOS OBJECTIVE_C
- 3. 如何在Mac上開始使用Fortran?
- 4. 在Windows上使用curlpp。如何開始
- 5. 如何在Ubuntu上使用PHP開始
- 6. 如何在ARM上使用kgdb?
- 7. 我如何開始使用MEAN堆棧?
- 8. 我如何開始使用reactjs和graphql?
- 9. 我應該如何開始使用neo4j?
- 10. 我如何開始使用Mercurial?
- 11. 我如何開始使用Z80?
- 12. 我應該如何開始使用Iphone?
- 13. 我如何開始使用Go?
- 14. 我如何開始使用MEAN.IO?
- 15. 我如何開始使用SharpSVN?
- 16. 我如何開始使用SSRS?
- 17. 我如何開始使用libsandbox
- 18. 我如何開始使用Rails 4?
- 19. 我如何開始使用Android?
- 20. 如何T0我開始使用PHP
- 21. 我如何開始使用Perl 6?
- 22. 我將如何使用Rails測試開始「從頭開始」?
- 23. 如何在Scala上開始
- 24. 如何重新開始使用ios開發?
- 25. 你會如何在iOS中開始使用視圖sdk
- 26. 如何開始爲iOS開發配件?
- 27. 如何開始在Cloud9上使用Django進行開發?
- 28. 如何在iOS上使用evernote api獲取筆記內容的開始部分
- 29. 我如何開始在Seam應用
- 30. 如何開始使用我的JabbR的新安裝上AppHarbor?
請閱讀Matt Galloway寫的[這篇出色的文章](http://www.raywenderlich.com/37181/ios-assembly-tutorial)。它清楚地解釋了基礎知識。 – DavidS