常用的汇编指令与技巧

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>  <rn> {!}  <register list> {^}

   stm {cond}  <addresing_mode>  <rn> {!}  <register list> {^}

格式说明:

1){cond}:表示指令的执行条件,根据cpsr寄存器中的条件标志位决定是否执行该条指令,每条ARM指令包含4bit的条件码域,

可以定义16个执行条件,具体如下表:

 2)<addresing_mode>表示地址变化模式,具体如下:

3)<rn> 中保存内存的地址,如果后面加上!,指令执行完成后,rn的值会更新,等于下一个内存的地址,否则保持初始值。

 

4)<register list>表示寄存器列表,对于ldm指令,从<rn>所对应的内存块中读取数据写入这些寄存器,对于stm把这些寄存器的值写入

<rn>对应的内存块中。如果寄存器地址连续,可以写成r1-rx的格式,不连续的用逗号隔开。^符号有两种含义:如果<register list>有pc寄存器,

它表示指令执行后,spsr寄存中的值将自动复制到cpsr寄存器中--这通常用于中断处理函数的返回;如果没有pc寄存器,那^表示操作的是

用户模式下的寄存器,而不是当前特权模式下的寄存器。

 

5)指令中<register list>与<rn>的对应关系为:编号低的寄存器对应内存中低地址单元,编号高的寄存器对应内存中高地址单元,具体如下:

 扩展:

 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=r2*4*/

 

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*/

 

转载于:https://www.cnblogs.com/FREMONT/p/9439665.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ARM指令集是一种广泛使用的指令集架构,它主要用于移动设备、嵌入式系统和低功耗服务器等领域。这个指令集架构的发展可追溯到1980年代初,但只有1990年代后期开始得到广泛采用和推广。现在,ARM指令集已经成为了全球最流行的指令集之一。 常用的ARM指令集包括ARMv6、ARMv7和ARMv8等。它们的主要区别在于处理器的架构和指令集的扩展。其中,ARMv6是一种比较老的架构,适用于早期的移动设备和嵌入式系统。而ARMv7则是一种更为先进的架构,支持更多的指令集扩展和一些新的特性。ARMv8则是未来的趋势,它支持更多的指令集扩展,包括虚拟寄存器、硬件虚拟化和安全性增强等功能。 除了ARM指令集,汇编语言也是ARM编程的重要组成部分。常用的ARM汇编语言包括ARM汇编和Thumb汇编两种。ARM汇编是一种较为底层的汇编语言,它使用32位指令来完成数据处理和控制流操作。而Thumb汇编则是一种更加轻量级的汇编语言,它使用16位指令来完成相同的操作。 针对ARM指令集和汇编语言,有许多文档和教程可供参考。其中最常用的包括ARM体系结构参考手册、ARM汇编编程指南和ARM编程手册等。这些文档都提供了详细的指令集和汇编语言说明,以及实用的编程示例和技巧。同时,还有一些在线资源和社区,如ARM开发者中心和ARM社区等,提供丰富的资讯和交流平台。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值