在樹莓派上學(xué)習(xí)ARM匯編 第一章 簡介

在我看來廷支,學(xué)習(xí)一門高級編程語言比學(xué)習(xí)一門特定體系結(jié)構(gòu)的匯編更有用嵌灰,但是我很想學(xué)習(xí)ARM匯編程序只是為了好玩问词,因為我知道一些386匯編語言森爽。這個想法不是想成為大師恨豁,而是想了解下面發(fā)生了什么。

ARM簡介

下面的解釋不會力求面面俱到的講述arm的體系結(jié)構(gòu)爬迟,我會盡量精簡講解其中實用的部分橘蜜。

ARM是一種32位體系結(jié)構(gòu),具有一個簡單的目標(biāo):靈活性付呕。盡管這對集成商非常有用(因為他們在設(shè)計硬件時有很大的自由度)计福,但對于必須應(yīng)對ARM硬件差異的系統(tǒng)開發(fā)人員來說卻不是那么好。因此徽职,在本文中象颖,我將假設(shè)一切都在運(yùn)行Raspbian的Raspberry Pi Model B上完成。

有些部分將是ARM通用的姆钉,而有些將是Raspberry Pi專用的说订。 我不會區(qū)分抄瓦。 ARM網(wǎng)站上有很多文檔可查!

開始寫匯編

匯編語言只是二進(jìn)制代碼之上的一個薄語法層陶冷。

二進(jìn)制代碼是計算機(jī)可以運(yùn)行的钙姊,它由以二進(jìn)制表示形式編碼的指令組成(此類編碼已在ARM手冊中記錄)。您可以編寫二進(jìn)制代碼編碼指令埂伦,但這會很麻煩(除了與Linux本身相關(guān)的其他一些技術(shù)煞额,我們現(xiàn)在可以很高興地忽略它們)。

由于計算機(jī)無法運(yùn)行匯編程序沾谜,因此我們必須從中獲取二進(jìn)制代碼膊毁。 我們使用一種稱為匯編器的工具將匯編器代碼匯編成可以運(yùn)行的二進(jìn)制代碼。

在本課程中我們使用gnu assembler基跑,這個工具是gnu project中的其中一個媚媒,有時又被稱為gas.

只需打開vim,nano或emacs之類的編輯器即可涩僻。 我們的匯編語言文件(稱為源文件)將帶有后綴.s缭召。 我不知道為什么是.s,但這是通常的慣例逆日。

第一個程序

從一個簡單的程序開始嵌巷,這個程序只有返回值,在其中不做任何事室抽。

/* -- first.s */
/* This is a comment */

.global main           /* 'main' is our entry point and must be global */

main:                      /* This is main */

mov r0, #2             /* Put a 2 inside the register r0 */

bx lr                       /* Return from main */

創(chuàng)建一個文件搪哪,將上述內(nèi)容保存其中,然后開始編譯坪圾,命令如下:
$ as -o first.o first.s
上述命令執(zhí)行完后將會創(chuàng)建一個first.o的文件晓折,下面我們將這個文件鏈接成為可執(zhí)行文件
$ gcc -o first first.o
如果上述步驟執(zhí)行順利,你將得到一個first的文件兽泄,這個就是你的程序漓概,下面來執(zhí)行吧。
$ ./first
它應(yīng)該不會有任何反應(yīng)病梢,的確胃珍,有點(diǎn)小失望,但是這個程序是執(zhí)行了的蜓陌,讓我們看一下它的返回值

$ ./first ; echo $?
2

太棒了觅彰,返回值2并非偶然,這是由于匯編代碼中的#2引起的钮热。
由于運(yùn)行匯編器和鏈接器很快會變得很無聊填抬,因此建議您使用以下Makefile文件或類似的文件。

# Makefile
all: first
 
first: first.o
    gcc -o $@ $+
 
first.o : first.s
    as -o $@ $<
 
clean:
    rm -vf first *.o

OK,讓我們來解釋一下吧

我們作弊只是為了使事情變得容易一些隧期。 我們在匯編器中編寫了一個C main函數(shù)飒责,它僅返回2;蛀骇。 這樣,我們的程序就更容易了读拆,因為C運(yùn)行時為我們處理了程序的初始化和終止。 我將一直使用這種方法鸵闪。
讓我們回顧一下最小匯編文件的每一行檐晕。

/* -- first.s */
/* This is a comment */

這些是評論。 注釋包含在/ /中蚌讼。 使用它們來記錄您的匯編器辟灰,因為它們會被忽略。 通常篡石,不要將/ /嵌套在/ *內(nèi)芥喇,因為它不起作用。

.global main /* 'main' is our entry point and must be global */

這是GNU匯編程序的指令凰萨。 指令告訴GNU匯編器做一些特別的事情继控。 它們以點(diǎn)號(。)開頭胖眷,后跟指令名稱和一些參數(shù)武通。 在這種情況下,我們說main是一個全局名稱珊搀。 這是必需的冶忱,因為C運(yùn)行時將調(diào)用main。 如果不是全局的境析,則C運(yùn)行時將無法調(diào)用它囚枪,并且鏈接階段將失敗。

main:          /* This is main */

GNU匯編程序中不是指令的每一行都將始終像label:指令劳淆。 我們可以省略label:和指令(忽略空行和空行)链沼。 僅帶有標(biāo)簽:的行將該標(biāo)簽應(yīng)用于下一行(您可以通過這種方式將多個標(biāo)簽引用相同的內(nèi)容)。 指令部分是ARM匯編語言本身沛鸵。 在這種情況下忆植,由于沒有指令,我們只是在定義main谒臼。

mov r0, #2 /* Put a 2 inside the register r0 */

在行的開頭朝刊,空格被忽略,但是縮進(jìn)在視覺上暗示該指令屬于主要功能蜈缤。
這是mov指令拾氓,表示移動。 我們將值2移至寄存器r0底哥。 在下一章中咙鞍,我們將了解有關(guān)寄存器的更多信息房官,現(xiàn)在不用擔(dān)心。 是的续滋,語法很尷尬翰守,因為目的地實際上在左邊。 在ARM語法中疲酌,它始終在左側(cè)蜡峰,因此我們說的是將r0寄存到立即數(shù)2之類的操作。在下一章中朗恳,我們將了解ARM中立即數(shù)的含義湿颅,不用擔(dān)心。
總而言之粥诫,該指令將2放入寄存器r0中(這實際上會覆蓋此時的r0寄存器)油航。

bx lr      /* Return from main */

該指令bx表示分支和交換。 在這一點(diǎn)上怀浆,我們實際上并不關(guān)心交換部分谊囚。 分支意味著我們將改變指令執(zhí)行的流程。 ARM處理器一個接一個地依次運(yùn)行指令执赡,因此在上述動作之后秒啦,該bx將被運(yùn)行(此順序執(zhí)行并非特定于ARM,而是在幾乎所有架構(gòu)中都會發(fā)生)搀玖。 分支指令用于更改此隱式順序執(zhí)行余境。 在這種情況下,我們跳轉(zhuǎn)到lr寄存器說的內(nèi)容灌诅。 我們現(xiàn)在不在乎lr包含什么芳来。 足以理解該指令只是離開了主要功能,從而有效地結(jié)束了我們的程序猜拾。
main的結(jié)果是程序的錯誤代碼即舌,并且在離開函數(shù)時必須將結(jié)果存儲在寄存器r0中,因此我們main執(zhí)行的mov指令實際上將錯誤代碼設(shè)置為2挎袜。

以上就是本節(jié)的內(nèi)容顽聂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盯仪,隨后出現(xiàn)的幾起案子紊搪,更是在濱河造成了極大的恐慌,老刑警劉巖全景,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耀石,死亡現(xiàn)場離奇詭異,居然都是意外死亡爸黄,警方通過查閱死者的電腦和手機(jī)滞伟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門揭鳞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梆奈,你說我怎么就攤上這事野崇。” “怎么了亩钟?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵乓梨,是天一觀的道長。 經(jīng)常有香客問我径荔,道長,這世上最難降的妖魔是什么脆霎? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任总处,我火速辦了婚禮,結(jié)果婚禮上睛蛛,老公的妹妹穿的比我還像新娘鹦马。我一直安慰自己,他們只是感情好忆肾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布荸频。 她就那樣靜靜地躺著,像睡著了一般客冈。 火紅的嫁衣襯著肌膚如雪旭从。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天场仲,我揣著相機(jī)與錄音和悦,去河邊找鬼。 笑死渠缕,一個胖子當(dāng)著我的面吹牛鸽素,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亦鳞,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馍忽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了燕差?” 一聲冷哼從身側(cè)響起遭笋,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徒探,沒想到半個月后坐梯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刹帕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年吵血,在試婚紗的時候發(fā)現(xiàn)自己被綠了谎替。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹋辅,死狀恐怖钱贯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侦另,我是刑警寧澤秩命,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站褒傅,受9級特大地震影響弃锐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜殿托,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一霹菊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧支竹,春花似錦旋廷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馒吴,卻和暖如春扎运,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饮戳。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工绪囱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莹捡。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓鬼吵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親篮赢。 傳聞我的和親對象是個殘疾皇子齿椅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354