Arm汇编指令集

跳转指令:1:使用专门的跳转指令
2;直接修改PC寄存器的值为跳转地址值 ,从而实现跳转
MOV LR PC //先把pc值保存起来到LR,返回的时候能找到
MOV PC 0x232233

跳转指令
B 指令的格式: B{条件} 目的地址
B指令是最简单的跳转指令
B label 有去无回,不能返回
BL 指令的格式
BL的指令和B差不多,唯一不同的是,在跳转之前会在寄存器R14中保存当先pC的值
和前面说的效果是一样的 ,比他简单。一个指令就实现了前面两条指令,能返回

BLX 目标地址
比BL多出的功能是,X是用来切换ARM指令集和Tumbe指令集,之间的切换

 

数据处理指令分为几种 {}的意思是可以有可以没有 S的意思是可能会影响CPSR状态寄存
器 一般不加S
1,数据的传递指令 MOV {条件}{S} 目的寄存器 源操作数
MOV R1,R0
MOV PC,R14
MOV R1,R0,LSL#3


MVN指令 MVN {}{} 目的寄存器 源操作数
MVN R0 , #0xff 把Oxff按位取反,之后放进R0里面去


比较指令 CMP指令
CMP{} 操作数1 操作数2
比较指令 不存储结果 但是影响CPSP的状态


TST指令 TST{}{}操作数1 操作数2
两个操作数之间的安位与操作运算 根据结果去更新CPSR中条件标志位的值

TST R1,#%1 %的意思是二进制的意思

ADD{}{} 目的寄存器 操作数1 操作数2
ADD R0,R1,R3


SUB{}{}目的寄存器 操作数1 操作数2 操作数1减去操作数2


AND{}{}目的寄存器 操作数1 操作数2
用于在两个操作数之间做逻辑与

ORR 逻辑或运算

BIC指令 清零指令 把Rn的某些位清零
BIC {}{} Rd,Rn,operand2
Bic指令用于清除Rn中的某些位,并把结果存放在Rd中,operand2是掩码位,掩码位哪个位
1.清除哪个


MUL指令 乘法指令
MUL{}{}目的寄存器 操作数1 操作数2

 

 

ARM程序状态寄存器访问指令
MRS指令 MOV不能访问程序状态寄存器 只能访问通用寄存器
MRS{条件} 通用寄存器,程序状态寄存器(CPSR或者SPSR)
MRS指令是值将程序状态寄存器的内容传送到通用寄存器当中去
MRS R0,CPSR

MSR指令和MRS正好相反 是值传到程序状态寄存器中去
MSR CPSR ,R0
有域的概念
位31:24 条件标志位域 用f表示 23 16 位状态域 用s表示
位15:8 位扩展位域 用x表示 7 0 位控制位域 用c表示

MSR CPSR_c ,R0 ;传送R0的内容到SPSR,但仅仅修改CPSR的控制位域


加载/存储指令 访问内存 内存和寄存器之间的通讯

LDR {} 目的寄存器 <存储器地址>
LDR用于从存储器中将一个32位的字数据传送到目的寄存器中,

LDR R0 ,[R1] R1寄存器放的是内存的地址
LDR R0 ,[R1,R2]
LDR R0, [R1,#8]
LDR R0 ,[R1,R2]! R1+R2放入到R0中,并且将新地址写入R1


LDRB 这个是一个8位的数据取出来存放到寄存器中
LDRH 是吧一个16位的数据取出来放在寄存器

STR把寄存器中的数据存到内存当中的指令
STR {}源寄存器 《存储器地址》

STR R0,【R1】,#8


上面的只是一次加载 存储一个单元 下面的是操作一片
LDM{条件}{类型} 基址寄存器{!}, {^}

STM{}{}基址寄存器{!},{^}
这两个指令主要用于有基址寄存器所指示的一片连续存储器到寄存器列表所表示的多个寄存
器之间传送数据

STMFD R13!,{R0,R4-R12,LR}
把这些寄存器的值存入堆栈
LDMFD R13! ,{R0,R4-R12,LR}
从堆栈内容恢复到寄存器中

 

数据交换指令
SWP 字数据的交换 SWP {条件}目的寄存器 ,源寄存器存器2】、
就是交换
例如
SWP R0,R1,【R2】 先把R2放进R0 之后把R1放进R2


SWPB 字节数据的交换


LSL移位指令
ROR移位指令,左端用右端移出的位填进去


异常产生指令
SWI 软件中断
BKPT 断点中断指令

 


ARM的伪指令

符号定义伪指令
GBLA GBLL GBLS 定义全局变量
LCLA LCLL LCLS 局部变量
SETA SETL SETS 对变量赋值

语法格式
GBLA GBLL GBLS 全局变量名
数字变量 逻辑变量 字符串变量
GBLA test1
test1 SETA 0xaa 对变量赋值

RLIST定义寄存器列表
RegList RLIST {R0-R5,R8,R10}


DCB指令
分配一片连续的字节存储单元,并用伪指令中指定的表达式初始化
标号 DCB 表达式
Str DCB “this is a test”

SPACE指令
标号 SPACE 表达式
分配大小
Dataspace SPACE 100 分配一个连续空间100字节的空间


MAP指令

MAP 表达式 {, 基址寄存器}

MAP 0x100,R0


FILED指令
分段用的和MAp使用
MAP 0x100
A FIELD 16
B FIElD 32


汇编控制伪指令

IF指令
IF逻辑表达式
ELSE
ENDIF

WHILE指令

AREA 段名 属性1 属性2
AREA Init CODE ,READONLY 属性都有DATA CODE READONLY ALIGN


CODE16 通知编译器 下面的代码为thumb指令
CODE32

ENTRY指令 是用于指定汇编程序 的入口点


EQU指令
EQU 表达式 {,类型} 类似于C语言的宏定义

test ETU 50


EXPORT指令
EXPORT 标号
用于程序中声明一个全局的标号,其他文件也能使用了,类似于extern C语言中的

IMPORT指令
导入 和EXPORT一起使用

END指令 代表程序的结束

 

 

 

 

 

 

posted on 2014-04-22 17:28  Darren715  阅读(714)  评论(0编辑  收藏  举报

导航