ARM微处理器的指令集概述(二)——ARM应用系统开发详解笔记

发布者:温柔心情最新更新时间:2022-04-25 来源: eefocus关键字:ARM  微处理器  指令集 手机看文章 扫描二维码
随时随地手机看文章

一 跳转指令

        跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转:

                — 使用专门的跳转指令。

                — 直接向程序计数器 PC 写入跳转地址值。

        ARM 指令集中的跳转指令可以完成从当前指令向前或向后的 32MB 的地址空间的跳转,包括以下 4 条指令:

                — B 跳转指令

                — BL 带返回的跳转指令

                — BLX 带返回和状态切换的跳转指令

                — BX 带状态切换的跳转指令

B

B{条件} 目标地址


        B指令是最简单的跳转指令。注意存储在跳转指令中的实际值是 相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址) 它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后 32MB的地址空间)。


BL 指令

BL{条件} 目标地址


        BL 是另一个跳转指令,但跳转之前,会在寄存器R14 中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。例:


BL    Label    ;当程序无条件跳转到标号 Label 处执行时,同时将当前的 PC 值保存到 R14 中。



BLX 指令

        BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态。该指令同时将PC的当前内容保存到寄存器R14 中。



BX 指令

        BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。


二  数据处理指令

        数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据处理指令包括:MOV 数据传送指令、MVN 数据取反传送指令、CMP 比较指令、CMN 反值比较指令、 TST 位测试指令、 TEQ 相等测试指令、 ADD 加法指令、 ADC 带进位加法指令、 SUB 减法指令、 SBC 带借位减法指令、 RSB 逆向减法指令、 RSC 带借位的逆向减法指令、 AND 逻辑与指令、 ORR 逻辑或指令、 EOR 逻辑异或指令、 BIC 位清除指令。

MOV 指令

MOV{条件}{S} 目的寄存器,源操作数


        MOV 指令将源操作数加载到目的寄存器。其中 S 选项决定指令的操作是否影响 CPSR 中条件标志位的值,当没有 S 时指令不更新 CPSR中条件标志位的值。例:

                MOV R1,R0,LSL#3 ;        将寄存器 R0 的值左移 3 位后传送到 R1。


MVN 指令

MVN{条件}{S} 目的寄存器,源操作数


        MOV 指令不同之处是在传送之前将源操作数按位被取反。例:


                MVN R0, #0;        将立即数 0 取反传送到寄存器 R0 中,完成后 R0=-1。


 CMP 指令

CMP{条件} 操作数 1,操作数 2


         比较操作数1和操作数2,更新CSPR不保存结果。标志位表示的是操作数 1 与操作数 2 的关系(大、小、相等)。例如,当操作数 1 大于操作操作数 2,则此后的有GT 后缀的指令将可以执行。例:

                CMP  R1,#100        ;将寄存器 R1 的值与立即数 100 相减,并根据结果设置 CPSR 的标志位


CMN 指令

CMN{条件} 操作数 1,操作数 2


        实际完成操作数 1 和操作数 2 相加,并根据结果更改条件标志位。例:

                CMN  R1,R0        ;将寄存器 R1 的值与寄存器 R0 的值相加,并根据结果设置 CPSR


TST 指令

TST{条件} 操作数 1,操作数 2


         TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。操作数 1 是要测试的数据,而操作数 2 是一个位掩码,该指令一般用来检测是否设置了特定的位。例:


                TST R1,#0xffe         ;将寄存器 R1 的值与立即数 0xffe 按位与,并根据结果设置 CPSR


TEQ 指令

TEQ{条件} 操作数 1,操作数 2

        TEQ指令用于 把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数 1 和操作数2 是否相等。例:


                TEQ  R1,R2        ;将寄存器 R1 的值与寄存器 R2 的值按位异或,并根据结果设置 CPSR


ADD 指令

ADD{条件}{S} 目的寄存器,操作数 1,操作数 2


                ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1)



ADC 指令

ADC{条件}{S} 目的寄存器,操作数 1,操作数 2


        ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比 32 位大的数的加法,注意不要忘记设置S后缀来更改进位标志。以下指令序列完成两个 128 位数的加法,第一个数由高到低存放在寄存器 R7~R4,第二个数由高到低存放在寄存器 R11~R8,运算结果由高到低存放在寄存器 R3~R0:


                 ADDS R0,R4,R8 ; 加低端的字

                 ADCS R1,R5,R9 ; 加第二个字,带进位

                 ADCS R2,R6,R10 ; 加第三个字,带进位

                 ADC R3,R7,R11; 加第四个字,带进位


SUB 指令

SUB{条件}{S} 目的寄存器,操作数 1,操作数 2

        SUB指令用于把操作数 1 减去操作数 2,并将结果存放到目的寄存器中。

                 SUB R0,R2,R3,LSL#1         ; R0 = R2 - (R3 << 1)

SBC 指令

SBC{条件}{S} 目的寄存器,操作数 1,操作数 2

        SBC指令用于把操作数 1 减去操作数 2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。

                SUBS R0,R1,R2        ; R0 = R1 - R2 - !C,并根据结果设置 CPSR 的进位标志位


RSB 指令

RSB{条件}{S} 目的寄存器,操作数 1,操作数 2

        RSB指令称为逆向减法指令,用于把操作数 2 减去操作数 1,并将结果存放到目的寄存器中。

                RSB R0,R2,R3,LSL#1         ; R0 = (R3 << 1) - R2

RSC 指令

RSC{条件}{S} 目的寄存器,操作数 1,操作数 2

        RSC指令用于把操作数 2 减去操作数 1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。


AND 指令

AND{条件}{S} 目的寄存器,操作数 1,操作数 2

        AND指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。该指令常用于屏蔽操作数 1 的某些位。

                AND  R0,R0,#3        ; 该指令保持 R0 的 0、1 位,其余位清零。


ORR 指令


ORR{条件}{S} 目的寄存器,操作数 1,操作数 2


        该指令常用于设置操作数 1 的某些位。


EOR 指令


EOR{条件}{S} 目的寄存器,操作数 1,操作数 2


        该指令常用于反转操作数 1 的某些位。



三 乘法指令与乘加指令

乘法指令与乘加指令共有以下 6 条:

— MUL    32 位乘法指令

— MLA    32 位乘加指令

— SMULL  64 位有符号数乘法指令

— SMLAL  64 位有符号数乘加指令

— UMULL  64 位无符号数乘法指令

— UMLAL  64 位无符号数乘加指令


                MULS R0,R1,R2        ;R0 = R1 × R2,同时设置 CPSR 中的相关条件标志位

                MLAS R0,R1,R2,R3  ;R0 = R1 × R2 + R3,同时设置 CPSR 中的相关条件标志位

                SMLAL R0,R1,R2,R3;R0 = (R2 × R3)的低 32 位 + R0 

                                                       ;R1 = (R2 × R3)的高 32 位 + R1

                                                       ;其中,操作数 1(R2) 和操作数 2(R3) 均为 32 位的有符号数。


四 程序状态寄存器访问指令

— MRS 程序状态寄存器到通用寄存器的数据传送指令

— MSR 通用寄存器到程序状态寄存器的数据传送指令

MRS 指令

MRS{条件}通用寄存器,程序状态寄存器(CPSR 或 SPSR)

                    MRS R0,CPSR ;传送 CPSR 的内容到 R0

                    MRS R0,SPSR ;传送 SPSR 的内容到 R0

MSR 指令

MSR{条件}  程序状态寄存器(CPSR 或 SPSR)_<域>,操作数


        MSR 指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32 位的程序状态寄存器可分为 4 个域:

    位[31:24]为条件标志位域,用 f 表示;

    位[23:16]为状态位域,用 s 表示;

    位[15:8]为扩展位域,用 x 表示;

    位[7:0]为控制位域,用 c 表示;

        该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在 MSR 指令中指明将要操作的域。

                MSR CPSR_c,R0 ;传送 R0 的内容到 SPSR,但仅仅修改 CPSR 中的控制位域

五 加载/存储指令

LDR指令

LDR{条件} 目的寄存器,<存储器地址>

       

LDR R0,[R1,R2]                         ;将存储器地址为 R1+R2 的字数据读入寄存器 R0。

LDR R0,[R1,#8]                          ;将存储器地址为 R1+8 的字数据读入寄存器 R0。

LDR R0,[R1,R2] !                        ;将存储器地址为 R1+R2 的字数据读入寄存器 R0,并将新地址 R1+R2 写入 R1。

LDRR0,[R1,#8] !                          ;将存储器地址为 R1+8 的字数据读入寄存器 R0,并将新地址 R1+8 写入 R1。

LDRR0,[R1],R2                            ;将存储器地址为 R1 的字数据读入寄存器 R0,并将新地址 R1+R2 写入 R1。

LDRR0,[R1,R2,LSL#2]!             ;将存储器地址为 R1+R2×4 的字数据读入寄存器 R0,并将新地址 R1+R2×4 写入 R1。

LDRR0,[R1],R2,LSL#2             ;将存储器地址为 R1 的字数据读入寄存器 R0,并将新地址 R1+R2×4 写入 R1。

  带!号的指令和[]外有寄存器的指令,都要将新地址写入R1

六 批量数据加载/存储指令

LDM(或 STM)指令


LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{ }

LDM(或 STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多

个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,{类型}

为以下几种情况:

*IA 每次传送后地址加 1;

*IB 每次传送前地址加 1;

*DA 每次传送后地址减 1;

*DB 每次传送前地址减 1;

*FD 满递减堆栈;

*ED 空递减堆栈;

*FA 满递增堆栈;

*EA 空递增堆栈;

        * {!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。

        *基址寄存器不允许为 R15,寄存器列表可以为 R0~R15 的任意组合。

        *{∧ }为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

关键字:ARM  微处理器  指令集 引用地址:ARM微处理器的指令集概述(二)——ARM应用系统开发详解笔记

上一篇:uboot-2011.12移植到S3C2440(四序)——SDRAM分析
下一篇:uboot-2011.12移植到S3C2440(二)——点亮LED灯,the very beginning。

推荐阅读最新更新时间:2024-11-17 11:15

ARM 调用约定 calling convention
int bar( int a, int b, int c, int d, int e, int f, int g ) { int array2 ; array2 = a + b; array2 = b + c; array2 = c + d; array2 = d + e; array2 = e + f; array2 = f + g; array2 = g + a; return array2 + array2 + array2 + array2 + array2 + array2 + array2 ; } int foo( int a, int b, int c, int d, int e, int
[单片机]
<font color='red'>ARM</font> 调用约定 calling convention
中芯、ARM携手90纳米LL/G处理工艺,共谋SoC前沿设计
中芯国际集成电路制造有限公司和ARM公司共同宣布:中芯国际采用ARM Artisan物理IP系列产品中的ARM Metro低功耗/高密度产品和Advantage高性能产品,用于90纳米LL(低渗漏)和G(主流)处理工艺。该协议通过在ARM网站免费下载的方式进一步增进了两家公司在推动前沿设计和制造方案方面的协作和承诺。 中芯国际设计服务副总裁Paul Ouyang表示:“同ARM的继续合作进一步加强了我们对客户的承诺:提供包括ARM高质量的、经芯片验证的物理IP在内的全面的制造发展蓝图。通过和ARM的合作,我们可以向90纳米工艺的客户提供ARM Metro和Advantage产品,帮助他们缩短设计时间、降低风险并加快产品上市速度。
[焦点新闻]
ARM平台linux内核Notes 1
linux内存管理   嵌入式处理器的分页管理为二级映射,内存空间与I/O空间统一编址,而x86处理器采用三级映射,内存空间与I/O空间独立编址。   在32位嵌入式系统中,存储空间的地址范围从0x0000_0000到0xFFFF_FFFF,内存和I/O共享从这4GB地址空间范围。   其主要包含以下几种存储空间:   1)设备空间(MT_DEVICE):二级分页   2)内部高速SRAM空间(MT_CACHECLEAN):一级分段   3)内部mini cache空间(MT_MINICLEAN):一级分段   4)低端中断向量(MT_LOW_VECTORS):两级分页   5)高端中断向量(MT_HIGH_VECTORS):
[单片机]
<font color='red'>ARM</font>平台linux内核Notes 1
ARM汇编:BNE和TST和BEQ
(1)例一:TST与BNE搭配 TST r0,#02 BNE sleep LDR r1,#0 解释:位比较,先进行and运算,如果r0第2位不为1,则与的结果为0,设置标志位zero=1,继续下面的ldr指令。反之,zero=0,跳转到sleep执行。 bne指令: 非零则跳转 个人总结:TST 和BNE 连用: 先是用TST 进行位与运算,然后将位与的结果与0比较,如果不为0,则跳到bne紧跟着的标记(如bne sleep,则跳到sleep处)。 TST 和BEQ连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果为0,则跳到beq紧跟着的标记(如bne AAAA,则跳到AAAA处)。 (2
[单片机]
一种ARM单片机的条码精密测量系统设计方案
  利用条码技术进行精密测量的典型仪器是1990年Leica公司开发成功的数字水准仪NA2000,这种光电一体化的新型仪器,具有测量速度快、精度高、操作简单、读数直观,能自动计算高差、高程,自动记录数据,计算机数据处理和容易实现基准测量一体化等诸多特点。国内目前对该技术的研究较少,本文提出了一种基于ST半导体公司的32位高性能处理器STR912FW44X6的测量系统方案。 系统结构   本系统由以下几个部分组成:条码标尺、光学系统、CMOS图像采集模块、STR912主控板、键盘与液晶显示模块、电源模块和计算机测试系统。 硬件结构框图如图1所示。         系统工作原理如下:带有精密位置信息的条码图像通过光学系
[单片机]
一种<font color='red'>ARM</font>单片机的条码精密测量系统设计方案
ARM基础知识连载之二
*************************************************************** 程序状态寄存器 *************************************************************** CPSR(当前程序状态寄存器)在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种处理器 模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器) 。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用SPSR来恢复CPSR。由于用户模式和系统模式不是
[单片机]
ARM学习笔记10——GNU ARM命令行工具
一、编译器arm-linux-gcc   1、用arm-linux-gcc编译一个程序,一般它是要经过如下步骤的:     1.1、预处理阶段     编译器把上述代码中stdio.h编译进来,使用GCC的选项-E可以使GCC在预处理结束后停止编译过程,而不继续其他动作了。     1.2、编译阶段     首先检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,arm-linux-gcc把代码翻译成汇编语言。用户可以使用-S选项来进行查看,该选项只编译而不进行汇编,生成汇编代码。     1.3、汇编阶段     把编译阶段生成.s文件转成目标文件,使用者可使用选项-c就
[单片机]
makefile初步制作,arm-linux- (gcc/ld/objcopy/objdump)详解
在linux中输入vi Makefile 来实现创建Makefile文件 注意:命令行前必须加TAB键 例如:将两个文件led.c和crt0.S汇编文件,制作一个Makefile文件 1 1 led.bin : crt0.S led.c 2 2 arm-linux-gcc -c -o crt0.o crt0.c 3 3 arm-linux-gcc -c -o led.o led.c 4 4 arm-linux-ld -Ttext 0x00000000 -g crt0.o led.o -o led_elf 5 5 arm-linux-objcopy -O binary -S led_elf led.bin 6 6 arm
[单片机]

推荐帖子

啦啦啦,Launchpad 越长越高,越长越胖咯~
RT~下午收到MSP430F5529的Launchpad,这块曾经在TI网上昙花一现的launchpad(当时还是绿板),还以为夭折呢,现在终于出现在面前~跟以前的launchpad相比,包装变小了,而且以后应该也会保持这样的小盒包装,应该是提倡环保的节奏~打开盒子,里面有一块Launchpad一本Quickstartguide一根microUSB线,不知道是不是因为现在的手机充电线都是microUSB,所以为了兼容,TI现在的开发板都带microUSB
juring 微控制器 MCU
求助,IAR出现这个错误是什么意思..
第一次接触430,拿起LAUNCHPAD开始做...就很简单一LED灯程序试试,编译没问题,结果DebugandDownloading出现问题ThuOct11,201215:42:21:CouldnotfindMSP-FET430UIFonspecifiedCOMportThuOct11,201215:42:22:Fatalerror:Failedtoinitializedevice.Sessionaborted!ThuOct
zgbkdlm 微控制器 MCU
l猎头职位——驱动开发工程师(driver开发工程师)
驱动开发工程师(driver开发工程师)——网卡驱动开发经验,C++技能也要好(网卡制造商)8-12K1.计算机相关专业毕业,本科以上学历;2.五年以上软件开发经验,三年以上NDIS驱动开发经验;3.精通C/C++,熟悉Windows底层开发,有Linux驱动开发经验者优先;4.有SDK、DDK开发经验,熟悉网络驱动程序;5.具有较强的自学能力和良好的团队协作精神;联系方式:msn:cst.1983@hotmail.comqq:809437129l猎头职位——驱动开发工程
shi5732 嵌入式系统
几个DSP高手的经验介绍(转)
一.我是已经从事DSP开发有几年了,看到许多朋友对DSP的开发非常感兴取,我结合这几年对DSP的开发写一写自己的感受,一家之言,欢迎指教。我上研究生的第一天起根据老板的安排就开始接触DSP,那时DSP开发在国内高校刚刚开始,一台DSP开发器接近一万还是ISA总线的,我从206开始240、2407A都作过产品,对5402、2812、5471在产品方案规划制定和论证时也研究过。由于方向所限对6X、8X系列没有接触。我发现在国内无论在公司或高校许多地方为了加快开发周期往往把一个产品开发分
莫妮卡 DSP 与 ARM 处理器
好学的人
之前掌握些51单片,现在看来avr用得很多,所以到这来向高手们学习学习好学的人AVR?楼主OUT啦,别在学AVR啦,学下M0吧
沙海胡杨 Microchip MCU
网卡驱动函数问题请教
来此请教一个问题,由于以前很少接触硬件驱动的编写,甚至都没有做过单片机开发,最近却被迫要在Linux下面的无线网卡驱动里面做一些东西,遇到了很多的不可理解的地方,请教一下牛人。在驱动中,有好多的程序找不到他的定义之处,在Linux内核中也找不到,这种函数是什么性质的函数呢?比如说在madwifi的ah.h里面就有很多这样只是一个声明的函数。如下所示void__ahdecl(*ah_beaconInit)(structath_hal*,u_in
zhou.63624 嵌入式系统
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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