【ARM编程】ARM指令系统

1、ARM指令集特点
(1)指令码长度固定,如32bit
(2)几乎所有指令都是有条件执行
(3)寄存器与内存之间交换数据采用专用指令集

2、指令格式

<opcode>{<cond>}(S)  <Rd>,<Rn>{,<operand2>}

opcode: 指令助记符
cond: 执行条件
S: 是否影响CPSR寄存器(当MDK
程序状态)的值
Rd: 目标寄存器
Rn: 第1个操作数的寄存器
operand2: 第2个操作数

3、数据传送指令

指令功能实例注释
mov给一个寄存器赋值move r0, #10
mvn把一个数值按位取反后赋值给一个寄存器mvn r0, #0xffR0 = ~0xff
add计算两个数值的加法add r0, r0, #10
add r0, r0, r1
R0 = r0 + 10
R0 = r0 + r1
sub计算两个数值的减法sub r0, r0, #10
sub r0, r0, r1
R0 = r0 - 10
R0 = r0 - r1
mul乘法mul r0, r1, r2R0 = r1 * r2

往寄存器存放数据的三种方式:
(1)mov 有效的立即数
(2)mvn 立即数的按位取反的数
(3)ldr 任何数

4、数据运算指令

指令功能实例注释
orr按位或Orr r0, r0, r1
Orr r0, r0, #10
R0 = r0 I r1
R0 = r0 I 10
and按位与And r0, r0, r1
And r0, r0, #10
R0 = r0 & r1
R0 = r0 & 10
bic位取反Bic r0, r0, r1
Bic r0, r0, #10
R0 = r0 & (~r1)
R0 = r0 & (~10)

5、内存操作指令

指令功能实例注释
swp Rd, Rm, [Rn]将寄存器中的值与内存地址中的值交换swp r0, r1, [r2]r0 = *r2
*r2 = r1
ldr把数据从内存加载到寄存器ldr r0, =addr
ldr r1, [r0]
ldr r1, [r0, #4]
ldr r1, [r0, #4]!
ldr r1, [r0], #4
R0 = addr
R1 = *r0
R1 = *(r0+4)
ldr r1, [r0, #4]!
ldr r1, [r0], #4
str把数据从寄存器保存到内存str r1, [r0];*r0 = r1;
ldmfd把数据从内存加载到寄存器Ldmfd sp!, {r0-r12, lr}把寄存器的值放到慢递减栈中
stmfd把数据从寄存器保存到内存Stmfd sp!, {r0-r12, lr}从慢递减栈中把值取到寄存器

6、跳转指令

指令功能实例注释
b跳转B lable跳到lable处执行
bl跳转并保存返回地址Bl lable保存下一条指令的地址到lr,并跳转到lable处执行

b和bl都是相对跳转,通过偏移量跳转,最大跳转距离是-32MB~32MB
mov和ldr为绝对跳转,会修改pc指针
b, mov和ldr都不会保存返回地址,bl会保存返回地址

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值