在iOS中如何使用組合語言

2021-06-29 00:47:21 字數 2198 閱讀 1927

本文將系統地介紹如何利用xcode在ios裝置上使用組合語言。

一、建立彙編原始檔:

在你的xcode專案中存放原始檔的目錄下滑鼠(或觸控板)右鍵,選擇new file。然後在左側的ios那欄裡選擇other,在右邊你會看到assembly file,選中它,然後命名,以.s作為字尾。

二、編寫彙編**:

然後可以嘗試以下**:

/*

* 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

.text表示**正文部分。

.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

.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++或objective c/c++中呼叫彙編函式

如何在你的c/c++原始檔中呼叫彙編寫的函式呢?其實這跟呼叫普通的c函式一樣。

1

2

3

4

5

6

7

8

9

externintmy_arm_test(inta,intb,intc);

externintmy_thumb_test(inta,intb);

voidmy_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 功能 進行不會產生溢位的除法運算...