adr adrl ldr mov總結整理

http://comm.chinaaet.com/adi/blogdetail/38605.html

   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的值,是否和鏈接地址相同了。PC值,以及鏈接地址,我想在下一篇博客中討論~~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章