国产粉嫩无码不卡在线观看,酒店大战丝袜高跟鞋人妻,特级精品毛片免费观看,欧美亚洲日本国产综合在线

使用匯編語(yǔ)言編寫一個(gè)Android應(yīng)用程序(hello,word)(android 匯編語(yǔ)言)

使用匯編語(yǔ)言編寫一個(gè)Android應(yīng)用程序(hello,word)(android 匯編語(yǔ)言)

我們都熟悉計(jì)算機(jī)和PC內(nèi)的程序和處理流程,那么手機(jī)的流程呢?一些app開(kāi)發(fā)的人可能熟悉了,但是其他人可能對(duì)此知之甚少,本文中蟲(chóng)蟲(chóng)代理大家利用一個(gè)簡(jiǎn)單的安卓實(shí)例來(lái)探索安卓中應(yīng)用的處理流程。 出于研究目的我們沒(méi)有使用移動(dòng)開(kāi)發(fā)的常用的Android Studio和Java語(yǔ)言,而是使用了底層的匯編語(yǔ)言。

Hello, Android!

問(wèn)題源于,某個(gè)開(kāi)發(fā)群,有人的隨口一個(gè)問(wèn)題:智能手機(jī)如何工作的?里面有什么?

我們利用一個(gè)安卓設(shè)備Galaxy S6 Edge,該機(jī)基于ARM架構(gòu)(大多數(shù)智能手機(jī)都是基于ARM CPU這和常見(jiàn)的基于X86 平臺(tái) PC或者服務(wù)器不一樣)。我們就以他為例,實(shí)現(xiàn)一個(gè)匯編版本的\”Hello,World\”簡(jiǎn)單程序,并讓它在該設(shè)備商跑起來(lái)。

使用匯編語(yǔ)言編寫一個(gè)Android應(yīng)用程序(hello,word)(android 匯編語(yǔ)言)

.text

.globl _start

_start:

mov %r0, $1 // file descriptor number 1 (stdout)

ldr %r1, =message

mov %r2, $message_len

mov %r7, $4 // syscall 4 (write)

swi $0

mov %r0, $0 // exit status 0 (ok)

mov %r7, $1 // syscall 1 (exit)

swi $0

.data

message:

.ascii \”Hello, World Chongchongn\”

message_len = . – message

如果你之前從未見(jiàn)過(guò)匯編代碼,那么這個(gè)程序可不好理解,但不要擔(dān)心,跟著我們一起進(jìn)行就好了。

程序解釋

程序分為兩部分: .text 部分:包含機(jī)器代碼指令。

.data部分:從第15行開(kāi)始,包含變量,字符串和其他數(shù)據(jù)。.text部分通常是只讀的,而.data部分支持寫入。

在第2行中,我們定義了一個(gè)名為_(kāi)start的全局函數(shù)。這是該工程的注入點(diǎn)。操作系統(tǒng)將從這一點(diǎn)開(kāi)始運(yùn)行代碼。該函數(shù)的實(shí)際定義在第4行。函數(shù)有兩個(gè)功能:第5-9行將消息打印到屏幕,第11-13行終止程序。實(shí)際上11-13行可以省略掉,這時(shí)候程序?qū)⒆址蛴”Hello,World ChongChong\”并退出,但退出時(shí)候可能會(huì)崩潰試圖執(zhí)行一些隨機(jī)無(wú)效的指令,它恰好是內(nèi)存中的下一個(gè)。

打印消息(r0,r1,r2寄存器和swi)

通過(guò)調(diào)用系統(tǒng)調(diào)用來(lái)打印到屏幕。系統(tǒng)調(diào)用是操作系統(tǒng)提供的功能。本程序中我們調(diào)用了write()系統(tǒng)調(diào)用,通過(guò)將值4賦值給名為r7(第8行)的CPU寄存器中來(lái)指示,然后執(zhí)行\(zhòng)”swi $0\”指令(第9行),該指令直接調(diào)用在Android內(nèi)部運(yùn)行的Linux內(nèi)核。

系統(tǒng)調(diào)用的參數(shù)通過(guò)其他寄存器傳遞:r0表示我們要打印的文件描述符的編號(hào)。我們給他賦值為1(第5行),這個(gè)我們都熟悉,標(biāo)號(hào)為1的文件描述符實(shí)際上就是stdout,標(biāo)準(zhǔn)輸出,這樣就功能在屏幕上打印。

r1表示我們要載入的數(shù)據(jù)的內(nèi)存地址,因此我們給它賦值為\”Hello,World ChongChong\”字符串的地址(第6行)。r2告訴Android我們要寫入多少字節(jié)。我們將其設(shè)置為message_len(第7行)的值,該值在第18行使用特殊的語(yǔ)法計(jì)算:點(diǎn)符號(hào)表示當(dāng)前的內(nèi)存地址,因此\”. – message\”表示當(dāng)前內(nèi)存地址減去message的地址。這就計(jì)算了message的長(zhǎng)度。總之,第5-9行中的代碼相當(dāng)于以下c代碼:

#define message \”Hello, World ChongChong n\”

write(1, message, sizeof(message));

結(jié)束程序(r0,r7)

結(jié)束程序要簡(jiǎn)單得多,我們只需要將退出代碼賦值給r0(第11行),然后我們將值1(即exit()系統(tǒng)調(diào)用的值)賦值給r7(第12行),并且再次調(diào)用內(nèi)核(第13行)。

如果有興趣,你可以參考在安卓源代碼中相關(guān)的Android系統(tǒng)調(diào)用列表及其編號(hào)。你也可以在那里找到write()和exit()函數(shù)的實(shí)現(xiàn),它們調(diào)用相應(yīng)的系統(tǒng)調(diào)用,就像我們一樣。

編譯源碼

為了編譯匯編程序,你需要Android NDK,即Native Development Kit,它包含一組用于ARM平臺(tái)的編譯器和構(gòu)建工具。你可以直接從官方網(wǎng)站下載,也可以通過(guò)Android Studio安裝:

使用匯編語(yǔ)言編寫一個(gè)Android應(yīng)用程序(hello,word)(android 匯編語(yǔ)言)

轉(zhuǎn)到\”SDK工具\(yùn)”并選中\(zhòng)”NDK\”,然后單擊\”確定\”。另請(qǐng)注意Android SDK位置

獲得NDK后,你需要搜索一個(gè)名為arm-linux-androideabi-as的文件,它是ARM平臺(tái)的匯編程序。如果你是通過(guò)Android Studio下載的,請(qǐng)?jiān)贏ndroid SDK位置內(nèi)查找。在我的機(jī)器上,它位于:

ndk-bundletoolchainsarm-linux-androideabi-4.9prebuiltwindows-x86_64bin

根據(jù)不同的NDK版本和操作系統(tǒng)該路徑會(huì)略有變化,根據(jù)實(shí)際環(huán)境選擇。該文件內(nèi)置了ARM匯編程序。

將源代碼保存為hello.s的文件。然后運(yùn)行以下命令將編譯為機(jī)器代碼:

arm-linux-androideabi-as -o hello.o hello.s

以上命令會(huì)創(chuàng)建一個(gè)名為hello.o的可執(zhí)行文件。

然后再通過(guò)調(diào)用鏈接器將其轉(zhuǎn)換為可在你的設(shè)備上運(yùn)行的ELF二進(jìn)制文件:

arm-linux-androideabi-ld -o hello hello.o

你現(xiàn)在有一個(gè)名為hello的文件,其中包含你的程序,可以運(yùn)行。

運(yùn)行程序

安卓應(yīng)用程序通常以APK格式分發(fā)。這是一種特殊的ZIP文件,安卓希望以特定的方式構(gòu)建,并且應(yīng)該包含Java類(你可以使用本機(jī)C/C 或者其他語(yǔ)言編寫具體的應(yīng)用代碼,但入口點(diǎn)仍然必須是是Java) 。

為了方便運(yùn)行我們的應(yīng)用程序,我們使用adb將其復(fù)制到她的Android設(shè)備的臨時(shí)文件夾,然后使用adb shell運(yùn)行應(yīng)用程序并查看輸出:

adb push hello /data/local/tmp/hello

adb shell chmod x /data/local/tmp/hello

最后,運(yùn)行應(yīng)用程序:

adb shell /data/local/tmp/hello

Hello World Chongchon

總結(jié)

為安卓設(shè)備編寫匯編代碼是熟悉ARM體系結(jié)構(gòu)的好方法,幫我們了解每天使用的APP是如何運(yùn)行,及其底層的工作原理,我曾經(jīng)在以前的文章和回答中回答過(guò)匯編作為一個(gè)必須要技能,我們不必須要精通但是每個(gè)人都需要學(xué)習(xí)一點(diǎn),這樣有助于我們了解計(jì)算機(jī)體系結(jié)果和底層的運(yùn)行原理。

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。