ARM指令蒐集

2021-07-13 04:16:05 字數 3861 閱讀 6118

記憶體訪問指令: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,包含返回的跳躍指 ...