adr adrl ldr mov總結整理

2021-07-10 03:22:47 字數 1252 閱讀 5579

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

總結之總結

這週都在為前一段時間的工作進行總結,雖然沒有時間壓力,但是還是讓我感覺煩惱,特別是在開始階段,面對一堆資料無從下手,時間過半,還是沒有清晰的思路。現在總結雖然寫完了,但還是有些不爽,想在這裡吐吐槽,希望日後的總結工作能夠更加順利一些。現在回想起來,在總結開始的時候,我有幾個疑惑,這次總結的目標是什麼...

總結 C 總結!!!

基礎 引數列表 c語言 沒有引數 可傳可不傳 c 沒有引數 傳參會報錯,但是c 支援預設引數 注 預設引數一般放在函式的宣告位置,不可以在宣告和定義的地方同時出現預設值。2 函式過載 靜態多型 概念 在同一作用域內,含有幾個函式名相同,引數列表不同 引數的個數 型別 次序 與返回值無關的函式。3 明...

總結 寒假總結

本來說就是個10天的假期都閒的不得了呢。怎麼一下子就放了這麼久啊。大概反思一下情況吧。作息時間 大概是每天11點多一點就睡覺了,主要是我自己熬不了夜太困了 然後白天的精神還是不錯的。聽 dy 講題。收穫也不小,思路開闊了一些,而且見識到一些牛逼的思維題。然後回放看的也蠻認真的,大概屬於之前會的不用看...