ARM所有常用指令的实例与说明

发布者:SHow111time最新更新时间:2016-07-12 来源: eefocus关键字:ARM  常用指令 手机看文章 扫描二维码
随时随地手机看文章
ARM所有常用指令的实例与说明:


程序跳转类指令:
====================


BX,
 语法: bx Rn
 
 此指令执行程序跳转,执行后,cpu从Rn这个寄存器里面所存的内存地址处开始继续执行。由于是跳转,因此也会同时刷新管道线。另外,如果此Rn的最低位为1的话,随后的指令将被译作thumb指令,如果最低位为0的话,随后的指令将被译作arm32位指令。因此,此指令可以用于在32位arm指令与16位thumb指令之间进行跳转。

 32位代码转入16位代码执行:

 16位代码转入32位代码执行:


B, BL 指令,
 语法: 指令 表达式/label

 B指令就直接跳转指定的地方,bl跳转到指定的地方之前还要把当前pc保存在lr寄存器里面。

 die_loop:
  b die_loop  这样就构成了死循环

 bl add  保存当前pc到lr,然后调用add函数,
 

数据处理类指令:
====================

mov, mvn指令:
 语法: 指令 目标寄存器, 操作数
 
 mov指令把操作数拷贝到目标寄存器里面。操作数可以是:寄存器,或者立即数表达式,

  例如:
   mov r0, r1   # 把r1赋给r0
   mov r2, #7
   mov r0, r1, LSL r2 把r1左移r2位后赋给r0
   mov r2, #100   # 把立即数100赋给r2
 
 mvn指令把操作数按位取反之后把值赋给目标寄存器。

  例如:
   mov r0, r1   # 表示把r1里面的值按位取反后赋给r0

   
cmp, cmn, teq, tst, 指令:
 语法: 指令 寄存器, 操作数

 操作数可以是:寄存器,或者立即数表达式
 这四条指令都是让后面的寄存器于操作数执行相应的操作后根据结果设定cpsr寄存器里面的相应位的值。

 cmp指令把寄存器和操作数相减,根据结果设定cpsr。用于比较大小。
  
  例如:循环100次
    mov r0, #0
   loop100:
    add r0, r0, #1
    cmp r0, #100
    ble loop100
    
 cmn指令把寄存器和操作数想加,根据结果设定cpsr。用于看两个数只和会不会有进位。
 teq指令把寄存器和操作数进行按位异或,根据结果设定cpsr。用于测试两个数是否相等。
 tst指令把寄存器和操作数进行按位相与,根据结果设定cpsr。用于测试某位是否为1。

 这四条指令在执行期间都只是对寄存器和操作数进行操作,并不回写。


and, eor, sub, rsb, add, adc, sbc, rsc, orr, bic指令:

 语法:指令  Rd, Rn, Op2
 
 操作数可以是:寄存器,立即数

 and 指令对Rn和Op2按位与操作之后把结果赋值给Rd.
 eor 指令对Rn和Op2按位异或操作之后把结果赋值给Rd.
 sub 指令对Rn和Op2进行减操作之后把结果赋值给Rd.
 rsb 指令对Op2和Rn进行减操作之后把结果赋值给Rd.
 add 指令对Rn和Op2进行加操作之后把结果赋值给Rd.
 adc 指令对Rn和Op2加操作并且加上cpsr寄存器中的C位的值之后把结果赋值给Rd.
 sbc 指令执行Rn-op2-1+进位位之后把结果赋值给Rd。
 rsc 指令执行Op2-Rn-1+近位位之后把结果赋值给Rd.
 orr 指令对Rn和Op2按位或操作之后把结果赋值给Rd.
 bic 指令执行对Op2先按位取反之后再与Rn进行按位与操作,之后把结果赋值给Rd,用于对Rd中的某位置0.


mrs, msr指令:
 语法:  mrs Rd,   
   msr , Rm
   msr , Rm
   msr , #expression

 psr可以是cpsr, spsr, mrs用于读取psr寄存器里面的值然后赋值给Rd.
 msr用于存储Rm寄存器里面的值进入psr里面。
 msr , Rm只修改psr里面的标志位。

 
mul, mla指令:
 语法: mul Rd, Rm, Rs
   mla Rd, Rm, Rs, Rn

 mul指令对Rm和Rs执行乘操作之后把值赋给Rd。 Rd = Rm * Rs.
 mla指令对Rd和Rs执行乘操作之后并加上Rn后赋值给Rd. Rd = Rm * Rs + Rn。


mull, mlal指令:
 语法: umull RdLo, RdHi, Rm, Rs  :把Rm和Rs当作32位无符号数执行乘法操作,然后把结果的低32位赋给RdLo, 高32位赋给RdHi
   umlal RdLo, RdHi, Rm, Rs  :把Rm和Rs当作32位无符号数执行乘法操作,再加上由RdHi和RdLo组成的64位数,然后把结果的低32位赋给RdLo, 高32位赋给RdHi
   smull RdLo, RdHi, Rm, Rs  :把Rm和Rs当作32位有符号数执行乘法操作,然后把结果的低32位赋给RdLo, 高32位赋给RdHi
   smlal RdLo, RdHi, Rm, Rs  :把Rm和Rs当作32位有符号数执行乘法操作,再加上由RdHi和RdLo组成的64位数,然后把结果的低32位赋给RdLo, 高32位赋给RdHi
 
 
ldr, str指令:
 语法:{b}  Rd,

 ldr用于从内存中加载数据到寄存器。
 str用于存储寄存器中的数据到内存中。

 例子:

.LC:
  ldr r0, .LC :表示把.LC所处内存地址里面的4个字节值赋给r0 (这种情况需要此命令与标签在同一段内)
  ldr r0, =.LC :表示直接把.LC所处的地址赋给r0
  ldr r0, [r1] : 表示把把r1所代表的内存地址里面的值赋给r0
  ldr r0, [r1, #8]  : 表示r1加上8个字节代表的内存地址里面的值赋给r0
  ldr r0, [r1, #8]! : 表示r1加上8个字节代表的内存地址里面的值赋给r0, 然后把r1 = r1 + 8
  ldr r0, [r1], #4 : 表示把r1所代表的内存地址里面的值赋给r0, 之后, r1 += 4
  ldr r0, [r1, r2, LSL #2] :表示把r1+r2 * 4所代表的内存地址里面的值赋给r0
  
  str r0, [r1, r2] : 把r1 + r2所代表的内存地址里面的值赋入r0  
  str r0, [r1, r2]! : 把r1 + r2所代表的内存地址里面的值赋入r0, r1 = r1 + r2


ldm, stm指令:
 语法:  Rn{!}, {^}

 Rlist, 表示寄存器列表。比如{r0, r2, r5-r7,r9 }
 {!},  表示执行完ldm或stm之后是否对Rn进行回写。
 {^}, 表示恢复spsr中的值到cpsr。(一般用于返回以前模式)

 寄存器列表中的数据在内存中将被存放的顺序为低寄存器对应低内存地址的顺序存放。
 stm操作始终与所指定的栈的方向保持相同,ldm相反。stm就相当于压栈,ldm就相当于退栈。
 
 stm表示把寄存器的数据存入内存
 ldm表示把内存中的数据加载到寄存器上。
 
 例如:
  ldmfd sp, {r0,r1,r2} 表示把sp所指的内存地址开始的12个字节分别赋值给r0,r1,r2。  
  ldmfd sp!, {r0,r1,r2} 表示把sp所指的内存地址开始的12个字节分别赋值给r0,r1,r2,之后sp = sp + 12
  ldmfd sp!, {r15}^ 表示把sp棧所指的4个字节里面的值赋给r15, 同时把spsr赋值给cpsr,并且sp += 4
 
  stmfd sp, {r0, r1, r2} 表示把r2,r1,r0按照sp所指地址递减存储。也就相当于下面3条指令:
   str r2, [sp, #-4]
   str r1, [sp, #-8]
   str r0, [sp, #-12]

  stmfd sp!, {r0, r1, r2}  表示把r2,r1,r0按照sp所指地址递减存储。并且把sp = sp - 12,也就相当于下面4条指令:
   str r2, [sp, #-4]
   str r1, [sp, #-8]
   str r0, [sp, #-12]
   sub sp, sp, #12

  
  特殊用法:

   stmfd sp!, {r0-r15}^ : 表示把用户模式下面的r0-r15寄存器存在当前模式下面的sp所指向的栈中。
   stmfd sp!, {r0-r14}^ : 表示把用户模式下面的r0-r14寄存器存在当前模式下面的sp所指向的栈中。用于进程切换的时候保存用户模式下面的寄存器。
   ldmfd sp!, {r0-r14}^ : 寄存器列表这里面不带有r15(pc), 表示把当前模式下面sp所指的栈中的15个int拷贝用户模式下面的r0-r14。这个用于恢复进程状态。
  
  

swp指令:  
 语法: Rd, Rm, [rn]

 swp指令执行单字节或单字的内存于寄存器的数据交换原子操作。把rn所指内存里面的值赋值给Rd, 然后把R1存入R2所指的内存。经常用于内核中实现控制互斥与信号等功能。

 例如:
 
 swp r0, r1,[r2] :表示把r2所指的内存地址里面的值赋值给r0, 然后把r1存入r2所指内存地址。相当于下面2条指令的原子操作。
   ldr r0, [r2]
   str r1, [r2] 

关键字:ARM  常用指令 引用地址:ARM所有常用指令的实例与说明

上一篇:ARM基础:ARM中“字”的长度
下一篇:ARM汇编语言(4) 指令、伪操作、伪指令学习

推荐阅读最新更新时间:2024-03-16 14:59

Arm向美国证交会提交IPO申请,最大客户来自中国
8月22日消息,今日凌晨,日本软银集团旗下的英国半导体IP巨头Arm Holdings向美国证券交易委员会正式递交IPO文件,申请以“ARM”的代码在纳斯达克上市,巴克莱、高盛、摩根大通、瑞穗、美国银行和花旗集团均为此次IPO的承销商。 这一举动将为 Arm 的母公司软银提供更多的资金,进一步投资于初创企业。在最近与投资者和分析师的会议上,软银的首席执行官孙正义表示,该公司已经准备好在人工智能领域转向“进攻”。在申请文件中,Arm 表示,在上一个财年,有价值 300 亿美元的 Arm 制造的芯片被出货,软银将继续是 Arm 的控股股东。 Arm成立于1990年,最初是英国艾康电脑、苹果和V LSI的合资企业。Arm 也曾是一家上市
[半导体设计/制造]
揭秘TI移动应用处理器中ARM核的应用演变
约两年后,TI推出了其新一代OMAP系列移动应用处理器(AP)——备受关注的OMAP3530。广受欢迎的OMAP系列移动AP还包括OMAP2420,它已被用在诸如诺基亚N93和N95等多种移动消费应用中。TechInsight分支机构SemiconductorInsights最近进行了一个初步分析以比较OMAP3530与OMAP2420之间的异同。 OMAP平台是为包括手机、GPS系统和笔记本电脑等移动应用而设计的。OMAP移动AP在单芯片内整合了多种特性。其裸片内有四个可单独控制的独立模块、从而允许同时进行并行应用处理。这种设计还允许将不用的模块单独断电以降低功耗。这四个主要模块是:ARM核、图形加速器、成像和视频加速
[嵌入式]
揭秘TI移动应用处理器中<font color='red'>ARM</font>核的应用演变
ARM 非对齐的数据访问操作
非对齐的数据访问操作 对于Load/Store操作,如果是非对齐的数据访问操作,系统定义了下面3种可能的结果. 执行的结果不可预知. 忽略字单元地址的低两位,即访问地址为(address _and 0xffffffc)的字单元;忽略半字单元地址的最低位的值,即访问地址位(address _and 0xffffffe)的半字单元. 忽略字单元地址值种的低两位的值;忽略半字单元地址的最低位的值.有存储体统实现这种 忽略 .也就是说,这时该地址值原封不动的送到存储系统. 当发生非对齐的数据访问时,到底采用上述3种处理方法种的哪一种,是有各指令指定的.
[单片机]
HI3531串口测试程序(arm
#include stdio.h unsigned int UART0_ADDR = 0x20080000; unsigned int retu=0; int i=0; void delay_x(unsigned short cycles) { unsigned short t; t = cycles; while ( --t != 0 ); } int main() { ///////////初始化部分//////////////////////////////////////////////////// retu = *(unsigned int *)(UART0_ADDR + 0X30);//uart_c
[单片机]
言出必行 Cavium首推48核ARM服务器芯片
在今年六月,芯片供应商Cavium公司首次发布了其ThunderX系统级芯片(SoC)产品。而在近日,Cavium公司宣布,ThunderX芯片目前已经正式发售,其中包括了一个业界第一款48核ARMv8处理器。 四款ThunderX产品包括:针对云计算工作负载的ThunderX_CP、用于云计算存储应用的ThunderX_ST、应用于网络应用程序的ThunderX_NT以及确保计算安全的ThunderX_SC。 Cavium公司数据中心处理器集团产品营销总监Rishi Chugh表示:“ThunderX的四款产品都采用了48核SKU,其中,所有针对96核服务器的双插槽配置都强制为每一个插槽SKU配备了一个48核组件
[单片机]
为啥往人工智能领域砸大钱?孙正义:答案很明显
因为投资 阿里巴巴 的远见而被国人津津乐道的 孙正义 ,如今正将全部的注意力投向 人工智能 ,也就是 AI 。   北京时间昨晚的世界移动通讯大会(MWC)上,日本软银总裁孙正义发表演讲,首次披露了他去年收购英国芯片架构厂商 ARM 后的最新进展,以及他为何要领投OneWeb这家从事生产、发射卫星的美国公司。   孙正义志在将ARM打造为未来智能界具有垄断地位的公司,他预言明年人工智能的“奇点”就会到来,穿上安装芯片的鞋子,脚可以比脑袋更聪明。   “你脑袋的智商可能还不如脚” 去年下半年开始,孙正义连续大手笔猛砸人工智能。先是于7月耗资320亿美元收购ARM,此后又传出为OneWeb公司提供12亿美元的新一轮融资,其中软银出资
[嵌入式]
32位ARM内核微处理器W90N740及其应用
摘要:在对ARM体系结构进行分析的基础上,介绍了32位ARM核处理器W90N740的结构特点和优异性能,讨论了它的应用方法。给出了用W90N740芯片降低系统成本的实现方案。 关键词:ARM7TDMI;RISC;W90N740;片上系统;路由器 W90N740是台湾Winbond公司开发的基于32位ARM核的高性能、低功耗微处理器。W90N740采用ARM7TDMI内核,内建两个10/100Mb MACs以太网络控制器,并采用Winbond独家专利的网络地址转换加速器NAT Accelerator。该器件用硬件方式加速网络封包的转换,不仅减少了中央处理器的负担,同时也大幅提高了宽频的整体系统效能。而芯片方式集成的USB控制器则可透过
[嵌入式]
嵌入式系统设计中ARM仿真器的作用
本文提供了一些关于在线 ARM 仿真器的信息,以及给作为嵌入式系统设计师的你带来的好处。根据你的需要,你将在产品开发中对开发工具作出更恰当的选择。 一、嵌入式产品的开发周期 典型的嵌入式微控制器开发项目的第一个阶段是用C编译器从源程序生成目标代码,生成的目标代码将包括物理地址和一些调试信息。目前代码可以用软件模拟器、目标Monitor或在线仿真器来执行和调试。软件模拟器是在PC机或工作站平台上,以其CPU(如x86)及其系统资源来模拟目标CPU(如P51XA),并执行用户的目标代码;而目标Monitor则是将生成的目标代码下载到用户目标板的程序存储器中,并在下载的代码中增加一个Monitor任务软件,用来监视和控制用户
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved