2、 GNU彙編程序中的標號symbol(或label)
標號只能由a~z,A~Z,0~9,“.”,_等(由點、字母、數字、下劃線等組成,除局部標號外,不能以數字開頭)字符組成。
Symbol的本質:代表它所在的地址,因此也可以當作變量或者函數來使用。
l 段內標號的地址值在彙編時確定;
l 段外標號的地址值在連接時確定。
Symbol的分類:3類(依據標號的生成方式)。
<1> 基於PC的標號。基於PC的標號是位於目標指令前的標號或者程序中數據定義僞操作前的標號。這種標號在彙編時將被處理成PC值加上(或減去)一個數字常量,常用於表示跳轉指令”b”等的目標地址,或者代碼段中所嵌入的少量數據。
<2> 基於寄存器的標號。基於寄存器的標號常用MAP和FIELD來定義,也可以用EQU來定義。這種標號在彙編時將被處理成寄存器的值加上(或減去)一個數字常量,常用於訪問數據段中的數據。
<3> 絕對地址。絕對地址是一個32位數據。它可以尋址的範圍爲[0,232-1]即可以直接尋址整個內存空間。
特別說明:局部標號Symbol
局部標號主要在局部範圍內使用,而且局部標號可以重複出現。它由兩部組成:開頭是一個0-99直接的數字,後面緊接一個通常表示該局部變量作用範圍的符號。局部變量的作用範圍通常爲當前段,也可以用ROUT來定義局部變量的作用範圍。
局部變量定義的語法格式:N{routname}
l N:爲0~99之間的數字。
l routname:當前局部範圍的名稱(爲符號),通常爲該變量作用範圍的名稱(用ROUT僞操作定義的)。
局部變量引用的語法格式:%{F|B}{A|T}N{routname}
l %:表示引用操作
l N:爲局部變量的數字號
l routname:爲當前作用範圍的名稱(用ROUT僞操作定義的)
l F:指示編譯器只向前搜索
l B:指示編譯器只向後搜索
l A:指示編譯器搜索宏的所有嵌套層次
l T:指示編譯器搜索宏的當前層次
例:使用局部符號的例子,一段循環程序
1:
subs r0, r0, #1 @每次循環使r0=r0-1
bne 1F @跳轉到1標號去執行
注意:
l 如果F和B都沒有指定,編譯器先向前搜索,再向後搜索
l 如果A和T都沒有指定,編譯器搜索所有從當前層次到宏的最高層次,比當前層次低的層次不再搜索。
l 如果指定了routname,編譯器向前搜索最近的ROUT僞操作,若routname與該ROUT僞操作定義的名稱不匹配,編譯器報告錯誤,彙編失敗。