常用汇编指令

1、数据传送指令 mov
move r1,r2 /r1=r2/
move r1,#4096 /r1=4096/

2、伪指令ldr 用于将一个大于八位的数据装入寄存器
ldr r1,=0x123456789 /r1=0x123456789/
ldr r1,=label /获取绝对地址,即label的地址/
label:
  ……

3、内存访问指令(当ldr后面没有=时为内存访问指令)
读取指令:ldr
ldr r1 ,[r2,#4] /将内存地址为r2+4的数据读取到r1中,相当于C语言中的操作*/
ldr r1,[r2],#4 /将内存地址为r2的数据读取到r1中,再将地址加4,r2=r2+4/
ldr pc,_irq /pc=(_irq)将标号中的内容放入pc中
_irq:
  .word do_swi

存储指令:str
str r1 ,[r2,#4] /将r1的值存入地址为r2+4的内存中/
str r1,[r2],#4 /将r1的值存入地址为r2的内存中,再将地址加4,r2=r2+4/

4、批量内存访问指令 ldm stm
格式:ldm {cond} <addresing_mode> {!} {^}
   stm {cond} <addresing_mode> {!} {^}
格式说明:
1){cond}:表示指令的执行条件,根据cpsr寄存器中的条件标志位决定是否执行该条指令,每条ARM指令包含4bit的条件码域,
可以定义16个执行条件,具体如下表:
在这里插入图片描述 2)<addresing_mode>表示地址变化模式,具体如下:
在这里插入图片描述
3) 中保存内存的地址,如果后面加上!,指令执行完成后,rn的值会更新,等于下一个内存的地址,否则保持初始值。
4)表示寄存器列表,对于ldm指令,从所对应的内存块中读取数据写入这些寄存器,对于stm把这些寄存器的值写入
对应的内存块中。如果寄存器地址连续,可以写成r1-rx的格式,不连续的用逗号隔开。^符号有两种含义:如果有pc寄存器,
它表示指令执行后,spsr寄存中的值将自动复制到cpsr寄存器中–这通常用于中断处理函数的返回;如果没有pc寄存器,那^表示操作的是
用户模式下的寄存器,而不是当前特权模式下的寄存器。
5)指令中与的对应关系为:编号低的寄存器对应内存中低地址单元,编号高的寄存器对应内存中高地址单元,具体如下:
在这里插入图片描述

扩展:

ldmfd

stmfd
在这里插入图片描述
5、算术指令
加指令:add

add r1,r2,#1 /r1=r2+1/

减指令:sub

sub r1,r2,#1 /r1=r2-1/

乘指令:mul

mul r1,r2,#4 /r1=r24*/

6、程序状态寄存器访问指令
msr cpsr, r0 /* s<-r,r0的值复制到cpsr中*/

mrs r0,cpsr /r<-s,将cpsr的值复制到r0中/

7、相对跳转指令 b bl
1)这两条指令的区别在于bl除了跳转以外,还将返回地址(bl的下一条指令地址)保存在lr寄存器中
2)这两条指令的跳转范围是当前指令前后32M范围内
3)他们是位置无关的指令,相对跳转
e.g:
b fun1
fun1:
  bl fun2
fun2:
  …

扩展:绝对跳转 ldr pc,=xxx
直接将要执行的指令地址存入pc中,pc为程序计数器,指向当前指向位置

8、其他指令
比较指令:cmp

cmp r1,r2 /*根据对比的结果设置cpsr寄存器的标志位,参考ARM指令条件码表

逻辑指令

位与:and(相当于&)

and r0,r1,#0xff /r0=r1&0xff/

位或:orr(相当于|)

orr r0,r1,#0xff /r0=r1|0xff/

清零:bic

bic r0,r0,#0x03 /将r0中的第一位和第二位清零/

测试:tst

tst r0,#0x20 /测试第六位是否为0,为0则将cpsr的Z位置1/

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值