您的位置 首页 培训

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

一跳转指令跳转指令用于实现程序流程的跳转,在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。一起,该后缀还一共传入或传出的是用户形式下的寄存器,而不是当时形式下的寄存器。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/264005.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部