ARM寄存器的8種尋址方式01

1、當即數尋址 .net

操做數由指令自己給出 ip

MOV r0,#0x0F //是全部尋址方式裏面速度最快的,可是受到合法當即數的限制 內存

當即數要求以#和$開頭 get

十六進制,#後跟0x;十進制,#後直接加;八進制,#後跟0;二進制,#後跟0b it

什麼是合法當即數?ARM中要求當即數是一個8位的常數循環左移偶數位獲得的數值。也就是說只要是在0x00~0xFF中的一個數,或者是在這個區間中的一個數循環左移偶數位的數值,都是合法當即數。 cli

給你們一個快速判斷方法: 循環

1、若是該數在0x00~0xFF之間,它是一個合法當即數; 二進制

2、若是該數>0xFF,先把它換算成十進制數,若是能被4整除,它就是一個合法當即數,不然是一個非法當即數。 程序

2、寄存器尋址 方法

利用寄存器中的數值做爲操做數進行操做

ADD r0,r1,r2

MOV r0,r1

是速度僅次於當即數尋址的操做。

3、寄存器移位尋址

操做數由寄存器中的數值移位獲得,移位的方式由助記符的形式給出,移位數能夠是一個當即數也能夠是一個寄存器數值

MOV r1,#7

MOV r2,#1

MOV r0,r1,r2,LSL #2

4、寄存器間接尋址

把寄存器中的值當作是被操做的數值在存儲器中的地址,操做數自己放在寄存器中。

LDR r0,[r1]

STR r0,[r1]

實驗驗證:

clip_image002

執行第一條指令(MOV r1,0x35000)後寄存器的狀態值

clip_image004

當前內存狀態

clip_image006

執行第二條指令(LDR r0,[r1])後寄存器狀態

clip_image008

能夠看到r0寄存器的值已經變成上面內存地址爲0x35000處內存的內容了。因爲內存中數據的存儲是有大小端問題的,因此看上去不同實際是同樣的值。

clip_image010

此時寄存器狀態

clip_image012

r0保存着地址爲0x35000的存儲器中的數值,r1當即數賦值0x35000,r2當即數賦值0x34000。

此時內存狀態

clip_image014

clip_image016

STR r0,[r2]指令執行完以後,0x34000處狀態

clip_image018

該處值已經修改成寄存器r0的值。

LDR和STR指令說明:

LDR 目的寄存器,【存儲器地址】

用於從存儲器地址處獲取一個32位的數據送至目的寄存器,當程序計數器PC被當作目的寄存器時,存儲器中取到的數據被當作跳轉的目的地址來使用,從而實現程序的跳轉。

STR 源寄存器,【存儲器地址】

用於將源寄存器中的數據送入存儲器地址處。

相關文章
相關標籤/搜索