記憶體訪問指令:ldr和str
一般的指令都是對暫存器的操作,不能直接對記憶體進行操作,而ldr和sdr可以,也就是說只有ldr和str是對記憶體的操作指令,對記憶體的訪問只能用ldr和str:
ldr — load from memory into a register
str — store from a register into memory
應用示例:
ldr r0, [r1]
//將r1中的值存到r0中
ldr r1, [r2, #16]
//將(r2+16)位址中的內容存到r1中
ldr r1, [r2], #4
//將r2位址中的內容存到r1中,同時r2=r2+4
str r1, [r2]
//將r1中的值存到r2所指定的位址中
str r1, [r2, #4]
//將r1中的值存到r2+4所指定的位址中
str r1, [r2], #4
//將r1中的值存到r2所指定的位址中, 同時r2=r2+4
ldr偽指令
ldr 指令當它的第二個引數前面有」=」 時,表示大範圍的位址讀取偽指令,否則表示記憶體訪問指令。為何要用ldr偽指令,因為32位的機器碼有一部分位用來表示指令等其他資訊,剩下的一部分位才去表示運算元,因此mov指令後只能跟簡單的運算元,故在運算元複製時用ldr偽指令,在編譯的時候處理替換為實際的彙編指令。
如果是簡單的立即數,那麼在彙編時會用mov指令替換偽指令,如:
ldr r0, =0x48000000
->
33f80030: e3a00312 mov r0, #1207959552 ; 0x48000000
如果是複雜的立即數,那麼在彙編時會先將這個數存在記憶體中,然後用記憶體訪問指令替換偽指令,如:
ldr r0, =0x4c000014
->
33f800ac: 4c000014 .word 0x4c000014
33f8000c: e59f0098 ldr r0, [pc, #152] ; 33f800ac
程式狀態暫存器指令:msr和mrs
在arm處理器中,提供了兩條可以直接控制程式狀態暫存器的指令msr和mrs指令,可以對狀態暫存器cpsr和spsr進行操作。
①、mrs:用於將程式狀態暫存器的內容讀寫到通用暫存器中。
mrs指令的格式為:
mrs 通用暫存器,程式狀態暫存器(cpsr或spsr)
示例:
mrs r1, cpsr
// 將cpsr狀態暫存器讀取,儲存到r1中
mrs r2, spsr
//將spsr狀態暫存器讀取,儲存到r2中
②、msr:用於將運算元的內容讀寫到程式狀態暫存器的特定域中。
msr指令的格式為:
msr 程式狀態暫存器(cpsr或spsr)_《域》,運算元
其中,《域》用於設定程式狀態暫存器中需要操作的位,32位的程式狀態暫存器可分為4個域:
位[31:24]為條件標誌位域,用f表示;
位[23:16]為狀態位域,用s表示;
位[15:8]為擴充套件位域,用x表示;
位[7:0]為控制位域,用c表示;
示例:
msr cpsr, r0
//讀r0的內容寫到cpsr
msr spsr, r0
//讀r0的內容寫到spsr
msr cpsr_c, r0
//讀r0的內容到cpsr,但僅僅修改cpsr中的控制位域
and、orr、eor、bic
①、邏輯與指令:and
指令的語法格式:
and {} , ,
將暫存器的值與第二源運算元
的值按位做「邏輯與」操作,結果儲存到
中。
②、邏輯或指令:orr
指令的語法格式:
orr {} , ,
將暫存器的值與第二源運算元
的值按位做「邏輯或」操作,結果儲存到
中。
③、邏輯異或指令:eor
指令的語法格式
eor {} , ,
將暫存器的值與第二源運算元
的值按位做「異或」操作,相同為0,相異為1,結果儲存到
中。
④、位清零指令:bic
指令的語法格式:
bic {} , ,
將暫存器的值與第二源運算元
的值的反碼按位做「邏輯與」操作,結果儲存到
中。
示例:
bic r0, r0, #0x1011
//清除r0中位0、1和3,其餘位保持不變
協處理器指令mcr和mrc
①、mcr:將arm暫存器的值傳送到協處理暫存器cpu_num中。
指令的語法格式:
mcr {} , , , , ,
其中:
:指定協處理器的編號,標準的協處理器的名字為p0,p1,…,p15;
:指定協處理器執行的操作碼,確定哪乙個協處理器指令將被執行;
:確定哪乙個arm暫存器的數值將被傳送;
:確定包含第乙個運算元的協處理器暫存器;
:確定包含第二個運算元的協處理器暫存器;
:指定協處理器執行的操作碼,確定哪乙個協處理器指令將被執行,通常與
配合使用。
指令示例:
mcr p14, 1, r7, c7, c12, 6
//將arm暫存器r7中的值傳送到協處理器p14的暫存器c7中,第乙個運算元opcode_1=1,第二個運算元opcode_2=6
②、mrc:將協處理暫存器cpu_num暫存器中的值傳送到arm暫存器中。
指令的語法格式:
mrc {} , , , , ,
其中:
:指定協處理器的編號,標準的協處理器的名字為p0,p1,…,p15;
:指定協處理器執行的操作碼,確定哪乙個協處理器指令將被執行;
:確定協處理器暫存器的數值將被傳送哪乙個arm暫存器;
:確定包含第乙個運算元的協處理器暫存器;
:確定包含第二個運算元的協處理器暫存器;
:指定協處理器執行的操作碼,確定哪乙個協處理器指令將被執行,通常與
配合使用。
指令示例:
mrc p15, 5, r4, c0, c2, 3
//協處理器源暫存器c0和c2,目標暫存器為arm暫存器r4,第乙個運算元opcode_1=5,第二個運算元opcode_2=3
stmib和ldmia
stmib r0!,
//是指將r1,r2的值儲存到r0指向的儲存單元中(r0自動加1)
ldmia r0!,
//是指將r0指向的單元中的資料讀出到r1,r2中(r0自動加1)
arm指令 ldr指令
ldr指令ldr作為指令 偽指令在arm彙編中。ldr指令格式 ldr 目的暫存器,儲存器位址 ldr r0,r1 將儲存器位址為r1的字資料讀入暫存器r0。ldr r0,r1,r2 將儲存器位址為r1 r2的字資料讀入暫存器r0。ldr r0,r1,8 將儲存器位址為r1 8的字資料讀入暫存器r0...
ARM彙編指令
b或bl指令引起處理器轉移到 子程式名 也就是位址 處開始執行,這兩個指令都是相對跳轉指令。兩者的不同之處在於bl指令在轉移到子程式執行之前,將其下一條指令的位址拷貝到r14 lr,鏈結暫存器 由於bl指令儲存了下條指令的位址,因此使用指令 mov pc lr 即可實現子程式的返回。而b指令則無法實...
ARM指令縮寫
adcadd wihc t arry,包含旗標位元的算術加法指 包含旗標位元的算術加法指 addadd,算術加法指 andlogical and,輯and運算指 bbranch,跳躍指 bicbit clear,位元清除指 blbranch with link with link,包含返回的跳躍指 ...