1. 程式人生 > >ARM指令adr adrl ldr mov

ARM指令adr adrl ldr mov

兩個 per nbsp 如果 圖片 接下來 span 鏈接地址 ron

ADR是一條小範圍的地址讀取偽指令,它將基於PC的相對偏移的地址值讀到目標寄存器中。格式:ADR register,exper。

編譯源程序時,匯編器首先計算當前PC值(當前指令位置)到exper的距離,然後用一條ADD或者SUB指令替換這條偽指令,

例如:ADD register,PC,#offset_to_exper。

註意,標號exper與指令必須在同一代碼段。

比如:adr r0, _start ://將指定地址賦到r0中

.........

_start:
b _start

r0的值為標號_start與此指令的距離差 + PC值。

ADRL:

這是一條中等範圍的地址讀取偽指令,它將基於PC的相對偏移的地址值讀到目標寄存器中。格式:ADRL register,exper。編譯源程序時,匯編器會用兩條合適的指令替換這條偽指令。

比如:

ADD register,PC,offset1

ADD register,register,offset2

與ADR相比,它能讀取更大範圍的地址。

註意,標號exper與指令必須在同一代碼段。

接下來是LDR,首先要說兩個家夥,他們都叫LDR。

一個是LDR偽指令,一個是LDR指令,名字相同卻不是一個東西。

區分的方法就是看第二個參數,如果有等號,就是偽指令

LDR指令:

例: ldr r0, 0x12345678

是把0x12345678這個地址中的值存放到r0中。而mov不能幹這個活,mov只能在寄存器之間移動數據,或者把立即數移動到寄存器中。

LDR偽指令:

例1(立即數): ldr r0, =0x12345678

這樣,就把0x12345678這個地址寫到r0中了。所以,ldr偽指令和mov是比較相似的。只不過mov指令限制了立即數的長度為8位,也就是不能超過512。而ldr偽指令沒有這個限制。如果使用ldr偽指令,後面跟的立即數沒有超過8位,那麽在實際匯編的時候該ldr偽指令會被轉換為mov指令。

例2(標號): ldr r0, =_start //將指定標號的值賦給r0

這裏取得的是標號_start的絕對地址,這個絕對地址(運行地址)是在鏈接的時候確定的。它要占用 2 個32bit的空間,一條是指令,另一條是文字池中存放_start 的絕對地址。

對比adr r0, _start和 ldr r0, =_start

它們的目的一樣,都是把標簽的賦給r0,區別---左邊是相對地址,右邊絕對地址。目的一樣,但結果不一定相同。結果是否相同,要看PC值是否和鏈接地址相同。

轉自百問網

技術分享圖片

ARM指令adr adrl ldr mov