1. 程式人生 > >ARM LDR偽指令用法

ARM LDR偽指令用法

LDR偽指令

10.45 LDR pseudo-instruction


          功能:把一個32位立即數或一個32位的記憶體地址載入到一個暫存器中。

          注意:這裡描述的是LDR偽指令,而不是LDR指令


           語法:

                 

              LDR{cond}{.W} Rt, =expr
              LDR{cond}{.W} Rt, =label_expr

                                *   cond是一個可選的條件碼

                                * 

.W是可選的指令寬度說明符

                                *   Rt是要載入的暫存器

                                *   expr是一個數字表達式

                                *   label_expr是一個以標號加上或減去一個數字值形式出現的PC相對或外部地址表示式

           舉例:

           

            用法:

                     當使用LDR偽指令時:

                      *  如果表示式expr的值能用一個MOV或MVN指令進行載入,那麼彙編器就使用MOV或MVN指令。

                      *  如果不能使用MOV或MVN指令,或者使用了label_expr,彙編器就把這個常量放在文字池裡,

                         然後使用一條PC相對形式的LDR指令從文字池裡讀取這個常量。

                         注意:

                          — 以這種方式載入的記憶體地址,其值是在連結時確定的,所以這裡的程式碼不是位置獨立的。

                          — 不管連結器把包含LDR指令的節放在哪裡,指向常量的地址仍然是有效的。

                      

                     彙編器把label_expr的值放到一個文字池裡,然後使用一條PC相對形式的LDR指令把這個值

                     從文 字池裡讀取到暫存器裡。


                      如果label_expr是一個外部表示式,或不在當前節中,彙編器就在目標檔案中放置一個重定位

                      指示符。連結器在連結時會產生具體的地址。


                       如果label_expr是一個區域性的命名的(named)或數字標號,那麼彙編器在目標檔案中放置

                       一個 重定位指示符,同時為這個區域性標號產生一個符號名。具體的地址也是在連結時產生的。如果

                       這個區域性標號引用的是Thumb程式碼,則記憶體地址的Thumb位(bit 0)就會被設定。


                       從PC到記憶體池中常量值之間偏移量在ARM及32位Thumb編碼中必須在 ±4K位元組內,在16位Thumb

                       編碼中必須在0到+1K位元組範圍 內。你必須自己確保在上述有效範圍內有一個記憶體池。


                        如果被引用的標號是在Thumb程式碼中,那麼LDR偽指令設定label_expr所代表的記憶體地址的

                        Thumb位(bit 0)。

                        注意:

            在RealView Compilation Tools(RVCT) v2.2中,記憶體地址的Thumb位不會被設定。如果你有

                             依賴於這種行為的程式碼,請使用命令列選項–untyped_local_labels,強制彙編器不要設定被

                             引用的位於Thumb程式碼中的標號。


Thumb程式碼中的LDR偽指令

LDR in Thumb code

          你可以使用指令寬度說明符 .W 強制彙編器在ARMv6T2及以上的處理器上把Thumb程式碼中LDR

                  偽指令編碼為32位長。即使立即數的值能使用一個16位的MOV指令載入,或存在一個在16位PC相

                  對LDR指令範圍內的記憶體池,LDR.W總是產生一條32位的指令。


      未完待續。。。















轉自ASMARM的部落格:http://blog.csdn.net/asmarm/article/details/29546583