前言
最近在學(xué)習(xí)Cortex-A的linux編程,拿到的是《原子嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)說(shuō)解》,文中說(shuō)到,如果想要學(xué)習(xí)好Uboot和Linux內(nèi)核,就必須要學(xué)會(huì)匯編。
GNU匯編語(yǔ)法
我們?cè)谑褂眠^(guò)的STM32中的MDK與IAR下啟動(dòng)文件startup_stmp32f10x_hd.s中的匯編語(yǔ)法是有所不同的,所以不用將MDK下的匯編文件直接復(fù)制到IAR下去編譯,這是因?yàn)镸DK和IAR的編譯器不同,因此匯編語(yǔ)法就有一些區(qū)別,ARM匯編使用的是GCC交叉編譯器,所以匯編代碼要符合GNU語(yǔ)法。
GNU匯編語(yǔ)法適用于所有的架構(gòu),并不是ARM獨(dú)享的,GNU匯編由一系列的語(yǔ)句組成,每行一條語(yǔ)句,每條語(yǔ)句有3個(gè)可選部分,解釋如下:
label:instruction @ comment
Lable : 即標(biāo)號(hào),表示地址位置,有些指令前面可能會(huì)有標(biāo)號(hào),這樣就可以通這個(gè)標(biāo)號(hào)得到指令的地址,標(biāo)號(hào)也可以用來(lái)表數(shù)據(jù)地址,注意label后面的“:",任何以":"結(jié)尾的標(biāo)識(shí)符者會(huì)被識(shí)別為一個(gè)標(biāo)號(hào)。
instruction : 即指令,也就是匯編指令的偽指令。
@符號(hào):表示后面的是注釋?zhuān)透?a href="http://www.nxhydt.com/soft/data/21-24/" target="_blank">C語(yǔ)言中的”/ “和” /“一樣的,其實(shí)在GNU匯編文件中我們也可以使用"/ "和" /”來(lái)注釋。
comment :就是注釋內(nèi)容。
代碼如下所示
add:
MOVS R0, #0x123 @設(shè)置 R0=0x123
上面的代碼中"add:”就是標(biāo)號(hào),“MOVS R0,#0x123"就是指令,最后的"@設(shè)置 R0=0x123"就是注釋。
注意:ARM中的指令,偽指令、偽操作、寄存器名等可以全部使用大寫(xiě),也可以全部使用小寫(xiě),但是不能大小寫(xiě)混用。
用戶(hù)可以使用.section偽操作來(lái)定義一個(gè)段,匯編系統(tǒng)預(yù)定義一些段名,解釋如下:
.tex :表示代碼段。
.data :初始化的數(shù)據(jù)段。
.bss :未初始化的數(shù)據(jù)段。
.rodata :只讀數(shù)據(jù)段。
我們當(dāng)然可以使用.section來(lái)定義一個(gè)段,每個(gè)段以段名開(kāi)始,以下一段名或者文件結(jié)尾結(jié)束。代碼如下:
.section .testsection @定義一個(gè)testsection段
匯編程序的黙認(rèn)入口標(biāo)號(hào)是_start,不過(guò)我們可以在鏈接腳本中使用ENTRY來(lái)指明其他的入口點(diǎn),下面的代碼就是使用_start作為入口標(biāo)號(hào)。
.gloabl _start
_start:
ldr r0, =0x12 @ 給r0移入0x123.
上面代碼中,global是偽操作,表示_start 是一個(gè)全局標(biāo)號(hào),類(lèi)似C語(yǔ)言中的全局變量一樣,下面為常見(jiàn)的偽操作。
.byte :定義單字節(jié)數(shù)據(jù),比如.byte 0x123。
.short :定義雙字節(jié)數(shù)據(jù),比如.short 0x1234。
.long :定義一個(gè)4字節(jié)數(shù)據(jù),比如.long 0x12345678。
.equ :賦值語(yǔ)句,格式為.equ變量名,表達(dá)式如.equ num,0x123 表示num = 0x123。
.align :數(shù)據(jù)字節(jié)對(duì)齊,如.align 4 表示4字節(jié)對(duì)齊。
.end :表示源文件結(jié)束。
.global :定義一個(gè)全局符號(hào),格式為.global sysmbol,比如 .global _start。
GNU匯編還有其他的偽操作,最常見(jiàn)的如上所示。如果想詳細(xì)地了解全部的偽操作,可以參考《ARM Cortex-A(armV7)編程手冊(cè)V4.0》中的相關(guān)內(nèi)容。
GNU匯編同樣也支持函數(shù),函數(shù)格式如下:
函數(shù)名:
函數(shù)體
返回語(yǔ)句
GNU匯編函數(shù)返回語(yǔ)句不是必需要的,以下示例就是匯編寫(xiě)的Cortex-A7中斷服務(wù)函數(shù):
/* 未定義中斷 */
Undef ined_Handler:
ldr r0, = Undefined_Handler
bx r0
/* SVC 中斷 */
ldr r0, = SVC_Handler
bx r0
/* 預(yù)取終止中斷 */
ldr r0, = PrefAbort_Handler
bx r0
上述代碼中定義了3個(gè)匯編函數(shù):Unddefined_Handler、SVC_Handler和PrefAbort_Handler。以Undefined_Handler函數(shù)為來(lái)看匯編函數(shù)組成,"Undefined_Handler“就是函數(shù)名,"ldr r0, = Undefined_Handler”是函數(shù)體,“bx r0"是函數(shù)返回語(yǔ)句,"bx"指令是返回指令,函數(shù)返回語(yǔ)句不是秘需的。
-
嵌入式
+關(guān)注
關(guān)注
5068文章
19017瀏覽量
303249 -
Linux
+關(guān)注
關(guān)注
87文章
11227瀏覽量
208924 -
GNU
+關(guān)注
關(guān)注
0文章
143瀏覽量
17479 -
Cortex-A
+關(guān)注
關(guān)注
0文章
19瀏覽量
34260 -
匯編語(yǔ)法
+關(guān)注
關(guān)注
0文章
2瀏覽量
2096
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論