ARM汇编指令

发布者:MysticalGarden最新更新时间:2024-07-26 来源: cnblogs关键字:ARM  汇编指令  地址空间 手机看文章 扫描二维码
随时随地手机看文章

ARM汇编指令集

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

Ⅰ.使用专门的跳转指令。

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

通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用

MOV LR,PC

等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。

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

1、  B指令

B指令的格式为:

B{条件}  目标地址

B指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB的地址空间)。以下指令:

B       Label         ;程序无条件跳转到标号Label处执行

     CMP R1,#0             ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label处执行

BEQ Label      

2、  BL指令

BL指令的格式为:

BL{条件} 目标地址

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

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

到R14中

3、  BLX指令

BLX指令的格式为:

BLX  目标地址

BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。

4、  BX指令

BX指令的格式为:

BX{条件}  目标地址

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

二、数据处理指令数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。

数据传送指令用于在寄存器和存储器之间进行数据的双向传输。

算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。

比较指令不保存运算结果,只更新CPSR中相应的条件标志位。

数据处理指令共以下16条。

1、    MOV指令

MOV指令的格式为:

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

MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

指令示例:

MOV R1,R0                        ;将寄存器R0的值传送到寄存器R1

MOV PC,R14                       ;将寄存器R14的值传送到PC,常用于子程序返回

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

2、  MVN指令

MVN指令的格式为:

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

MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

指令示例:

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

3、  CMP指令

CMP指令的格式为:

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

CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作操作数2,则此后的有GT 后缀的指令将可以执行。

指令示例:

CMP    R1,R0              ;将寄存器R1的值与寄存器R0的值相减,并根据

                              结果设置CPSR的标志位

CMPR1,#100               ;将寄存器R1的值与立即数100相减,并根据结果

                              设置CPSR的标志位

4、  CMN指令

CMN指令的格式为:

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

CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位。

指令示例:

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

                                设置CPSR的标志位

   CMNR1,#100               ;将寄存器R1的值与立即数100相加,并根据结果设置

                                CPSR的标志位

5、  TST指令

TST指令的格式为:

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

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

指令示例:

TST    R1,#%1              ;用于测试在寄存器R1中是否设置了最低位(%表示二进制数)

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

6、  TEQ指令

TEQ指令的格式为:

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

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

指令示例:

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

7、  ADD指令

ADD指令的格式为:

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

ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

指令示例:

ADD     R0,R1,R2                ; R0 = R1 + R2

ADD     R0,R1,#256              ; R0 = R1 + 256

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

8、  ADC指令

ADC指令的格式为:

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

ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

以下指令序列完成两个128位数的加法,第一个数由高到低存放在寄存器R7~R4,第二个数由高到低存放在寄存器R11~R8,运算结果由高到低存放在寄存器R3~R0:

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

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

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

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

9、  SUB指令

SUB指令的格式为:

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

SUB指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。

指令示例:

SUB     R0,R1,R2                ; R0 = R1 - R2

SUB     R0,R1,#256              ; R0 = R1 - 256

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

10、~~~~C指令

~~~~C指令的格式为:

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

~~~~C指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。

指令示例:

SUBS    R0,R1,R2                         ; R0 = R1 - R2 - !C,并根据结果设置

                                                 CPSR的进位标志位

11、R~~~~指令

R~~~~指令的格式为:

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

R~~~~指令称为逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。

指令示例:

R~~~~     R0,R1,R2                              ; R0 = R2 – R1

R~~~~     R0,R1,#256                            ; R0 = 256 – R1

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

12、RSC指令

RSC指令的格式为:

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

RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。

指令示例:

RSC     R0,R1,R2                             ; R0 = R2 – R1 - !C

13、AND指令

AND指令的格式为:

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

AND指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于屏蔽操作数1的某些位。

指令示例:

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

14、ORR指令

ORR指令的格式为:

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

ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。

指令示例:

ORR R0,R0,#3         ; 该指令设置R0的0、1位,其余位保持不变。

15、EOR指令

EOR指令的格式为:

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

EOR指令用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于反转操作数1的某些位。

指令示例:

EOR R0,R0,#3        ; 该指令反转R0的0、1位,其余位保持不变。

16、BIC指令

BIC指令的格式为:

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

BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。操作数2为32位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。

指令示例:

BIC R0,R0,#%1011    ; 该指令清除 R0 中的位 0、1、和 3,其余的位保持不变。

三、法指令与乘加指令ARM微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为64位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1必须是不同的寄存器。

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

1、  MUL指令

MUL指令的格式为:

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

MUL指令完成将操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数或无符号数。

指令示例:

MUL R0,R1,R2            ;R0 = R1 × R2

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

[1] [2] [3] [4] [5]
关键字:ARM  汇编指令  地址空间 引用地址:ARM汇编指令

上一篇:uboot 学习 Makefile分析
下一篇:u-boot-1.3.4 移植到S3C2440 (带有某些解析)

推荐阅读最新更新时间:2026-02-17 03:02

ARM地址空间
摘编: 在嵌入式系统中,内核映像与根文件系统映像存储在 ROM 或 Flash 等固态存储设备中,并且可以直接运行。但这样做是运行速度太慢,所以要把他们加载到ram中.实现主要有以下过程以嵌入式linux为例) ******************************************* 1.检测内存映射. 内存映射就是指在整个 4GB(CPU) 物理地址空间中有哪些地址范围被分配用来寻址系统的 RAM 单元。比如,在 Samsung S3C44B0X CPU 中,从 0x0c00,0000 到0x1000,0000 之间的 64M 地址空间被用作系统的 RAM 地址空间。虽然 CPU 通常预留出一大段足够的地址空
[单片机]
汇编语言学习笔记————总线以及内存地址空间的概念
汇编语言的组成 汇编指令(机器码的助记符) 伪指令(由编译器执行) 其他符号(由编译器执行) 汇编语言的核心是汇编指令,它决定了汇编语言的特性 存储器 CPU是计算机的核心部件,它控制着整个计算机的运作并进行运算,要想让一个CPU工作,就必须向它提供指令和数据。而指令和数据在存储器中存放,也就是平时所说的内存。 在一台PC中的内存的作用仅次于CPU,离开了内存,性能再好的CPU也无法进行工作。 CPU对存储器的读写 CPU要想进行数据的读写,必须和外部器件进行三类信息的交互,分别是: 存储单元的地址(地址信息) 器件的选择,读或写命令(控制信息) 读或写的数据(数据信息) 总线的概念 在计算机中有专门连接CPU和其他芯
[单片机]
汇编语言学习笔记————总线以及内存<font color='red'>地址</font><font color='red'>空间</font>的概念
单片机地址空间,堆栈理解
简介:51单片机采用的是哈弗结构,即数据跟代码拥有单独的地址空间。存储器可以分为程序存储器(eerom,flash之类),内部数据存储器(ram),SFR,位地址空间和外部数据存储器。 data –可寻址片内ram 0x00-0x7f bdata—可位寻址片内ram idata—可寻址片内ram,允许访问全部内部ram 0x00-0xff padata—分页寻址访问片外ram xdata—可寻址片外ram 0x0000- 0xffff code--程序存储区单片机存储器分ROM跟RAM之分,RAM存放中间结果,数据和经常变换的代码,ROM存放code。51单片机采用的是哈弗结构,即数据跟代码拥有单独的地址空
[单片机]
ARM汇编指令集的特点
8种寻址方式 寄存器寻址 mov r1,r2 立即寻址 mov r#0xFF00 寄存器移位寻址 mov r0,r1,lsl #3 寄存器间接寻址 ldr r1, 基址变址寻址 ldr r1, 多寄存器寻址 ldmia r1!,{r2-r7,r12} 堆栈寻址 stmfd sp!,(r2-r7,lr) 相对地址 flag:beq flag 指令后缀 B(byte) 功能不变,操作长度变为8位 H(half word) 功能不变,操作长度变为16位 S(signed) 功能不变,操作长度变为有符号 如ldr、ldrb、drh、ldrsb、 S(S标志) 功能不变,影响CPSR标
[单片机]
【s3c2440】第二课:arm汇编指令
s3c2440 arm汇编指令以及使用示例 首先需要了解s3c2440CPU内部的寄存器有哪些: CPSR/SPSR寄存器格式: arm指令 (1)运算指令 (2)跳转指令 (3)协处理器相关指令 (4)数据转移指令 tips: db(Decrement Before):先减后存 ib(Increment Before):先增后存 da(Decrement After):先存后减 ia(Increment After):先存后增 (5)异常处理指令
[单片机]
【s3c2440】第二课:<font color='red'>arm</font><font color='red'>汇编指令</font>
汇编指令ARM体系机构)
常用汇编指令 1、ARM状态下的通用寄存器和程序计数器 (1)ARM状态下各工作模式使用的寄存器 (2)当前程序状态寄存器(CPSR) N:结果是否为负数 Z:运算结果是否为0 C:进位/借位/移位溢出 V:溢出标志(Overflow) I:中断禁止位 F:快中断禁止位 T:CPU状态位;置位时,CPU处于Thumb状态;否则处于ARM状态。 M4~M0:工作模式位 中断禁止位:I位和F位属于中断禁止位。它们被置位时,IRQ中断、FIQ中断分别被禁止。 2、ARM指令在机器中的表示格式是用32位的二进制数表示。 ARM中有一条指令为:ADDEQS R0,R1,#8; ARM指令分为5个域: 第1个域:4位 的条件码
[单片机]
<font color='red'>汇编指令</font>(<font color='red'>ARM</font>体系机构)
在C51中如何访问各空间某个确定地址单元?
在 C51 中,如何访问DATA空间、PDATA空间、XDATA空间、CODE空间某个确定地址单元? 答: 用指针定义的访问存储器的宏 使用时需要用预处理命令把该头文件包含到文件中,形式为:#include 。 (1)按字节访问存储器宏的形式 宏名 (2)按整型数访问存储器宏的形式 宏名
[单片机]
嵌入式Linux ARM汇编(三)——ARM汇编指令(四)
十二、ARM伪指令 ARM伪指令不是ARM指令集中的指令,只是为了编程方便编译器定义了伪指令,使用时可以像其他ARM指令一样使用,但在编译时这些伪指令将被等效的ARM指令代替。 1、符号定义伪指令 A、全局变量定义 GBLA(GBLL/GBLS) 全局变量名 GBLA 、GBLL 和GBLS 伪指令用于定义一个ARM 程序中的全局变量,并将其初始化。其中: GBLA 伪指令用于定义一个全局的数字变量,并初始化为0 ; GBLL 伪指令用于定义一个全局的逻辑变量,并初始化为F(假); GBLS 伪指令用于定义一个全局的字符串变量,并初始化为空; 由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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