您的位置 首页 方案

ARM汇编指令ARM寻址方法、汇编指令、伪指令

1、寻址方式所谓寻址方式就是:处理器根据指令中给出的地址信息来寻找物理地址的方法。1)立即寻址立即寻址也叫立即数寻址,这是一种特殊的…

1、寻址办法

所谓寻址办法便是:处理器依据指令中给出的地址信息来寻觅物理地址的办法。

1)当即寻址

当即寻址也叫当即数寻址,这是一种特别的寻址办法,操作数自身便是在指令中给出的。

只需取出指令也便是取得了操作数,这个操作数被称为当即数,对应的寻址办法也就叫做当即数寻址。

例如:

△:ADD R0,R0,#1;R0<-R0+1

△:ADD R0,R0,#0X3F;R0<-R0+0X3F

2)寄存器寻址

寄存器寻址便是运用寄存器中的数值作为操作数,这种寻址办法是各类微处理器常常运用的一种办法,

也是一种碑文功率较高的寻址办法。

例程:

ADD R0,R1,R2;R0<-R1+R2

3)寄存器直接寻址

寄存器直接寻址便是以寄存器中的值作为操作数的地址,而操作数自身就放在存储器中。

例如:

ADD R0,R1,[R2];R0<-R1+[R2]

LDRR0,[R1];R0<-[R1]

4)基址变址寻址

基址变址寻址便是将寄存器(该寄存器一般称为基址寄存器)的内容与指令中给出的地址偏移量相加,

然后得到一个操作数的有用地址:

例如:

LDR R0,[R1,#4];R0<-[R1+4]

LDR R0,[R1,#4]!;R0<-[R1+4]、R1<-R1+4

LDR R0,[R1],#4;R0<-[R1+4]、R1<-R1+4

4)多寄存器寻址

选用多寄存器寻址办法,一条指令能够完结多个寄存器值的传送。

这种寻址办法能够用一条指令完结传送最多16个通用寄存器的值。

例如:

LDMIA R0,{R1,R2,R3,R4};R1<-[R0]

;R2<-[R0+4]

;R3<-[R0+8]

;R4<-[R0+12]

留意:该指令的后缀IA一共在每次碑文完加载、存储操作后,R0按字长度添加,因而,指令能够将

接连存储单元的值送到R1~R4。

5)相对寻址

与基址变址寻址办法相相似,相对寻址以程序计数器PC的当时值为基地址,指令中的地址标号作为偏移量,

将两者相加之后得到的操作数的有用地址。

例如:

BL NEX

6)仓库寻址

T仓库是一种数据结构,按先进后出(First In Last Out,FILO)的办法作业,运用一个称作为

仓库指针的专用寄存器指示当时的操作方位,仓库指针总是指向栈顶。

递加仓库:向高地址方向成长

递减仓库:向低地址方向成长

满仓库:仓库指针指向最终压入仓库的有用数据项

空仓库:仓库指针指向下一个要放入数据的空方位

2、ARM指令

1)跳转指令

跳转指令用于完结程序流程的跳转,在ARM程序中有两种办法能够完结程序流程的跳转:

△:运用专门的跳转指令。

△:直接向程序计数器PC写入跳转地址值,经过向程序计数器PC写入跳转地址值,能够完结在4GB的

地址空间中的恣意跳转,在跳转之前结合运用MOV LR,PC

等相似的指令,能够保存将来的回来地址值,然后完结在4GB接连的线性地址空间的子程序调用。

在ARM指令拘押的跳转指令能够完结从当时指令向前或许向后的32MB的地址空间的跳转,包含以下四条指令:

△:B跳转指令

△:BL带回来的跳转至灵

△:BLX带回来和状况切换的跳转指令

△:BX带状况切换的跳转指令

①、B指令:

B{条件}方针地址

B指令是最简略的跳转指令。一旦遇到一个B指令,ARM处理器将当即跳转到给定的方针地址,从那里开端持续碑文。

例如:

CMP R1,#0

BEQ LABEL;当CPSR寄存器中的Z条件码置位时,程序跳转到标号LABEL处碑文

顺便把指令的条件贴出来:

②、BL指令:

BL{条件}方针地址

BL是另一个跳转指令,但跳转之前,会在寄存器R14(LR)中保存PC当时值,

因而,能够经过将LR的内容从头加载到PC中,来回来到跳转指令之后的那个指令处碑文。

该指令是完结子程序调用的一个根本但常用的手法。

③、BLX指令

BLX 方针地址

BLX指令从ARM指令集跳转到指令中所指定的方针地址,并将处理器的作业状况有ARM状况切换到Thumb状况,

该指令一起将PC的当时内容保存到R14中。

因而,当子程序运用Thumb指令时,而调用者运用ARM指令,能够经过BLX指令完结子程序的调用和处理器

作业状况的切换。

一起,子程序回来能够经过寄存器R14值到PC中来完结回来。

④、BX指令

BX{条件} 方针地址

BX指令跳转到指令中指定的方针地址,方针地址的指令既能够是ARM指令,也能够是Thumb指令。

2、数据处理指令

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

数据传送指令用于在寄存器和寄存器之间(这儿必定要看清楚是寄存器与寄存器!!!)进行数据的双向传输。

算术逻辑运算指令完结常用的算术和逻辑的运算,该指令不光将运算成果博爱存在意图寄存器中,一起更新CPSR中的相应条件标志位。

1)MOV指令

MOC{条件}{S}意图寄存器,原操作数(都是寄存器!!!)

MOV指令完结从一个寄存器、被移位的寄存器加载到意图寄存器。

其间S选项决议指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。

例程:

MOV R1,R0

MOV PC,R14

MOV R1,R0,LSL #3

2)MVN指令

MVN{条件}{S}意图寄存器,原操作数

MVN指令完结从另一个寄存器、被移位的寄存器、或将一个当即数加载到意图寄存器。

与MOV指令不同之处是在传送之前按位取反了,既把一个取反的值传送给意图寄存器中。

其间S决议指令的操作是否影响CPSR中条件标识为的值,当没有S时指令不更新CPSR中条件标志位的值。

例程:

MVNR0,#0XFF

3)CMP指令

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

CMP指令用于把一个寄存器内容和另一个寄存器的内容或许当即数进行比较,一起更新CPSR中

条件标志位的值。

该指令进行一次减法运算,可是不保存成果,只更改条件标志位(其间指令条件上边的图片~~)~~

例如:

CMP R1,RO

CMP R1,#100;将寄存器R1中的值与当即数100相减,并依据成果设置CPSR的标志位

4)TST指令

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

TST指令用于把一个寄存器的内容和另一个寄存器的内容或许当即数按位的与运算。

并依据成果更新CPSR中条件标志位的值。

操作数1是要测验的数据,而操作数2是一个位掩码,依据测验成果设置相应的标志位。

例程:

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

5)ADD指令

ADD{条件}{S} 意图寄存器,操作数1,操作数2

ADD指令用于把两个操作数相加,并将成果存放到意图寄存器中。

操作数1一概是一个寄存器,操作数2能够是一个寄存器,被一位的寄存器,或许一个当即数。

例程:

ADD R0,R1,R2

ADD R0,R2,R3,LSL#1

6)SUB指令

不想说~~由于跟ADD指令如出一辙,只是一个加一个减~~

7)AND指令

AND{条件}{S} 意图寄存器,操作数1,操作数2

AND指令用于在两个操作数上进行逻辑与运算,并肩成果放置在意图寄存器。

格局跟ADD相同。

例程:

AND R0,R0,#3;该指令坚持R0的0、1位,其他位清零

8)ORR指令

按位或,格局跟AND指令相同~~

功用:常用于设置操作数1的某些位。

9)BIC指令

BIC{条件}{S} Rd,Rn,operand2

BIC指令用于铲除Rn中的某些位,并把成果存放在Rd中,操作数operand2为32位的掩码,假如

掩码中设置了某一位为1,则铲除这一位。

例程:

B%&&&&&% R0,R0,#11;将R0的0,1,3位清零,其他位不变。

10)MUL指令

MUL{条件}{S}意图寄存器,操作数1,操作数2

其间操作数1和操作数2均为32位的有符号数或许无符号数。

11)MRS指令(程序状况寄存器拜访指令)

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

MRS指令用于将程序状况寄存器的内容传送到通用寄存器中。

留意:

该指令用于一下状况:

a、当需求改动程序状况寄存器时,能够用MRS将程序状况寄存器的内容读入通用寄存器,

修正后再写回程序状况寄存器。

b、当在反常处理或进程切换时,需求保存程序状况寄存器的值,能够先用该指令读出程序状况寄存器的值,然后保存。

12)MSR指令(与MRS相对应)

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

MSR指令用于将操作数的内容传送到程序状况寄存器的特定域中,其间,操作数能够为通用寄存器或当即数。

<域>用于设置程序状况寄存器中需求操作的位,32位的程序状况寄存器可分为4个域:

位[31:24]为条件标志位域,用f一共

位[23:16]为状况位域,用s一共

位[15:8]为扩展为域,用x一共

位[7:0]为操控位域,用c一共

该指令一般用于或许改动程序转台寄存器的内容,在运用时,一般要在MSR指令中指明酿制操作的域。

例程:

MSR CPSR_C,RO;传送R0的内容到SPSR,可是只是修正CPSR中的位操控域

13)LDR指令(加载指令)

首要介绍一下加载/存储指令:

ARM微处理器支撑加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完结相反的操作。

LDR{条件} 意图寄存器,<存储器地址>

LDR指令用于从存储器中将一个32位的数据传送到意图寄存器中。

该指令一般用于从存储器中读取32位的子数据到通用寄存器,然后对数据进行处理。

14)LDRB指令

格局通LDR指令相同!

LDRB指令用于从存储器中将一个8位的字节数据传送到意图寄存器中,一起将寄存器的高24位清零。

15)LDRH指令

LDRH指令用于从存储器中将一个16位的半字数据传送到意图寄存器中,一起将寄存器中的高16位清零。

16)STR指令(存储指令)

STR{条件} 源寄存器,<存储器地址>

STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。

17)批量加载/存储指令-LDM/STM

ARM微处理器所支撑的批量数据加载/存储指令能够一次在一片接连的存储器单元和多个寄存器之间传送数据,

批量加载指令用于将一片接连的存储器中的数据传送到多个寄存器,批量数据存储指令则完结相反的操作。

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

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

传送数据,该指令的常见用处是将多个寄存器的内容入栈或出栈。

类型:

IA:每次传送后地址加1

IB:每次传送前地址加1

DA:每次传送后地址减1

DB:每次传送前地址减1

FD:满递减仓库

ED:空递减仓库

FA:满递加仓库

EA:空递加仓库

{!}:

为可选后缀,若选用该后缀,则当数据传送完毕之后,将最终的地址写入基址寄存器,不然基址寄存器的内容不改动。基址寄存器不允许为R15,寄存器列表能够为R0~R15的恣意组合。

{^}:

为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时一共:除了正常的数据缠讼之外,还将SPSR到CPSR。

例程:

STM R13!,{R0,R4-R12,LR};将寄存器列表中的寄存器(R0,R4-R12,R13)存入仓库

LDMFD R13!,{R0,R4-R12,PC};将仓库内容康复到寄存器(R0,R4-R12,LR)

18)SWP指令

SWP{条件} 意图寄存器,源寄存器1,[源寄存器2]

SWP指令用于将源寄存器2所指向的存储器中的字数据传送到意图寄存器中,一起将源寄存器1中的子数据传送到源寄存器2所指向的存储器中。

明显,当源寄存器1和意图寄存器为同一个寄存器时,指令交流该寄存器和存储器的内容。

例程:

SWP R0,R0,[R1]

19)移位指令

ARM微处理器所支撑数据的移位操作~~

移位操作在ARM指令拘押不作为独自的指令运用,他只能作为指令格局中是一个字段,在汇编言语中一共为指令中的选项。

移位操作包含如下6中:ASL和LSL是等价的!

△:LSL逻辑左移(按操作数所指定的数据向左移位,低位用0来补。其间,操作数能够是通用寄存器或许当即数(0~31)。)
△:ASL算术左移
△:LSR逻辑右移
△:ASR算术右移
△:ROR循环右移(留意:操作数能够是通用寄存器,也能够是当即数(0~31)。)
20)反常发生指令(暂时用不到~~所以不写了~~)
ARM微处理器所支撑的反常指令有两条:
SWI软件中止指令
BKPT断点中止指令
3、ARM伪指令
在ARM汇编言语程序里,有一些特别指令助记符,这些助记符与指令系统的助记符不同,没有
相对应的操作码,一般称这些特别指令助记符为伪指令,他们所完结的操作称为伪操作。
伪操作在源程序中的效果是为了完结汇编程序做各种准备作业的,这些伪指令仅在汇编过程中起效果,一旦
汇编完毕,伪指令的是名也就完结了。
在ARM的汇编程序中,有如下几种伪指令:
符号界说伪指令、数据界说伪指令、汇编操控伪指令、宏指令以及其他伪指令。
1)符号界说伪指令
符号界说伪指令用于界说ARM汇编程序中的变量、对变量赋值以及界说寄存器的别号等操作。
常见的有:
△:界说大局变量的GBLA、GBLL和GBLS
△:界说局部变量的LCAL、LCLL和LCLS
△:对变量赋值的SETA、SETL、SETS
△:为通用寄存器列表界说称号的RLIST
①、GBLA/GBLL/GBLS
格局:
GBLA/GBLL/GBLS大局变量名(在整个程序范围内变量名有必要仅有!!)
用于界说一个ARM程序中的大局变量,并将其初始化。
△:GBLA:界说一个大局的数字变量,并初始化为0;
△:GBLL:界说一个大局的逻辑变量,并初始化为F(假);
△:GBLS:界说一个大局的字符串变量,并初始化为空;

例程:

GBLA TEST

TEST SETA 0XAA

②、LCALL/LCLL/LCLS

跟①是相同相同的~~只不过是局部变量罢了!

③RLIST

格局:

称号 RLIST {寄存器列表}

RLIST伪指令用于对一个通用寄存器列表界说称号,运用该伪指令界说的列表称号可在ARM指令LDM/STM中运用。

在LDM/STM指令中,列表中的寄存器拜访次第为依据寄存器的标号由低到高,而与列表中的寄存器摆放次第无关。

例程:

REGLIST RLIST {R0-R5,R8,R10};将寄存器列表称号界说为REGLIST,能够在ARM指令LDM/STM中经过该称号拜访寄存器列表。

2)数据界说伪指令

数据界说伪指令一般用于为特定的数据分配存储单元,一起可完结已分配存储单元的初始化。

常见的数据界说伪指令有:

DCBDCWDCDDCFD

DCDSDCQSPACE MAPFIELD

①、DCB指令

格局:

标号 DCB 表达式

DCB伪指令用于分配一个接连的自己存储单元并用伪指令中指定的表达式初始化。

其间,表达式能够为0~255的数字或字符串。

DCB也能够用”=“替代。

例程:

STR DCB “This is a test!”;分配一片接连的字节存储单元并初始化

②、SPACE指令

格局:

标号 SPACE 表达式

SPACE伪指令用于分配一片接连的存储区域并初始化为0。

其间,表达式为要分配的字节数。SPACE能够用”%“替代。

例程:

DATASPACE SPACE 100;分配接连的100字节的存储单元并初始化为0

③、MAP指令

格局:

MAP 表达式{,基址寄存器}

MAP为指令用于界说一个结构化的内存表的首地址。

MAP也能够用”^“替代。

表达式能够为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器挑选不存在时,

表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。

MAP伪指令一般与FIELD伪指令合作运用来界说结构化的内存表。

例程:

MAP 0x100,R0;界说结构化内存表首地址的值为0x100+R0

④FILED指令

一般都与MAP指令一重用。

格局:

标号 FIELD 表达式

FIELD为指令用于界说一个结构化内存表中的数据域,FILED也可用”#“替代。

表达式的值为当时数据域在内存表中所占的字节数。

FIELD伪指令界说内存表中的各个数据域,并能够为每个数据域指定一个标号使其他的指令

引证。

例程:

MAP 0X100;界说结构化内存表首地址为0x100

A FIELD 16;界说A的长度为16个字节,方位位0x100

B FIELD 32;界说B的长度诶32个字节,方位位0x110

3)汇编操控伪指令(这个东西不想写了,用到了,一查就哦了~~写多了也没用多了好)

汇编操控伪指令用于操控汇编陈旭的碑文流程,常用的汇编操控伪指令包含以下几条:

△:IF、ELSE、ENDIF

△:WHILE、WEND

△:MACRO、WEND

△:MEXIT

4)其它伪指令

△:AREA

△:ALIGN

△:CODE16、CODE32

△:ENTRY

△:END

△:EQU

△:EXPORT(Or GLOBAL)(这个是声明一个u且安居的标号,该标号可在其它文件引证!!和C言语一个道理~~)

△:IMPORT

△:EXTERN

△:GET(Or INCLUDE)

这儿我就说下IPMORT指令吧:

IPMORT 标号

IMPORT伪指令用于告诉编译器要运用得标号在其他的源文件中界说,但要在当时源文件中引证。

标号在程序中委任大小写。

运用实例:

ARET Init,CODE,READONLY

IMPORT Main;告诉编译器当时文件要引证标号Main,但Main在其它的源文件中界说的!

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部