1. 程式人生 > >淺談ARM 彙編中的標號(Labels)

淺談ARM 彙編中的標號(Labels)

https://yq.aliyun.com/ziliao/474443

7.6 Labels

標號

在ARM彙編中,標號就是一個符號,它代表著彙編程式中指令或資料的記憶體地址。

記憶體地址可能是PC相對(PC-relative)、暫存器相對( register-relative)或絕對地址。

預設情況下,標號只在定義它的原始檔中可見,除非你使用EXPORT指示符把它的可見性改變為全域性可見。

標號所代表的記憶體地址是在原始碼被彙編時計算的。彙編時,彙編器計算從定義這個標號的節(section)

的起始點到標號之間的距離,這個距離值就表示標號的記憶體地址。在定義標號的節中引用這個標號可以使
用暫存器PC(R15)值加上或減去一個偏移量值。這就叫做PC相對定址(PC-relative addressing)。

定義在其他節(section)中的標號,它的記憶體地址是在連結的時候計算的,因為只有在連結器為程式中的

每一個節(section)在記憶體中都分配了一個特定的地址時,才能為不再同一個節中定義的標號計算它的內

存地址。

7.7 Labels for PC-relative addresses

PC 相對地址的標號

一個標號能夠表示暫存器PC(R15)的值加上或減去一個偏移量,這個偏移量就是PC與標號之間的距離。你可以使用標號作為PC相對地址來引用指令、資料定義以及節名。

使用這些標號來作為跳轉指令(branch)的目標地址,或訪問嵌入在程式碼段中的小的資料項。你可以對指令或一些資料定義指示符定義PC相對地址標號。

你可以把AREA指示符中的節名作為PC相對地址的標號來使用。在這種情況下,標號的值代表的是這個節(section)的首位元組的地址。當從ARM到Thumb或從Thumb到ARM狀態之間跳轉時,ARM不推薦使用節名來作為跳轉指令的目標地址,因為在這種情況下,處理器不能正確地進行狀態的改變。

暫存器相對地址標號

7.8 Labels for register-relative addresses

一個標號可以表示一個指定暫存器的值與一個數字值之和。你可以在儲存對映(storage map)中定義這種標號。這種標號通常用來訪問資料節(data sections)中的資料。

基於在儲存對映中定義的標號,你還可以使用EQU指示符來定義暫存器相對地址標號。

儲存對映定義示例:

        MAP    0, r9 

        MAP    0xff, r9

絕對地址標號

7.9 Labels for absolute addresses

一個標號能夠表示程式碼或資料的絕對地址。

這種標號表示的記憶體地址是範圍在0 到 2的32次冪-1之間的數字常量。這些標號表示的是記憶體的絕對地址。

你可以使用EQU指示符來定義表示絕對記憶體地址的標號。你可以為這種標號指定ARM、Thumb或資料屬性來確保在程式碼中引用它們時,這中標號能夠被彙編器正確的處理。

絕對地址標號定義示例:

         abc    EQU    2                          ; 分配數字值2給標號abc

         xyz      EQU    label+8                  ;分配地址值(label + 8)給標號xyz

         fiq       EQU    0x1C,CODE32             ;分配絕對地址值0x1C給標號fiq,並且通過屬性CODE32標誌它為程式碼

區域性數字標號

7.10 Numeric local labels

區域性數字標號是這樣一種型別的標號:你是通過數字而不是名稱進行引用。它們的用法與PC相對型標號的用法類似,但是區域性數字標號的範圍更窄。

一個區域性數字標號是一個值為0到99之間的數值,還可以在數字值後面跟上一個名稱。與其它標號不同的是,在一個節中數字標號可以被定義許多次,而且同一個數字標號可以被使用多次。

區域性數字標號不會出現在目標檔案中。這就意味著彙編偵錯程式不能在區域性數字標號上設定斷點,但彙編器可以在使用KEEP指示符保留的區域性字元命名標號上設定斷點。

在組合語言模組中的原始碼中,一個區域性數字標號可以用來代替下列情況中的以字元命名的標號:

*  原始碼行中只有標號,既沒有指令也沒有指示符

*  原始碼行中有一條指令

*  原始碼行中有一條產生指令或產生資料的指示符

區域性數字標號通在你通常會使用PC相對標號的地方。

區域性數字標號一般用在例程中迴圈和條件執行的程式碼部分,或用在僅在區域性使用的小子例程中。
當你意欲在巨集中產生標號時區域性數字標號就顯得特別地有用。

區域性數字標號的作用域範圍要受到AREA 指示符的限制。使用ROUT指示符可以更嚴格地限制區域性數字標號的作用域範圍。一個對區域性數字標號的引用指向一個在同一個範圍內的匹配的標號。如果在這個範圍內前後兩個方向上都沒有匹配的標號,那麼彙編器會產生錯誤資訊而且彙編器停止彙編操作。

你甚至能在同一個範圍內使用相同的數字值來引用不止一個區域性數字標號。預設情況下,彙編器按照如下規則來解析對一個區域性數字標號的引用:

   * 如果在這個範圍內有不止一個符合的標號,那麼彙編器選擇具有相同數字值的距離引用最近的那個數字區域性標號。

   * 如果在這個範圍內標號引用的之前處沒有匹配的標號,那麼彙編器選擇在標號引用的後面尋找具有相同數字值的匹配標號。

如果需要,可以使用可選的引數在修改標號匹配的模式。

區域性數字標號的語法格式

7.11 Syntax of numeric local labels

當引用區域性數字標號時,你可以指定彙編器如何搜尋匹配的標號。

語法格式:

n{routname} ;一個區域性數字標號

%{F|B}{A|T}n{routname} ;對一個區域性數字標號的引用

說明:

  n  是一個表示區域性數字標號的範圍在0到99之間的數字值。

  routname  是一個表示當前作用域範圍的範圍名稱。

 

  % 標誌一個對 區域性數字標號的引用。

  F  是一個指示標誌,指示彙編器只從引用處向前搜尋匹配的標號。

  B  是一個指示標誌,指示彙編器只從引用處向後搜尋匹配的標號。

  A  是一個指示標誌,指示彙編器搜尋所有級別的巨集。

  T  是一個指示標誌,指示彙編器只搜尋當前巨集。

用法:

 如果既沒有指定F也沒有指定B,那麼彙編器先從引用處先後搜尋,然後在從引用處向前搜尋。     

 如果既沒有指定A也沒有指定B,那麼彙編器從當前巨集開始逐級向頂層巨集搜尋,但是不搜尋當前巨集中的巨集。

 如果在區域性數字標號或對其引用中指定了routname,那麼彙編器根據routname檢查前置最近的ROUT指示符,如果不能正確的匹配,那麼彙編器則產生一條錯誤資訊,然後停止彙編過操作。

以上是淺談ARM 彙編中的標號(Labels)的全部內容,在雲棲社群的部落格、問答、公眾號、人物、課程等欄目也有淺談ARM 彙編中的標號(Labels)的相關內容,歡迎繼續使用右上角搜尋按鈕進行搜尋ARM彙編 ,以便於您獲取更多的相關知識。

=====================================================================
(3)符號
在ARM 彙編中,符號可以代表地址、變數、數字常量。當符號代表地址時又稱為標號,符號就是變數的變數名、數字常量的名稱、標號,符號的命名規則如下:
a. 符號由大小寫字母、數字以及下劃線組成;
b. 除區域性標號以數字開頭外,其它的符號不能以數字開頭;
c. 符號區分大小寫,且所有字元都是有意義的;
d. 符號在其作用域範圍你必須是唯一的;
e. 符號不能與系統內部或系統預定義的符號同名;
f. 符號不要與指令助記符、偽指令同名。

=====================================================================

ARM彙編中的標號
標號(LABEL)是為一組機器指令所起名字,表示程式中的指令或者資料地址的符號。標號可有可無,只有當需要用符號地址來訪問該語句時,才給此語句賦予標號。通過在目標地址的前面放上一個標號,可以在指令中使用標號來代替直接使用地址。標號是程式目標標誌,總是和某地址相聯絡,供轉移或迴圈指令控制轉移使用。 標號是編譯程式使用的,也就是說程式中最後生成的程式碼中標號都換成了相應的數值。

因標號表示是指令地址,所以它有三個屬性,即段屬性、偏移屬性和型別屬性。段屬性即段地址,標號段必須在CS中。偏移屬性是表示該標號到段首地址距離,單位是位元組,是16位無符號整數。型別屬性是距離屬性,指標號和轉移指令距離,該標號在本段內引用,距離在-128~ 127之間時稱短標號,距離屬性為SHORT,當標號在本段,距離在-32768~ 32767之間時稱近標號,距離屬性為NEAR,當引用標號指令和標號不在同一段時稱遠標號,距離屬性為FAR。

根據標號的生成方式可分為3種:

1.基於PC的標號

基於PC的標號是位於目標指令前或者程式中資料定義偽操作前的標號。這種標號在彙編時將被處理成PC值加上(或減去)一個數字常量。常用於表示跳轉指令的目標地址,或者程式碼段中所嵌入的少量資料。

2.基於暫存器的標號

基於暫存器的標號常用MAP和FIELD未定義操作,也可以該用EQU偽定義。這種標號在彙編時將被處理成暫存器的值加上(或減去)一個數據常量。常用於訪問資料段中的資料。

3.絕對地址

絕對地址是一個32位資料。它可以定址2的32次方 -1,即直接可以定址整個記憶體空間。