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-11 11:56

ARM学习笔记一 入门篇
一、嵌入式系统组成: 嵌入式系统 = 嵌入式硬件系统 + 嵌入式软件系统; 嵌入式硬件系统 = 嵌入式处理器(CPU) + 嵌入式外围器件(ROM + RAM + I / O设备 + ...); 嵌入式软件系统 = 嵌入式操作系统 + 嵌入式应用程序; 二、嵌入式硬件系统结构图示: 嵌入式微处理器: (1)嵌入式处理器 = { 处理器内核,三大总线(数据,地址,控制), 辅助电路(时钟,复位电路...), 片上 I / O }; (2)嵌入式处理器 分为三种: 嵌入式微处理器 / 嵌入式微控制器 / 嵌入式DSP; a)嵌入式微处理器 :CPU (与通用计算机微处理器CPU相对
[单片机]
<font color='red'>ARM</font>学习笔记一 入门篇
s3c2440(ARM9)通用寄存器地址
89c51的通用寄存器组是对应内存的,即在内存中分配地址,那么ARM9的呢? 来源: http://zhidao.baidu.com/link?url=Nf9NDaITEiA4Gc9q6Y4dP3yt xLJPwBjvRhizxtP0hUu6sQaN qUFqPnS7KEfvfjpIJBlzFKFz q-rBNYXSGx1-va s3c2440a 通用寄存器地址:例如R0,R1,R2之类的通用寄存器对应内存的地址??? 这么说,在C编程中,就不存在所谓的R1、R2之类的通用寄存器了?? R0,R1,R2是 寄存器 ,在cpu内部,用于计算和存储访问、存放临时数据、以及一些cpu或程序运行的状态,是不直接对应内存的,所以也就没有
[单片机]
ARM与8、16、32位宽存储器的地址线连接若干问题
ARM是32位,地址空间是2的32次幂,4G地址空间。所有的外设(FLASH,RAM,SD卡等等)都映射到这4G的空间上。比如大部分ARM7都把RAM映射到0x40000000,所以对RAM的操作就在0X40000000开始的地址上。FLASH从0X0开始。使用FLASH还要考虑地址重映射,就是选择片内FLASH或片外FLASH。 FLASH一般是8位或16位,当它接到32位的ARM上时,地址位就会错位。对于16位FLASH,FLASH的A0要接ARM的A1。对于8位FLASH,FLASH的A0要接ARM的A0。ARM的A0对应8位,ARM的A1对应16位,ARM的A2对应32位,如果FLASH是32位,那么FLAS
[单片机]
ARM9(2440)对nand flash的读写操作-程序实例分析
我相信上一篇文章已经对nand flash的操作有了一定的了解,下面一起看一下程序实例: #include include.h extern void Uart_Printf(char *fmt,...); extern void Uart_Init(int baud); //extern void Uart_Select(int ch); static void InitNandCfg(void) { rGPACON = (rGPACON &~(0x3f 17)) | (0x3f 17); //配置芯片引脚,因为GPACON复位后各位的值为1,所以此步也可没有 //TACLS为1个HCLK,
[单片机]
关于arm-linux-gcc的安装与配置
在嵌入式开发中我们经常会用到arm-linux-gcc来编译我们的应用程序。作为arm-linux-gcc的入门,我们先看看如何安装arm-linux-gcc。 安装arm-linux-gcc还是比较简单的,我们看看Redhat9.0下的安装步骤吧。 1、将arm-linux-gcc的压缩包arm-linux-gcc-2.95.3.tar.gz解压缩; 2、将路径usr/local下的arm目录拷贝到你自己系统的/usr/local下; 3、 1 方法一: vi /etc/profile;在出现pathmunge 的语句段后添加pathmunge /usr/local/arm/2.95.3(版本号)/bin; 保存对p
[单片机]
根据ARM的电子负载网络监控系统
随着电子产品的广泛应用,各种电源设备被使用,而电源设备运行可靠与否直接关系到系统运行的安全性和准确性,因此对这些电源设备的检验非常重要。电子负载即针对电源系统中输出电能的设备或转换装置,如发电机、AC/DC、DC/AC变换器、蓄电池、整流器及电感、电容等部件的输出特性、可靠性(老化放电)进行全面测试的设备。现在广泛应用的电子负载存在许多不足,如只能工作在单机面板操作模式下,缺乏上位机监控功能,数据显示缺乏图形界面,显示不直观,人性化;测试过程必须全程有人员进行操作,无法进行编程控制测试;没有以太网络接口,无法进行远程通讯与控制。而基于网络的电子负载系统相对于传统电子负载系统有以下突出优点: (1)测试工作在上位机集中进行,通过自动
[单片机]
根据<font color='red'>ARM</font>的电子负载网络监控系统
ARM开发(6) 基于STM32的矩阵键盘按键触发外部中断
一 矩阵键盘按键触发外部中断引起蜂鸣器鸣叫原理: 1.1 本实验实现矩阵键盘某一列按键触发外部中断实现蜂鸣器鸣叫。 1.2 实验思路:根据电路图原理,外部中断产生原理。 1.3 开发环境 : MDK5 库函数版本开发 JLINK仿真 二 实验步骤: 2.1 led.h代码: #ifndef __EXTI_H #define __EXTI_H #include sys.h void EXTIX_Init(void);//外部中断初始化 #endif 2.2 led.c代码(IO配置): #include exti.h #include key.h #include delay.h #i
[单片机]
基于ARM 7 的S3C44B0X 与多路模拟器控制板通讯接口设计与实现
  0 引言   ARM (Advanced RISC Machines)是近年来在各个领域日益得到广泛应用的32 位微处理器,它既是一个公司的名称,也同样是一类微处理器的通称,包括ARM7、ARM9、ARM9E、ARM10E、SecurCore 等系列。其中ARM7 系列处理器是低功耗的32 位RISC 处理器,它主要用于对功耗和成本要求比较苛刻的产品,它支持16 位的Thumb指令集,使用Thumb 指令集能以16 位的系统开销得到32 位的系统性能。   以ARM 作为微处理器核心嵌入式系统,因其功耗极低,主频高,具有进行高速运算处理能力,完成绝大多数复杂应用的特点。采用SamsungS3C44B0X 微处理器的嵌入式操
[单片机]
基于<font color='red'>ARM</font> 7 的S3C44B0X 与多路模拟器控制板通讯接口设计与实现
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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