ARM LDR偽指令用法

2021-08-17 09:13:12 字數 1773 閱讀 7097

ldr偽指令

10.45 ldr pseudo-instruction

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

語法:

ldr rt, =expr

ldr rt, =label_expr

*cond是乙個可選的條件碼

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

*rt是要載入的暫存器

*expr是乙個數字表示式

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

舉例:

用法:

當使用ldr偽指令時:

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

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

然後使用一條pc相對形式的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)。

注意:

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

引用的位於thumb**中的標號。

thumb**中的ldr偽指令

ldr in thumb code

你可以使用指令寬度說明符.w強制彙編器在armv6t2及以上的處理器上把thumb**中ldr

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

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

未完待續。。。

**asmarm的部落格:

LDR的用法 ARM指令及偽指令

ldr指令可以從記憶體中讀取資料到暫存器中。ldr r1,r2,4 將位址為r2 4的記憶體單元資料讀取到r1中 ldr r1,r2 4 將位址為r2的記憶體單元資料讀取到r1中,然後r2 r2 4 ldr偽指令不是真實存在的指令,編譯器會把它擴充套件成真正的指令 如果該常數能用 立即數 表示,則使...

彙編偽指令注釋

彙編偽指令注釋 1 ds 預留儲存區命令 格式 標號 ds 表示式值 其功能是從指定位址開始,定義乙個儲存區,以備源程式使用。儲存區預留的儲存單元數由表示式的值決定。tmp ds 1 從標號tep位址處開始保留1個儲存單元 位元組 2 bit 定義位命令 其功能用於給字元名稱定義位位址。spk bi...

彙編偽指令注釋

1 ds 預留儲存區命令 格式 標號 ds 表示式值 其功能是從指定位址開始,定義乙個儲存區,以備源程式使用。儲存區預留的儲存單元數由表示式的值決定。tmp ds 1 從標號tep位址處開始保留1個儲存單元 位元組 2 bit 定義位命令 其功能用於給字元名稱定義位位址。spk bit p3.7 經...