本文將系統地介紹如何利用xcode在ios裝置上使用組合語言。
一、建立彙編原始檔:
在你的xcode專案中存放原始檔的目錄下滑鼠(或觸控板)右鍵,選擇new file。然後在左側的ios那欄裡選擇other,在右邊你會看到assembly file,選中它,然後命名,以.s作為字尾。
二、編寫彙編**:
然後可以嘗試以下**:
/*.text表示**正文部分。* arm7.asm
* test
.globl _my_arm_test
.globl _my_thumb_test
.arm
_my_arm_test:
vdup.32 q0, r0
qadd8 r0, r1, r2
add r0, r0, lsl #2
bx lr
.thumb
.thumb_func _my_thumb_test
_my_thumb_test:
movw r1, #1001
rev16 r0, r1
bx lr
.align根據不同的彙編器會有不同的行為,像這裡的.align4可能表示4位元組對齊,也可能表示16位元組對齊。
.arm表示後面的函式中的指令都是arm指令。而.thumb表示後面函式中的指令都是thumb或thumb-2指令。其中,如果乙個函式是用thumb寫的,那麼必須用.thumb_func修飾,否則聯結器在連線符號時會有問題。
上述**中,_my_arm_test分別使用了一條neon指令,一條armv6指令和兩條armv5te指令。而_my_thumb_test中則分別使用了一條armv7 thumb-2指令、一條armv6指令和一條armv5te指令。
.text三、在c/c++或objective c/c++中呼叫彙編函式.align
2.globl _myasmtest
#if defined(__i386__) || defined(__x86_64__)
_myasmtest:
xor%eax, %eax
ret#elif defined(__arm__)
_myasmtest:
eor r1, r0, r0
bx lr
#elif defined(__arm64__)
_myasmtest:
eor x1, x0, x0
ret#endif
如何在你的c/c++原始檔中呼叫彙編寫的函式呢?其實這跟呼叫普通的c函式一樣。
1
2
3
4
5
6
7
8
9
extern
int
my_arm_test(
int
a,
int
b,
int
c);
extern
int
my_thumb_test(
int
a,
int
b);
void
my_test(
void
)
我們可以看到,這裡函式名前的下劃線沒有了。這裡不需要,而且也不能加下劃線。
armv7中,對於通用暫存器,自己寫的過程中需要保護r4、r5、r6、r7、r8、r9、r10、r11以及r14暫存器;neon暫存器需要儲存q4、q5、q6、q7暫存器。
arm64模式下,通用暫存器x18、x30不能被使用。而需要被自己寫的過程所保護的是:x19、x20、x21、x22、x23、x24、x25、x26、x27、x28、x29暫存器;而simd暫存器需要保護的是v8、v9、v10、v11、v12、v13、v14、v15。
Debug的使用 《組合語言》學習筆記
說明 括號內的紅色為助記。一 什麼是debug debug是dos windows提供的實模式 8086方式 程式的除錯工具。使用它,可以檢視cpu各種暫存器的內容 記憶體的情況和在機器碼級跟蹤程式的執行。二 常用的debug功能 用debug的 r命令 register 檢視 改變cpu暫存器的內...
使用組合語言程式設計常見錯誤與技巧
使用組合語言程式設計常見錯誤與技巧 無限期小結中 1 定義的變數的位數與所涉及到的暫存器的位數不一致。2 沒有把count1 string1 緊跟著放在string1的定義之後,注意 的含義噢!它用來儲存當前正在彙編的指令的偏移位址。3 使用中斷指令時,不光要對ah做出修改,還要影響al的值,大家注...
使用組合語言解決除法溢位問題
1 assume cs code23 code segment 4start 5mov ax,4240h 6mov dx,000fh 7mov cx,0ah89 call divdw 1011 movax,4c00h 12int 21h1314 名稱 divdw15 功能 進行不會產生溢位的除法運算...