ARM彙編中的常用指令總結

2021-07-25 14:46:40 字數 2553 閱讀 1714

資料傳送指令

mov指令

mov ,

rd目標暫存器,operand 常數/可用暫存器

例子 mov   r0, #10      ;r0 = 10;對應c語言形式

mov  r0,   r1       ;r0 = r1 

mvn指令

按位取反指令

mvn r0, #0  ;r0 = ~0

mvn r1,r2   ;r1=~r2

算術指令

add指令

add   ,   ,  

rn通用暫存器

例子 add r0,  r1,  r2     ;r0 = r1+r2

add r0,  r0,  #5   ;r0=r0+5

sub指令

sub , ,

例子 sub r0,r1,r2     ;r0 = r1-r2

sub r0,r0,#5              ;r0=r0-5

sub r1,r1,r1              ;r1=0

mul 乘法指令

mul r0,r1,r2 ;r1和r2相乘的結果傳送到r0 //r0 =r1*r2

muls r0,r1,r2 ;r1和r2相乘的結果傳送到r0,同時設定cpsr的相關條件標誌位

移位指令

lsl指令

lsl  #2  邏輯左移  

mov r0,r1,lsl #2         ;r0=r1*2^2 ,即r0=r1*4 常用於陣列定址,r1作下標

int a[5];                             ;*(a+下標*4)

lsr 指令

lsr  #2 邏輯右移

mov r0,r1,lsr #2  ;r0=r1/4

其他不常用移位指令

asr 指令 算術右移(考慮符號位) 

movs r0,r1,asr #1  ;算術右移,第一位符號位不變

rol/ror  迴圈左移迴圈右移指令

mov  r0,r1,ror #1 ; 暫存器r1迴圈右移一位後傳送到r0

比較指令

cmp指令

cmp r1 , #10 ;         將暫存器r1的值與10相減,並設定cpsr標誌位 //if(r1==10)

cmn r0,r1;             r0 - (-r1),反值比較,影響cpsr標誌位

cmn r0,#10;           r0 - (-10),反值比較,影響cpsr標誌位

跳轉指令

b  next

b是跳轉指令

資料儲存載入指令

ldr 從記憶體載入資料到暫存器

ldr rd, label

ldrd rd,rd2 ,label (一次載入64位)

是否將定址結果寫入暫存器

type取值 b無符號位元組 sb有符號位元組 h無符號半字 sh有符號半字

label 位記憶體位址

暫存器間接定址

ldr r0, [r1] ;   r0 <--[r1]    *r1 = [r1]  把以r1的   r0 = * r1 ;以r1暫存器中的數值為記憶體位址,並把這個記憶體位址的內容取出都r0暫存器

基址變址定址

ldr  r0, [r1, #4] ; r0<--[r1+4]  r0=*(r1+4) #把暫存器的內容和指令中的位址偏移量相加,從而得到乙個運算元的有效位址。

ldr  r0, [r1, #4]!;r0<--[r1+4],r1<--r1+4

ldr  r0,[r1], #4   ;r0<--r1 , r1<--r1+4

ldr  r0,[r1,r2]   ; r0<--[r1+r2]  r0 = *(r1+r2)

str 將暫存器的值寫入記憶體

str r0,[r1}  //將暫存器r0的值寫入記憶體r1

其他類似指令

位元組資料載入/儲存指令:ldrb/strb

半字資料載入/儲存指令:ldrh/strh 

有符號數字節/半字載入指令:ldrsb / ldrsh

多暫存器載入和儲存指令:

ldm / stm   批量從記憶體載入資料到暫存器列表/批量從暫存器載入資料都記憶體

ldmia r0!, ;r6 <- [r0],r7 <- [r0+4],r8 <- [r0+8],r0 <- r0+12   ia 是每載入一次r0的值加一

ldmib r0!, ;r6 <- [r0],r7 <- [r0+4],r8 <- [r0+8],r0 <- r

0+8邏輯運算指令

and指令  邏輯與指令

and r0,r0,#1 ;r0的值與1相位與後的值傳送到r0  // r0 = r0&1

orr指令 邏輯或指令

orr r0,r0,#9 ;r0的值與9相位與後的值傳送到r0 //r0 = r0||9

堆疊操作指令

stmfd sp!, ;把r4,r3,r2的值依次壓棧

ldmfd sp!, ;從sp中依此取值到r6,r7,r8

通常用來儲存子程式現場

格式stmfd sp!,

...函式**

ldmfd sp!,  

ARM彙編中的LDR指令總結

ldr只能在當前pc的4kb範圍內跳轉 b只能在當前pc的32m範圍內跳轉 label標號實際上就是個位址 eg 合法 ldr r1,r2 ldr r1,r2,0x4 不能超過0xfff,否側編譯不能通過或者linker時有錯 ldr r1,r2,label 所以這個經常是編譯不能通過,因為labe...

ARM常用彙編指令

1 gbll 偽指令用於定義乙個全域性的邏輯變數,並初始化為。gbll bootloader bootloader setl 2 get 或 include get 偽指令用於將乙個原始檔包含到當前的原始檔中,並將被包含的原始檔在當前位置進行彙編處理。可以使用 include 代替 get。incl...

基礎常用arm彙編指令

ldr 目的暫存器 儲存器位址 作用 指令從記憶體中讀出資料到暫存器中 比如 ldr r1,r2,4 將位址r2 4的記憶體單元的資料讀取到r1中 ldr r1,r2 將位址r2的記憶體單元的資料讀取到r1中。r1 r2 注意 ldr中的第二個引數為 時,表示偽指令,或者表示記憶體訪問指令 比如 l...