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]
實驗驗證:
執行第一條指令(MOV r1,0x35000)後寄存器的狀態值
當前內存狀態
執行第二條指令(LDR r0,[r1])後寄存器狀態
能夠看到r0寄存器的值已經變成上面內存地址爲0x35000處內存的內容了。因爲內存中數據的存儲是有大小端問題的,因此看上去不同實際是同樣的值。
此時寄存器狀態
r0保存着地址爲0x35000的存儲器中的數值,r1當即數賦值0x35000,r2當即數賦值0x34000。
此時內存狀態
STR r0,[r2]指令執行完以後,0x34000處狀態
該處值已經修改成寄存器r0的值。
LDR和STR指令說明:
LDR 目的寄存器,【存儲器地址】
用於從存儲器地址處獲取一個32位的數據送至目的寄存器,當程序計數器PC被當作目的寄存器時,存儲器中取到的數據被當作跳轉的目的地址來使用,從而實現程序的跳轉。
STR 源寄存器,【存儲器地址】
用於將源寄存器中的數據送入存儲器地址處。