當前位置:首頁 > 嵌入式 > 嵌入式教程
[導讀]程序符號。通常為地址標號(label)。在指令和偽指令中通常為標號;在一些偽操作中符號可能是變量或常數(shù)。詳見ARM偽操作一節(jié)。

10.3匯編語言文件格式10.3.1ARM匯編語言語句格式

ARM(Thumb)匯編語法語句格式如下所示。

{symbol}{instruction|directive|pseudo-instruction}{;comment}

①symbol

程序符號。通常為地址標號(label)。在指令和偽指令中通常為標號;在一些偽操作中符號可能是變量或常數(shù)。詳見ARM偽操作一節(jié)。

在書寫中,符號必須從一行的行頭開始,前面不能包含空格或制表符tab。

②instruction

ARM或Thumb指令。

③directive

偽操作。詳見ARM偽操作一節(jié)。

④pseudo-instruction

ARM偽指令。詳見ARM偽指令一節(jié)。

⑤comment

語句注釋。注釋以分號(;)開頭,注釋的結尾即為一行的結尾。為了程序清晰易讀,注釋也可以單獨占用一行。匯編器在對程序進行匯編時忽略注釋。

在匯編語言程序設計中,每一條指令的助記符可以全部用大寫或全部用小寫,但不允許在一條指令中大、小寫混用。

同時,如果一條語句太長,可將該長語句分為若干行來書寫,在行的末尾用“\”表示下一行與本行為同一條語句。

10.3.2ARM匯編語言中的符號

在匯編語言程序設計中,經(jīng)常使用各種符號代替地址(addresses)、變量(variables)和常量(constants)等,以增加程序的靈活性和可讀性。盡管符號的命名由編程者決定,但并不是任意的,必須遵循以下的約定。

(1)符號區(qū)分大小寫,同名的大、小寫符號會被編譯器認為是兩個不同的符號。

(2)符號在其作用范圍內必須惟一。

(3)自定義的符號名不能與系統(tǒng)的保留字相同。其中保留字包括系統(tǒng)內部變量

(builtinvariable)和系統(tǒng)預定義(predefinedsymbol)的符號。

(4)符號名不應與指令或偽指令同名。如果要使用和指令或偽指令同名的符號要用雙斜杠“||”將其括起來,如“||ASSERT||”。

注意

雖然符號被雙斜杠括起來,但雙斜杠并非符號名的一部分。

(5)局部標號以數(shù)字開頭,其他的符號都不能以數(shù)字開頭。

1.變量(variable)

程序中的變量是指其值在程序的運行過程中可以改變的量。ARM(Thumb)匯編程序所支持的變量有三種。

·數(shù)字變量(numeric)。

·邏輯變量(logical)。

·字符串變量(string)。

數(shù)字變量用于在程序的運行中保存數(shù)字值,但注意數(shù)字值的大小不應超出數(shù)字變量所能表示的范圍。

邏輯變量用于在程序的運行中保存邏輯值,邏輯值只有兩種取值情況:真({TURE})和假({FALSE})。

字符串變量用于在程序的運行中保存一個字符串,注意字符串的長度不應超出字符串變量所能表示的范圍。

在ARM(Thumb)匯編語言程序設計中,可使用GBLA、GBLL、GBLS偽指令聲明全局變量,使用LCLA、LCLL、LCLS偽指令聲明局部變量,可使用SETA、SETL和SETS對其進行初始化。

2.常量(constants)

程序中的常量是指其值在程序的運行過程中不能被改變的量。ARM(Thumb)匯編程序所支持的常量有數(shù)字常量、邏輯常量和字符串常量。

數(shù)字常量一般為32位的整數(shù),當作為無符號數(shù)時,其取值范圍為0~232−1,當作為有符號數(shù)時,其取值范圍為−231~231−1。匯編器認為−n和232−n是相等的。對于關系操作,如比較兩個數(shù)的大小,匯編器將其操作數(shù)看作無符號的數(shù),也就是說“0>−1”,對匯編器來說取值為“假({FLASE})”。

邏輯常量只有兩種取值情況,真或假。

字符串常量為一個固定的字符串,一般用于程序運行時的信息提示。

3.程序中的變量代換

匯編語言中的變量可以作為作為一整行出現(xiàn)在匯編程序中,也可以作為行的一部分使用。

如果在數(shù)字變量前面有一個代換操作符“$”,編譯器會將該數(shù)字變量的值轉換為十六進制的字符串,并將該十六進制的字符串代換“$”后的數(shù)字變量。

如果在邏輯變量前面有一個代換操作符“$”,編譯器會將該邏輯變量代換為它的取值(真或假)。

如果在字符串變量前面有一個代換操作符“$”,編譯器會將該字符串變量的值代換“$”后的字符串變量。

如果程序中需要字符“$”,則可以用“$$”來表示。匯編器將不進行變量替換,而是將“$$”作為“$”。

下面的兩個例子說明了變量替換的過程。

;直接的變量替換

GBLSadd4ff

;

add4ffSETS"ADDr4,r4,#0xFF" ;給變量add4ff賦值

$add4ff.00 ;引用變量

;codes

ADDr4,r4,#0xFF00

;有特殊符號的變量替換

GBLSs1

GBLSs2

GBLSfixup

GBLAcount

;

countSETA14

s1SETS"a$$b$count" ;s1=a$b0000000E

s2SETS"abc"

fixupSETS"|xy$s2.z|" ;fixup=|xyabcz|

|C$$code|MOVr4,#16 ;label=C$$code

4.程序標號(label)

在ARM匯編中,標號代表一個地址,段內標號的地址在匯編時確定,而段外標號地址值在鏈接時確定。根據(jù)標號的生成方式,程序標號分為以下三種。

·程序相關標號(Program-relativelabels)。

·寄存器相關標號(Register-relativelabels)。

·絕對地址(Absoluteaddress)。

(1)程序相關標號

程序相關標號指位于目標指令前的標號或程序中的數(shù)據(jù)定義偽操作前的標號。這種標號在匯編時將被處理成PC值加上或減去一個數(shù)字常量。它常用于表示跳轉指令的目標地址或代碼段中所嵌入的少量數(shù)據(jù)。

(2)寄存器相關地址

這種標號在匯編時將被處理成寄存器的值加上或減去一個數(shù)字常量。它常被用于訪問數(shù)據(jù)段中的數(shù)據(jù)。這種基于寄存器的標號通常用MAP和FIELD偽操作定義,也可以用EQU偽操作定義。

(3)絕對地址

絕對地址是一個32位的數(shù)字量,使用它可以直接尋址整個內存空間。

5.局部標號

局部標號是一個0~99之間的十進制數(shù)字,可重復定義。局部標號后面可以緊接一個通常表示該局部變量作用范圍的符號。局部變量的作用范圍為當前段,也可以用偽操作ROUT來定義局部標號的作用范圍。

局部標號在子程序或程序循環(huán)中常被用到,也可以配合宏定義偽操作(MACRO和MEND)來使程序結構更加合理。

在同一個段中,可以使用相同的數(shù)字命名不同的局部變量。默認情況下,匯編器會尋址最近的變量。也可以通過匯編器命令選項來改變搜索順序。

局部變量命名語法如下。

n{routname}

局部變量引用的語法格式如下。

%{F|B}{A|T}n{routname}

其中,routname為變量作用范圍名稱;%表示引用操作;F指示匯編器只向前搜索;B指示匯編器只向后搜索;A指示匯編器搜索所有宏的嵌套。T指示匯編器只搜索宏的當前層。

如果在引用過程中,沒有指定F和B,則匯編器先向后搜索,再向前搜索。

如果A和T沒有指定,匯編器搜索所有從當前層次到宏最高層次,比當前層次低的層次不再搜索。

如果指定了routname,匯編器向前搜索最近的ROUT操作,若routname與該ROUT偽操作定義的名稱不匹配,匯編器報告錯誤并結束匯編。

10.3.3匯編語言程序中的表達式和運算符

在匯編語言程序設計中經(jīng)常使用各種表達式,表達式一般由變量、常量、運算符和括號構成。常用的表達式有數(shù)字表達式、邏輯表達式和字符串表達式。

下面分別介紹表達式中各元素。

1.字符串表達式

字符串表達式一般由字符串常量、字符串變量、運算符和括號構成。字符串由包含在雙引號內的一系列字符組成。編譯器所支持的字符串最大長度為512字節(jié)。

當在字符串中包含“$”或引號時,可以用“$$”表示“$”,用兩個雙引號表示一個雙引號。

例如:

abcSETS"one""doublequote"

defSETS"one$$dollarsymbol"

上面的例子分別將字符串abc和def賦值為“one"doublequote”和“one$dollarsymbol”。

字符串可以通過SETA、SETL、SETS偽操作對其賦值。

常用的與字符串表達式相關的運算符如下。

·LEN:計算字符串長度運算符。

·CHR:ASCII碼轉換運算符。

·STR:字符串轉換運算符。

·LEFT:字符串取左運算符。

·RIGHT:字符串取右運算符。

·CC:字符串連接運算符。

詳見后面操作符一節(jié)。

下面的例子說明了如何使用字符串操作符給字符串變量賦值。

improbSETS"literal":CC:(strvar2:LEFT:4)

這個例子將字符串賦值為“literalatrv”。

2.整數(shù)表達式

整數(shù)表達式一般由數(shù)字常量、數(shù)字變量、數(shù)字運算符和括號構成。

整數(shù)表示式可以包含寄存器相關(register-relative)或程序相關(program-relative)表達式,這些表達式在編譯時被匯編器翻譯為地址無關數(shù)字常量。

整數(shù)表達式一般被計算為32位的整數(shù),當此整數(shù)被定義為無符號數(shù)時,其取值范圍為0~232-1,當被定義為有符號數(shù)時,其取值范圍為-231~231-1。匯編器認為-n和232-n是相等的。對于關系操作,如比較兩個數(shù)的大小,匯編器將其操作數(shù)看作無符號的數(shù),也就是說“0>-1”對匯編器來說取值為“假({FLASE})”。

下面的例子說明了在程序中,如何對整數(shù)表達式進行操作。

aSETA256*256;將數(shù)字變量賦值為256*256

MOVr1,#(a*22);將數(shù)字表達式(a*22)的值放入r1

匯編語言中,整數(shù)數(shù)字量有以下幾種形式。

·十進制數(shù)(decimal-digis)

·“0x”+十六進制數(shù)(0xhexadecimal-digits)

·“&”+十六進制數(shù)(&hexadecimal-digits)

·n進制數(shù)(n_base-n-digits)

·字符(character)

其中,十進制數(shù)(decimal-digis)可以是“0”到“9”數(shù)字的任意組合;十六進制數(shù)(hexadecimal-digits)可以是“0”到“9”數(shù)字和字母“A”到“F”的任意組合;“n_”可以取2到9,“base-n-digits”是在n進制下合法的任意數(shù)值;字符(character)可以是除單引號以外的所有字符。

下面的例子說明了整數(shù)表達式的基本用法。

aSETA34906

addrDCD0xA10E

LDRr4,=&1000000F

DCD2_11001010

c3SETA8_74007

DCQ0x0123456789abcdef

LDRr1,='A' ;ARM偽指令將整數(shù)65(A的ASCII碼)存入寄存器

ADDr3,r2,#'\'' ;將整數(shù)39(字符“/”的ASCII碼)加到r2,結果存入r3

3.浮點數(shù)字量表達式

浮點數(shù)字量有以下幾種形式。

·{-}digitsE{-}digits。

·{-}{digits}.digits{E{-}digits}。

·0xhexdigits。

·&hexdigits。

其中,digits為十進制數(shù),要在其后加上字母E(大寫或小寫)來表示其指數(shù);hexdigits為十六進制數(shù)。

單精度浮點數(shù)的表示范圍為1.17549435e−38~3.40282347e+38;雙精度浮點數(shù)的表示范圍為2.22507385850720138e-308~1.79769313486231571e+308。

下面的例子說明了浮點數(shù)據(jù)量的基本用法。

DCFD1E308,-4E-100

DCFS1.0

DCFD3.725e15

LDFS0x7FC00000;

LDFD&FFF0000000000000;

4.邏輯表達式

邏輯表達式一般由邏輯量、邏輯運算符和括號構成,其表達式的運算結果為真或假。與邏輯表達式相關的運算符有“=”、“>”、“<”、“>=”、“<=”、“/=”、“<>”運算符和“LAND”、“LOR”、“LNOT”及“LEOR”運算符。

5.程序或寄存器相關表達式

寄存器相關表達式的值等于指定寄存器的值加上或減去一個數(shù)字表達式。

程序相關表達式的值等于程序計數(shù)器PC的值加上或減去一個數(shù)字表達式的值。此種表達式通常由程序中的標號與一個數(shù)字表達式組成。

下面的例子說明了程序或寄存器相關表達式的基本使用方法。

LDRr4,=data+4*n ;n是匯編時取值變量

;code

MOVpc,lr

dataDCDvalue0

;n-1個DCD偽操作

DCDvaluen ;data+4*n指向此

;更多DCD偽操作

6.匯編中的操作符

(1)操作符的優(yōu)先級

在匯編語言程序設計中,表達式包含一個擴展的操作符集,這些操作符和高級語言中的運算符十分接近。其運算次序遵循如下的優(yōu)先級。

①優(yōu)先級相同的雙目運算符的運算順序為從左到右。

②相鄰的單目運算符的運算順序為從右到左,單目運算符的優(yōu)先級高于其他運算符。

③括號運算符的優(yōu)先級最高。

匯編語法的操作符優(yōu)先級和C語言中的不完全相同。例如在匯編中,下面的匯編語言

(1+2∶SHR∶3)相當于(1+(2∶SHR∶3)),而在C語言中,運算則變?yōu)椋ǎ?+2)>>3)=0。類似于這樣的操作,在使用時要特別注意。

注意

為了保證表達式運算結果的正確,建議使用“()”來避免異義。

表10.4列出了匯編操作符的優(yōu)先級以及對應的C語言運算符。

表10.4 匯編操作符優(yōu)先級

匯編操作符

C語言運算符

單目運算

單目運算

*/:MOD:

*/%

字符串操作

n/a

:SHL::SHR::ROR::ROL:

<<>>

+-:AND::OR::EOR:

+-$|

=>>=<<=/=<>

==>>=<<=!=

:LAND::LOR::LEOR:

&&||

說明

表10.3是按操作符的優(yōu)先級從上到下排列的。

C語言運算符優(yōu)先級從高到低排列如下。

·單目運算

·*/%

·+-(asbinaryoperators)

·<<>>

·<<=>>=

·==!=

·&

·^

·|

·&&

·||

(2)單目運算

最高優(yōu)先級的單目運算在表達式中最先被計算。單目操作符寫在操作數(shù)的前面。運算順序為從右到左。

表10.5列出了匯編中單目運算操作符及其返回值。

表10.5 匯編中單目運算操作符及其返回值。

操作符

使用

描述

:CHR:

:CHR:A

返回字母A的ASCII碼

:LOWERCASE

:LOWERCASE:string

將給定字符串中的所有大寫字母變成小寫

REVERSE_CC

:REVERSE_CC:cond_code

對條件碼取反

:STR:

:STR:A

將一個數(shù)字量或邏輯表達式轉換成串

:UPPERCASE:

:UPPERCASE:string

將給定字符串中的所有小寫字母變成大寫

?

?A

返回定義符號A的代碼行所生產代碼行的字節(jié)數(shù)

續(xù)表

操作符

使用

描述

+和-

+A和-A

單目加和單目減,操作數(shù)為數(shù)學或程序相關表達式

:BASE:

:BASE:A

如果A是程序或寄存器相關表達式,:BASE:返回基址寄存器的編號

:CC_ENCODING:

:CC_ENCODING:cond_code

返回條件碼中的數(shù)字值

:DEF:

:DEF:A

判斷A是否被定義,如果被定義返回{TRUE};如果沒有定義返回{FALSE}

:INDEX:

:INDEX:A

如果A是寄存器相關表達式,:INDEX:返回A相對于寄存器的偏移量,常用在宏操作中

:LEN:

:LEN:A

字符串A的長

:LNOT:

:LNOT:A

邏輯表達式A的值取反

:NOT:

:NOT:A

~A

A的值按位取反

:RCONT:

:RCONT:Rn

返回寄存器編號,0~15對應寄存器r0~r15

(3)雙目運算

ARM匯編中將雙目運算符放在兩個操作數(shù)中間。一般情況下,雙目運算的優(yōu)先級低于單目運算。下面將以操作符的優(yōu)先級為序分別介紹各操作符。

注意

操作符的優(yōu)先級與C語言中操作符優(yōu)先級順序略有不同,詳見單目運算一節(jié)。

表10.6列出了乘法相關操作符。

表10.6 乘法相關操作符

操作符

別名

使用

說明

*

A*B

乘法操作

/

A/B

除法操作

:MOD:

%

A:MOD:B

以B為除數(shù)對A取模

乘法相關操作符包括乘、除、取模運算,在雙目運算中具有最高優(yōu)先級。這些運算的操作數(shù)只能是數(shù)字表達式。

表10.7列出了字符串相關操作符。

表10.7 字符串操作符

操作符

使用

說明

:CC:

A:CC:B

連接兩個字符串

:LEFT:

A:LEFT:B

返回字符串A最左端B長度的字符,操作數(shù)A必須為字符串,B必須為整數(shù)表達式

:RIGHT:

A:RIGHT:B

返回字符串A最右端B長度的字符,操作數(shù)A必須為字符串,B必須為整數(shù)表達式

表10.8列出了移位操作符。移位操作中兩個操作數(shù)均為數(shù)字表達式。

表10.8 移位操作符

操作符

別名

使用

說明

:ROL:

A:ROL:B

A循環(huán)左移B位

:ROR:

A:ROR:B

A循環(huán)右移B位

:SHL:

<<

A:SHL:B

A左移B位

:SHR:

>>

A:SHR:B

A右移B位

注意

SHR是邏輯右移,不影響符號位。

表10.9列出了所有加、減、邏輯操作符。

表10.9 加減運算操作符

操作符

別名

使用

說明

+

A+B

A加上B

A−B

從B中減去A

:AND:

&&

A:AND:B

A和B按位與

:EOR:

^

A:EOR:B

A和B按位異或

:OR:

||

A:OR:B

A和B按位或

加、減運算的操作數(shù)均為數(shù)字表達式。邏輯運算的表達式為數(shù)字表達式,此運算按位操作產生結果。

表10.10列出了ARM匯編中的關系符。關系操作符用于表示兩個同類表達式之間的關系。關系符的兩個操作數(shù)必須為同種類型的操作數(shù)。操作數(shù)可以是數(shù)字變量、程序相關表達式、寄存器相關表達式或字符串。

表10.10 關系操作符

操作符

別名

使用

說明

=

==

A=B

判斷A是否等于B

>

A>B

判斷A是否大于B

>=

A>=B

判斷A是否大于等于B

<

A<B

判斷A是否小于B

<=

A<=B

判斷A是否小于等于B

/=

<>

!=

A/=B

判斷A是否不等于B

表10.11列出了匯編語言中的邏輯操作符。邏輯操作符進行兩個邏輯表達式之間的基本邏輯操作。操作的結果為{FALSE}或{TURE}。

表10.11 邏輯操作符

操作符

使用

說明

:LAND:

A:LAND:B

A和B做邏輯與

續(xù)表

操作符

使用

說明

:LEOR:

A:LEOR:B

A和B做邏輯異或

:LOR:

A:LOR:B

A和B做邏輯或

10.3.4匯編語言預定義寄存器和協(xié)處理器

ARM匯編器對ARM的寄存器和協(xié)處理器進行了預定義(包括APCS對r0~r15寄存器的定義),所有的寄存器和協(xié)處理器名都是大小寫敏感的。

1.預定義寄存器名

下面列出了被ARM匯編器預定義的寄存器名。

·r0~r15和R0~R15(15個通用寄存器)。

·a1~a4(參數(shù)、結果或臨時寄存器,同r0~r3)。

·v1~v8(變量寄存器,同r4~r11)。

·sb和SB(靜態(tài)基址寄存器,同r9)。

·sl和SL(棧頂指針寄存器,同r10)。

·fp和FP(幀指針寄存器,同r11)。

·ip和IP(過程調用中間臨時寄存器,同r12)。

·sp和SP(棧指針寄存器,同r13)。

·lr和LR(連接寄存器,同r14)。

·pc和PC(程序計數(shù)器,同r15)。

2.預定義程序狀態(tài)寄存器名

下面列出了ARM匯編器預定義的程序狀態(tài)寄存器的名稱。

·cpsr和CPSR(當前程序狀態(tài)寄存器)。

·spsr和SPSR(保留程序狀態(tài)寄存器)。

3.預定義的浮點寄存器名

下面列出了ARM匯編器預定義的浮點運算寄存器。

·s0~s31和S0~S31(VFP單精度浮點運算寄存器)。

·d0~d15和D0~D15(VFP雙精度浮點運算寄存器)。

注意

FPA的寄存器f0~f7和F0~F7已不再使用。

4.預定義的協(xié)處理器名

下面列出了ARM匯編器預定義的協(xié)處理器名和協(xié)處理器寄存器名。

·p0~p15(預定義的協(xié)處理器0~15的名稱)。

·c0~c15(預定義的協(xié)處理器寄存器0~15的名稱)。

10.3.5匯編語言內置變量

ARM匯編器中定義了一些內置變量,這些內置變量不能使用偽指令設置(如,SETA、SETL、SETS等),一般用于程序的條件匯編控制。

下面的例子顯示了如何使用內置變量控制程序的執(zhí)行流程。

If{CONFIG}=16;若為Thumb代碼則執(zhí)行If后的語句

;codes

else

;codes

endif

b;程序結束

下面介紹由ARM匯編器預定義的內置變量。

·{ARCHITECTURE}:選定的ARM體系結構的值,如3,3M,4,4T。

·{AREANAME}:當前段名。

·{ARMASM_VERSION}:ARM編譯器ARMASM的變量號。

·|ads$version|:ARM編譯器ARMASM的變量號,同{ARMASM_VERSION}。

·{CODESIZE}:如果當前指令為ARM指令,該內置變量取值為32,如果當前指令為Thumb指令,該內置變量取值為16,同{CONFIG}。

·{COMMANDLINE}:當前命令行內容。

·{CONFIG}:如果當前指令為ARM指令,該內置變量取值為32,如果當前指令為Thumb指令,該內置變量取值為16,同{CODESIZE}。

·{CPU}:所使用的CPU名稱。默認為ARM7TDMI。如果在編譯命令行中使用“-CPU”選項確定CPU類型,則該值為“GenericARM”。

·{ENDIAN}:如果編譯器在大端模式下,其值為“big”;如果在小端模式下,其值為“little”。

·{FPIC}:默認為{FALSE},如果設置了“/fpic”選項,其值為{TRUE}。

·{FPU}:所選fpu協(xié)處理器的名字。默認為“softVFP”。

·{INPUTFILE}:當前源文件名。

·{INTER}:默認為{FALSE},如果設置了“/inter”選項,其值為{TRUE}。

·{LINENUM}:目前源文件行號。

·{NOSWST}:默認為{FALSE},如果設置了“/noswst”選項,其值為{TRUE}。

·{OPT}:保存當前設置的列表選項。偽操作OPT用來保存當前列表選項,改變選項值,或恢復原始值。

·{PC}或“.”:當前程序地址值。

·{PCSTOREOFFSET}:指令STRpc,[...]和STMRb,{...,pc}與存儲的PC值之間的偏移量。

·{ROPI}:默認為{FALSE},如果設置了“/ropi”選項,其值為{TRUE}。

·{RWPI}:默認為{FALSE},如果設置了“/rwpi”選項,其值為{TRUE}。

·{SWST}:默認為{FALSE},如果設置了“/swst”選項,其值為{TRUE}。

·{VAR}或@:存儲區(qū)位置寄存器的當前值。

10.3.6匯編語言的程序結構

在ARM(Thumb)匯編語言程序中以程序段為單位組織代碼。段是相對獨立的指令或數(shù)據(jù)序列,具有特定的名稱。段可以分為代碼段(CodeSection)和數(shù)據(jù)段(DataSection),代碼段的內容為執(zhí)行代碼,數(shù)據(jù)段存放代碼運行時需要用到的數(shù)據(jù)。一個匯編程序至少應該有一個代碼段,當程序較長時,可以分割為多個代碼段和數(shù)據(jù)段,多個段在程序編譯鏈接時最終形成一個可執(zhí)行的映像文件。

可執(zhí)行映像文件通常由以下幾部分構成。

·一個或多個代碼段,代碼段的屬性為只讀。

·零個或多個數(shù)據(jù)段,數(shù)據(jù)段的屬性為可讀寫。數(shù)據(jù)段可是被初始化的數(shù)據(jù)段或沒有被初始化的數(shù)據(jù)段(ZI,zeroinitialized)。

鏈接器根據(jù)系統(tǒng)默認或用戶設定的規(guī)則,將各個段安排在存儲器中的相應位置。因此源程序中段之間的相對位置與可執(zhí)行的映像文件中段的相對位置一般不會相同。

以下是一個匯編語言源程序的基本結構。

AREA Init,CODE,READONLY

ENTRY

Start

LDR R0,=0x3FF5000

LDR R1,0xFF

STR R1,[R0]

LDR R0,=0x3FF5008

LDR R1,0x01

STR R1,[R0]

……

END

在匯編語言程序中,用AREA偽操作定義一個段,并說明所定義段的相關屬性,本例定義一個名為Init的代碼段,屬性為只讀。ENTRY偽操作標識程序的入口點,接下來為指令序列,程序的末尾為END偽指令,該偽操作告訴編譯器源文件的結束,每一個匯編程序段都必須有一條END偽操作,指示代碼段的結束。

10.3.7匯編語言子程序調用

在ARM匯編語言程序中,子程序的調用一般是通過BL指令來實現(xiàn)的。在程序中,使用指令“BL子程序”名即可完成子程序的調用。

該指令在執(zhí)行時完成如下操作:將子程序的返回地址存放在連接寄存器LR中,同時將程序計數(shù)器PC指向子程序的入口點。當子程序執(zhí)行完畢需要返回調用處時,只需要將存放在LR中的返回地址重新拷貝給程序計數(shù)器PC即可。在調用子程序的同時,也可以完成參數(shù)的傳遞和從子程序返回運算的結果,通??梢允褂眉拇嫫鱎0~R3完成。

注意

不同編譯器編譯的代碼間的相互調用,要遵循AAPCS(ARMArchitecture)。詳見ARM編譯工具手冊。

以下是使用BL指令調用子程序的匯編語言源程序的基本結構:

AREA Init,CODE,READONLY

ENTRY

Start

LDR R0,=0x3FF5000

LDR R1,0xFF

STR R1,[R0]

LDR R0,=0x3FF5008

LDR R1,0x01

STR R1,[R0]

BL PRINT_TEXT

……

PRINT_TEXT

……

MOV PC,BL

……

END

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉