ARM匯編特殊符號(hào) 匯編符號(hào)引用
^---- MAP----定義結(jié)構(gòu)化內(nèi)存表----MAP 4096;內(nèi)存表首地址為4096
#----FIELD----定義內(nèi)存表中的數(shù)據(jù),結(jié)合MAP指令使用----
MAP 4096
STACKSVC FIELD 256;定義從4096開始的256字節(jié)為SVC的堆??臻g。
%----SPACE----分配一塊內(nèi)存,并用“0”初始化----DataStruc SPACE 280;分配280字節(jié)內(nèi)存并初始化
[|] ----IF ELSE ENDIF----條件編譯,有選擇的確定需要編譯的代碼IF,ELSE,ENDIF,可以嵌套使用----
IF 邏輯表達(dá)式
指令或偽指令
ELSE
指令或偽指令
ENDIF
另外還有符號(hào): $
如果在串變量前有一個(gè)$,則在匯編時(shí)編譯器將用該串變量的數(shù)值取代該串變量,如:
GBLS STR1
GBLS STR2
STR1 SETS “pen.”
STR2 SETS “This is a $STR1"
編譯后的結(jié)果是STR2的值為This is a pen.
如果$后是數(shù)字變量(與串變量區(qū)分),在匯編時(shí)編譯器將該數(shù)字變量的數(shù)值轉(zhuǎn)換成十六進(jìn)制的串,然后用該十六進(jìn)制的串取代$后的數(shù)字變量。
如果$后是邏輯變量,在匯編時(shí)編譯器將該邏輯變量替換成它的取值(T或者F)。
如果程序中需要$,則用$$來表示,編譯器將不進(jìn)行變量替換。
GBLS STR1
GBLS B
GBLA NUM1
NUM1 SETA 14
B SETS “CHANGED”
STR1 SETS “abc$$B$NUM1”
編譯結(jié)果STR1的值為:abcB0000000E。
注意:在兩個(gè)豎線“|”之間的$并不表示進(jìn)行變量替換,但如果“|”是在雙引號(hào)內(nèi),則將進(jìn)行變量替換。
使用點(diǎn)"."來表示變量名的結(jié)束。
GBLS STR1
GBLS STR2
STR1 SETS “AAA”
STR2 SETS “bbb$STR1.CCC"
編譯結(jié)果STR2值為bbbAAACCC
還有一個(gè)例外:“%”
“%”除了表示SPACE外,還可以在局部標(biāo)號(hào)中使用,具體意思見偽指令ROUT的使用示例:
◆ROUT
ROUT偽指令定義局部標(biāo)號(hào)的有效范圍,偽指令格式如下:{name} ROUT。其中 name 所定義的作用范圍的名稱。
當(dāng)沒有使用ROUT偽指令時(shí),局部標(biāo)號(hào)的作用范圍為所在段;ROUT偽令的作用范圍在本ROUT偽指令和下一個(gè)ROUT偽指令之間(指同一段中的ROUT偽指令)
偽指令應(yīng)用舉例如下:
ROUT偽指令定義局部標(biāo)號(hào)的有效范圍,偽指令格式如下:{name} ROUT。其中 name 所定義的作用范圍的名稱。
當(dāng)沒有使用ROUT偽指令時(shí),局部標(biāo)號(hào)的作用范圍為所在段;ROUT偽令的作用范圍在本ROUT偽指令和下一個(gè)ROUT偽指令之間(指同一段中的ROUT偽指令)
偽指令應(yīng)用舉例如下:
routineA ROUT ;定義局部標(biāo)號(hào)的有效范圍,名稱為routineA
......
3routineA ;routineA范圍內(nèi)的局部標(biāo)號(hào)3
3routineA ;routineA范圍內(nèi)的局部標(biāo)號(hào)3
......
BEQ %4routineA ;若條件成立,跳轉(zhuǎn)到routineA范圍內(nèi)的局部標(biāo)號(hào) 4
BEQ %4routineA ;若條件成立,跳轉(zhuǎn)到routineA范圍內(nèi)的局部標(biāo)號(hào) 4
......
BEQ %3routineA ;若條件成立,跳轉(zhuǎn)到routineA范Iq內(nèi)的局部標(biāo)號(hào) 3
BEQ %3routineA ;若條件成立,跳轉(zhuǎn)到routineA范Iq內(nèi)的局部標(biāo)號(hào) 3
......
4routineA ;routineA范圍內(nèi)的局部標(biāo)號(hào)4
4routineA ;routineA范圍內(nèi)的局部標(biāo)號(hào)4
......
otherstuff ROUT ;定義新的局部標(biāo)號(hào)的有效范圍
otherstuff ROUT ;定義新的局部標(biāo)號(hào)的有效范圍
----------------------------------------------------------------------
ADS中ARM匯編語言程序設(shè)計(jì)的符號(hào)引用規(guī)范
Error:Undefined symbols ....
找到引用符號(hào)的匯編源文件和定義符號(hào)的匯編源文件仔細(xì)檢查和對(duì)比,符號(hào)沒有寫錯(cuò),而且在引用符號(hào)之前確實(shí)把符號(hào)使用IMPORT引入了進(jìn)來。百思不得其解時(shí),突然想到在定義符號(hào)的文件中沒有對(duì)符號(hào)EXPORT。非常低級(jí)的錯(cuò)誤。
在匯編語言程序設(shè)計(jì)中,養(yǎng)成良好的編程習(xí)慣,形成良好的編碼風(fēng)格是非常重要的。這里僅根據(jù)個(gè)人習(xí)慣和體會(huì)略談一下使用ADS進(jìn)行ARM匯編語言程序設(shè)計(jì)時(shí)的符號(hào)引用規(guī)則,主要是對(duì)不同性質(zhì)的符號(hào)使用不同的引用辦法:
(1)對(duì)于寄存器地址定義以及通用的常量或符號(hào)定義(使用EQU定義),可以按類定義在一個(gè).s匯編文件中,在要使用這些定義的源文件中可使用INCLUDE將該.s匯編文件包含進(jìn)來。
這樣做的好處是:避免大量的IMPORT和EXPORT偽語句,增強(qiáng)代碼的可讀性,另外,對(duì)于多個(gè)源文件要使用許多相同寄存器地址定義或常量定義的場(chǎng)合,這樣做可以大大壓縮代碼尺寸(經(jīng)筆者實(shí)踐證實(shí))。
(2)對(duì)于代碼段的地址標(biāo)號(hào)或函數(shù)入口地址標(biāo)號(hào)(函數(shù)名),在代碼段或函數(shù)的定義處使用EXPORT輸出;在要調(diào)用該代碼段或函數(shù)的源文件中使用IMPORT將符號(hào)引入。
一定要保證IMPORT和EXPORT是成對(duì)使用的,若不EXPORT則IMPORT無效,若只EXPORT而不IMPORT也無法引用符號(hào)。
評(píng)論