ARM汇编中的常用指令总结

数据传送指令

MoV指令

MOV {cond}{s} <Rd>,<operand>

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 {cond}{s}   <Rd>,   <Rn>,   <operand>

Rn通用寄存器

例子 ADD R0,  R1,  R2     ;R0 = R1+R2

         ADD R0,  R0,  #5   ;R0=R0+5


SUB指令


SUB {cond}{s} <Rd>, <Rn>,<operand>

例子 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){pass}

CMN R0,R1;             R0 - (-R1),反值比较,影响CPSR标志位
CMN R0,#10;           R0 - (-10),反值比较,影响CPSR标志位



跳转指令

B  NEXT

...

B是跳转指令


数据存储加载指令

LDR 从内存加载数据到寄存器

LDR {type} {cond} Rd, label{!}

LDRD{cond} 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-R8} ;R6 <- [R0],R7 <- [R0+4],R8 <- [R0+8],R0 <- R0+12   IA 是每加载一次R0的值加一
LDMIB R0!,{R6-R8} ;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!,{R2-R4} ;把R4,R3,R2的值依次压栈
LDMFD SP!,{R6-R8} ;从SP中依此取值到R6,R7,R8


通常用来保存子程序现场
格式
stmfd sp!, {fp, lr}

...函数代码

ldmfd sp!,  {fp,pc}

猜你喜欢

转载自blog.csdn.net/nextdoor6/article/details/53862772