ARM汇编指令
来源:互联网 发布:淘宝中小卖家生存现状 编辑:程序博客网 时间:2024/04/28 13:10
ARM汇编指令
ARM处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令6大指令。
1.数据处理指令
1)数据传送指令
2) 算术逻辑运算指令
3)比较指令
==>数据处理指令,按照寻找方式分类(主要掌握三类)
1)立即数寻址
2)寄存器寻址
3)寄存器偏移寻址
2)寄存器寻址
3)寄存器偏移寻址
数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。比较指令CMP、CMN、TST和TEQ不需要后缀S,它们会直接影响状态标志。
常见指令集:
数据传送指令
例:
mov r1,r2 ;将寄存器 R0 的值传送到寄存器 R1
mov r0,#0x3 ; r0 = 0x3
mov r1,r0 ; r1 = r0
mov r1, r0 ,lsl #3 ;将寄存器 R0 的值左移 3 位后传送 到R1 。
MOVS R2,#0x10 ;R2= #0x10,并影响标志位。
MVNS R2,#0xFF ;R2=0Xffff00,并影响标志位。
MVN R0 ,#0;将立即数 0 取反传送到寄存器 R0 中,完成后R0=-1。
算术运算指令
ADD +
SUB -
======>最常见的两个算术运算
ADDR1,R2,R3 ; R1 = R2 +R3
SUB R1,R2,R3 ; R1 =R2 - R3
subs r3,r1,r2 ; r3 =r1-r2,并且影响cpsr标志位
逻辑运算
AND R0 ,R0 ,#3 ;该指令保持 R0 的 0 、1 位,其余位清零(重要)
1.取出第0位上的数据
MOV R0,#0x13
AND R0,#0x1
ORR R0 ,R0 ,#3 ;该指令设置 R0 的 0 、1 位,其余位保持不变
只要有一个为1 ==》1
置某位值;
1.将R0,的第0位置"1"
MOV R0,#0x12 (.......0001 0010)
ORR R0,#0x1
2.将R0,的低四位置"1"
MOV R0,#0x12 (.......0001 0010)
ORR R0,#0x0F
EOR R0 ,R0 ,#3 ;该指令反转 R0 的 0 、1 位,其余位保持不变
BIC R0,R0,#0x1F;该指令清除 R0 中低5位,其余的位保持不变
寄存器寻址方式:
操作数的值在寄存器中,指令中的地址码编号指出的是寄存器编号,指令执行时直接取出寄存器值来操作。
如:
mov r1,r2 ;将r2的值存入r1
sub r0,r1,r2 ;将r1的值减去r2的值,结果保存到r0
2.Load/Store访存指令
1)单寄存器操作指令
单寄存器加载指令
助记符
说明
操作
条件码位置
LDR Rd,addressing
加载字数据
Rd←[addressing],addressing索引
LDR{cond}
LDRB Rd,addressing
加载无符号字节数据
Rd←[addressing],addressing索引
LDR{cond}B
LDRT Rd,addressing
以用户模式加载字数据
Rd←[addressing],addressing索引
LDR{cond}T
LDRBT Rd, addressing
以用户模式加载无符号字节数据
Rd←[addressing],addressing索引
LDR{cond}BT
LDRH Rd, addressing
加载无符号半字数据
Rd←[addressing],addressing索引
LDR{cond}H
LDRSB Rd, addressing
加载有符号字节数据
Rd←[addressing],addressing索引
LDR{cond}SB
LDRSH Rd, addressing
加载有符号半字数据
Rd←[addressing],addressing索引
LDR{cond}SH
mov r3,#0x45 ;r3 = 0x45
mov r2,#0x40000000 ;r2 = 0x40000000(地址)
str r3,[r2,#4] ;把r3中的数据写入r2寄存器中地址为0x40000000存储空间上
mov r1,#0xFF ;r1 = 0xFF
mov r3,#0x45 ;r3 = 0x45
mov r2,#0x40000000 ;r2 = 0x40000000(地址)
str r3,[r2,#4] ;把r3中的数据写入r2寄存器中地址为0x40000000存储空间上
mov r1,#0xFF ;r1 = 0xFF
ldr r1,[r2,#4] ;从r2寄存器上地址0x40000000处偏移4个字节0x40000004处,读取数据,存入到寄存器r1中
mov r4,#12 ;r4 = 12
ldr r1,[r2,r4] ;从r2寄存器上地址0x40000000处偏移r4中数据12个字节 ==》0x4000000c处,读取数据,存入到寄存器r1中
前后索引:
LDR r0,[r1,r2]
STR Rd, [Rbase, Rindex]! 存储 Rd 到 Rbase + Rindex 所合成的有效地址,
并且把这个新地址写回到 Rbase。
STR Rd, [Rbase, #index]! 存储 Rd 到 Rbase + index 所合成的有效地址,
并且并且把这个新地址写回到 Rbase。
多寄存器操作指令:
LDMIA R1!,{R2-R4,R6}
LDMIA R1!,{r4,r3,R6,r2}
;将R1指向的存储单元中的数据读出到
;R2、R3、R4、R6寄存器中()
;存储指针在加载第一个值之后增加
;增长方向为向上增长(! : 表示同时更新寄存器的值)
- ARM 汇编伪指令
- ARM汇编指令集
- GNU ARM汇编指令
- 常用ARM汇编指令
- ARM汇编指令集
- ARM汇编伪指令
- ARM汇编伪指令
- ARM汇编指令集
- ARM汇编伪指令
- GNU ARM 汇编指令
- ARM汇编指令集
- arm 汇编指令 积累
- ARM汇编指令集
- ARM汇编指令集
- ARM常用汇编指令
- ARM汇编指令集
- GNU ARM 汇编指令
- ARM汇编指令集
- C语言常用转义字符表
- JSP for Discourse SSO
- 【重磅】移动网络性能揭秘(下)--网络协议及性能提升实践
- oracle 11g RAC手动卸载grid,no deinstall
- Mac OS X 10.10 安装 gdb
- ARM汇编指令
- Cstring转int型问题(error C2664: “atoi”: 不能将参数 1 从“CString”转换为“const char *”))
- 学习网址
- redis持久化
- PHP的哈希表实现
- Prepared Statement在mysql下中文乱码解决方案
- div内的内容超出则自动换行
- struts2-练习题
- ACM常用数据结构