第2章ARM7TDMI处理器编程基础课件_第1页
第2章ARM7TDMI处理器编程基础课件_第2页
第2章ARM7TDMI处理器编程基础课件_第3页
第2章ARM7TDMI处理器编程基础课件_第4页
第2章ARM7TDMI处理器编程基础课件_第5页
已阅读5页,还剩183页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章ARM7TDMI处理器编程基础.2.1ARM7TDMI内核架构

ARM7TDMI是目前使用最广泛的32位嵌入式RISC处理器,属于低端ARM处理器核。

ARM7TDMI是内核主要由32位ALU、指令译码器与逻辑控制、指令流水线、读/写数据寄存器、移位器、乘法器、地址递增单元、地址寄存器等构成。本书选取的是韩国三星公司生产的ARM7TDMI内核处理器S3C4510B作为开发实例。.ARM内核架构框图.1.ARM7TDMI内核特点(1)具有嵌入式ICE-RT逻辑,调试开发方便。(2)极低的功耗,适合对功耗要求较高的应用,如便携式产品。(3)能够提供0.9MIPS/MHz的三级流水线结构。(4)代码密度高并兼容16位的Thumb指令集。(5)对操作系统的支持广泛,包括WindowsCE、Linux、PalmOS等。(6)指令系统与ARM9系列、ARM9E系列和ARM10系列兼容,便于用户的产品升级换代。(7)主频最高可达130MHz,高速的运算处理能力能胜任绝大多数的复杂应用。.

ARM7TDMI的名称含义为:

ARM7:32位ARM体系结构4T版本,ARM632位整型核的3V兼容的版本;

T:支持16位压缩指令集Thumb;

D:支持片上调试(Debug);

M:内嵌硬件乘法器(Multiplier);

I:嵌入式ICE,支持片上断点和调试点。.ARM720T

ARM720T是在ARM7TDMI处理器核的基础上增加了一个8KB的指令和数据混合的Cache。外部存储器和外围器件通过AMBA总线主控单元访问,同时还集成了写缓冲器以及全性能的MMU。ARM720T最适合于有低功耗和小体积要求的应用。

ARM7EJ

ARM7EJ是Jazelle和DSP指令集的最小和最低功耗的实现。

ARM7系列微处理器的主要应用领域为:工业控制、Internet设备、网络和调制解调器设备、移动电话等多种多媒体和嵌入式应用。

.

流水线ARM7系列的处理器采用三级流水线的组织结构,ARM9系列的处理器采用五级流水线的组织结构。流水线技术是现代微处理器普遍采用的一种技术,它可以使得几条指令并行执行,因此可以大大提高处理器的运行效率。三级流水线分为以下三级:(1)取指:从程序存储器中读取指令,放入流水线中。(2)译码:操作码和操作数被译码,决定执行什么功能,为下一个时钟周期准备数据路径所需要的控制信号。(3)执行:执行已译码的指令。具体过程是,指令进入数据路径,寄存器堆被读取,操作数被移位,ALU进行相应的运算,将结果写到目的寄存器,同时ALU运算的结果还会根据指令的要求改变寄存器的条件位。.

在正常情况下,每条指令都被划分成3个时钟周期来完成,即取指、译码和执行。但对于流水线来讲,可以使得每个时钟周期完成一条指令,即每个周期流水线都有一条指令的吞吐量(Throughput)。通常将这种情况称为单周期指令的三级流水线操作,如图所示。

.2.处理器工作状态ARM处理器具有两种特殊的工作状态:(1)ARM状态:32位,执行字对准的ARM指令。(2)Thumb状态:16位,执行半字对准的Thumb指令。ARM处理器可以在两种工作状态之间切换:

Thumb状态:当操作数寄存器的状态位[0]为1时,执行BX指令将进入Thumb状态。如果ARM处理器在Thumb状态进入异常,则异常处理返回时,自动切换到Thumb状态。

ARM状态:当操作数寄存器的状态位

[0]为0时,执行BX指令将进入ARM状态。当ARM处理器进行异常处理时,如果把PC指针放入异常模式链接寄存器中,则程序从异常向量地址开始执行,也可以使处理器进入ARM状态。

.3.处理器数据存储格式存储器格式包括小端和大端两种格式。.在小端存储格式下,字或半字地址的低字节(对准字节)存放在低地址;在大端存储格式下,字或半字地址的低字节(对准字节)存放在高地址。下面举例说明大、小端存储格式对程序的影响,如图所示。

.图中,指令STRR0,[R1]将R0中的字存入R1的地址,指令LDRBR2,[R1]将R1中的一个字节加载到R2。可以看到,对于R0=0x11223344,如果配置成小端存储格式,则R2的值为0x44;如果配置成大端存储格式,则R2的值为0x11。ARM处理器的大、小端存储格式是通过硬件配置的,如果连接有系统控制协处理器,则另当别论。小端存储格式是ARM处理器的缺省格式。

.4.处理器数据类型和长度ARM处理器支持以下数据类型:

Byte 字节,8位

Halfword

半字,16位

(半字必须与2字节边界对准,地址低两位总为0)

Word 字,32位(字必须与4字节边界对准,地址的最低位为0).说明:

(1)数据类型被说明成unsigned类型时,N位数据值表示范围是0~2N-1的非负整数,使用通常的二进制格式。(2)数据类型被说明成signed类型时,N位数据值表示范围是-2N-1~2N-1-1的整数,使用二进制的补码格式。(3)所有的数据操作,如ADD,都以字进行处理。

(4)加载和存储操作,以字节、半字或字的大小与存储器交换数据。加载时自动进行字节或半字的零扩展或符号扩展。(5)ARM指令的长度为一个字(与4字节边界对准),Thumb指令的长度为一个半字(与2字节边界对准)。

.5.处理器模式.说明:(1)外部中断或异常处理可以引起处理器模式的改变,采用软件控制的方式也可以人为改变处理器模式。(2)应用程序一般在用户模式下运行,此时程序不能访问某些被保护的系统资源,也不能改变处理器模式。(3)除用户模式外的其他模式称为特权模式,在特权模式下用户可以自由地访问系统资源和改变处理器模式。(4)每种模式都有某些附加的寄存器,用来避免异常出现时用户模式的状态不可靠。(5)系统模式仅存在于ARM体系结构v4以上的版本中,它与用户模式拥有完全相同的寄存器,供需要访问系统资源的操作系统任务所使用,与异常的发生无关。

.6.寄存器组织ARM处理器共有37个寄存器:31个通用寄存器,32位,含程序计数器PC;6个状态寄存器,32位,只使用了其中的12位。虽然这些寄存器都参与指令的执行,但在指令执行前后只有可见寄存器的值才具有意义。因此,我们仅关注ARM处理器的可见寄存器,如图所示。

当编写用户程序时,37个寄存器中只有通用寄存器r0~r14、程序计数器PC(r15)和当前程序状态寄存器CPSR需要考虑,其余寄存器仅用于系统级编程和异常处理(如中断)。.ARM状态下寄存器组织.当编写用户程序时,37个寄存器中只有通用寄存器r0~r14、程序计数器PC(r15)和当前程序状态寄存器CPSR需要考虑,其余寄存器仅用于系统级编程和异常处理(如中断)。

(1)不分组寄存器r0~r7。不分组意味着在所有处理器模式下,r0~r7都可被同样访问,没有体系结构所隐含的特殊用途。

(2)分组寄存器r8~r14。分组意味着r8~r14的访问与当前处理器的模式相关。如果要访问r8~r14,而不依赖于当前处理器的模式,就必须使用规定的寄存器名称。名称的形式为:r8_<mode>~r14_<mode>。

.从ARM寄存器组织的图中可以看出r8~r12各有两组物理寄存器:一组为FIQ模式,另一组为FIQ以外的模式。寄存器r8~r12没有指定特殊用途,而使用r8_fiq~r12_fiq则允许快速中断。

寄存器r13和r14的用途比较特殊:

①r13通常用作堆栈指针SP,被初始化成指向异常模式分配的堆栈。处理异常时,在程序入口处将异常处理程序用到的其他寄存器的值压入堆栈,返回时重新将这些值加载到寄存器中。这样就可以保证出现异常时不导致程序状态不可靠。②r14通常用作子程序链接寄存器LR。当执行分支指令BL时,r15的内容拷贝到r14中,从而成为子程序调用后的返回地址。采用这种方式可以类似地用来处理异常的返回。

.(3)程序计数器r15。寄存器r15通常被用作程序计数器PC。在ARM状态下,由于ARM指令始终是字对准的,因此PC的值保存在位[31:2],而位[1:0]为0;在Thumb状态下,由于Thumb指令是半字对准的,因此PC的值保存在位[31:1],而位[0]为0。

①读程序计数器PC:用指令读出的r15的值为指令地址加8个字节。读PC主要用于快速对临近的指令和数据进行位置无关的寻址。

写程序计数器PC:写r15的结果是将写到r15的值作为指令地址,并根据这个地址发生转移。

.(4)当前程序状态寄存器CPSR。当前程序状态寄存器(CPSR,CurrentProgramStatusRegister)在用户级编程时用于存储条件码。CPSR还包含了中断禁止位、当前处理器模式以及其他的一些状态和控制信息。同时,为了在异常出现时能够保存CPSR的状态,每种异常模式都设置了一个程序状态保存寄存器(SPSR,SavedProgramStatusRegister)。显然,CPSR和SPSR具有相同的格式,如图所示。

.

N、Z、C、V、Q是条件码标志,可通过比较指令以及算术、逻辑运算和传送指令进行修改。条件码标志的含义为:

N:负数。对于结果是带符号的二进制补码,如果结果为负数,则N=1;如果结果为正数或0,则N=0。

Z:零。如果结果为0,则Z置1,通常表示比较的结果相等。

C:进位。无论是算术运算还是移位操作,只要指令操作产生进位输出,则C被设置。

V:溢出。算术运算产生到符号位的溢出,则V被设置。

Q:指示增强型DSP指令中是否出现溢出或饱和,仅出现在ARM体系结构v5以上版本的E变量中。

.I、F、T和M[4:0]是控制位。控制位的改变与异常的出现有关,另外在特权模式下,也可由软件改变。

I:置1则禁止IRQ中断。

F:置1则禁止FIQ中断。

T:对于ARM体系结构v4以上版本,T=0指示ARM执行,T=1指示Thumb执行;对于ARM体系结构v5以上版本,T=0指示ARM执行,T=1指示下一条指令引起未定义的指令异常。

M[4:0]:模式位。决定处理器的工作模式,即用户、FIQ、IRQ、管理、中止、未定义、系统。

.

(5)Thumb状态的寄存器集。Thumb状态下的寄存器集是ARM状态下寄存器集的子集。具体情况如图所示。

..

异常(exception)是指由内部或外部源产生从而需要处理器处理的一个事件。例如,外部中断或试图实行未定义的指令都会引起异常的发生。处理异常之前,处理器必须保存当前的状态,以便在异常处理完成后,能够使原来的操作重新执行。ARM支持7种类型的异常。对于每种异常,处理器将强制从异常对应的某个固定地址开始执行程序。这些固定地址称为异常向量。

7.异常模式.异常出现时,相应异常模式下的r14和SPSR用来保存当前状态,其过程如下:r14_<exception_mode>=returnlink/*将下一条指令的地 址存入相应连接寄存器LR*/SPSR_<exception_mode>=CPSR/*将CPSR复制到相应的SPSR*/CPSR[4:0]=exceptionmodenumber/*根据异常类型,强制设置CPSR的运行模式*/CPSR[5]=0 /*使处理器在ARM状态下执行*/CPSR[7]=1 /*禁止新的IRQ中断*/If<exception_mode>==ResetorFIQthenCPSR[6]=1 /*禁止新的FIQ中断*/PC=exceptionvectoraddress/*强制PC从相关的异常向量地址取下一条指令执行,跳转到相应的异常处理程序处*/.

异常处理完成后返回的过程与进入异常处理的过程相逆,主要是需要将SPSR的内容恢复到CPSR,将r14的内容恢复到PC。具体做法主要有两种:使用带S位的数据处理指令,将PC作为目的寄存器;使用带恢复CPSR的多加载指令。多个异常可能会同时发生,因此在ARM中就通过给各个异常赋予不同的优先级来确定处理异常的顺序。优先级按照从高到低的顺序排列如下:

复位→数据异常中止→FIQ→IRQ→预取指异常中止→SWI、未定义指令(这两种异常的指令编码互斥,不可能同时发生)

.

1.寄存器寻址指令地址码给出寄存器的编号,寄存器中的内容为操作数。

ADDR0,R1,R2 ;R0←R1+R2这条指令的含义是将寄存器R1和R2的内容相加,结果放入寄存器R0中。注意写操作数的顺序为:第1个寄存器R0为结果寄存器,第2个寄存器R1为第一操作数寄存器,第3个寄存器R2为第二操作数寄存器。

2.2ARM指令系统2.2.1ARM寻址方式.指令操作码后的地址码是立即数,即操作数本身。例:

ADDR3,R3,#1 ;R3←R3+1ANDR8,R7,#&FF ;R8←R7[7:0]立即数的表示以“#”为前缀,十六进制的立即数在“#”后面加“&”符号。第1条指令将R3的内容加1,结果放入R3中;第2条指令将R7的32位值与立即数0FFH逻辑与,结果是将R7的低8位放入R8中。

2.立即寻址.

3.寄存器移位寻址

寄存器移位寻址是ARM指令集特有的寻址方式。第2个操作数与第1个操作数结合之前,选择进行移位操作。例:

ADDR3,R2,R1,LSL#3 ;R3←R2+8×R1寄存器R1的内容逻辑左移3位,再与寄存器R2的内容相加,结果放入R3中。可采取的移位操作包括:

LSL:逻辑左移(LogicalShiftLeft)。寄存器中字的低端空出的位补0。

.

LSR:逻辑右移(LogicalShiftRight)。寄存器中字的高端空出的位补0。

ASR:算术右移(ArithmeticShiftRight)。算术移位的对象是带符号数。在移位过程中必须保持操作数的符号不变。若源操作数为正数,则字的高端空出的位补0;若源操作数为负数,则字的高端空出的位补1。

ROR:循环右移(ROtateRight)。从字的最低端移出的位填入字的高端空出的位。

RRX:扩展为1的循环右移(RotateRighteXtendedby1place)。操作数右移1位,空位(位[31])用“C”标志填充。

..

4.寄存器间接寻址指令地址码给出寄存器的编号,寄存器为地址指针,存放操作数的有效地址。例:LDRR0,[R1] ;R0←[R1]STRR0,[R1] ;R0→[R1]第1条指令将寄存器R1所指向的地址单元的内容加载到寄存器R0中。第2条指令将寄存器R0的内容存入寄存器R1指向的地址单元。

.

5.基址寻址

基址寻址是将基址寄存器的内容与指令中给出的位移量相加,形成操作数有效地址。基址寻址用于访问基址附近的存储单元,包括基址加偏移量寻址和基址加索引寻址,可以将寄存器间接寻址看作是位移量为0的基址加偏移量寻址。

1)基址加偏移量寻址

基址加偏移量寻址中的偏移量最大为4KB,可分为前索引寻址和后索引寻址。

.

前索引寻址举例:

LDRR0,[R1,#4] ;R0←[R1+4]

这条指令是把基址R1的内容加上偏移量4后所指向的存储单元的内容加载到寄存器R0中。

后索引寻址举例:

LDRR0,[R1],#4 ;R0←[R1] ;R1←R1+4后索引寻址是指基址不带偏移作为传送的地址,传送后自动索引。.

这种改变基址寄存器指向下一个传送的地址对数据块传送很有用,还可以采用带自动索引的前索引寻址实现。例:

LDRR0,[R1,#4]! ;R0←[R1] ;R1←R1+4

这两条指令功能相同,符号“!”表明指令在完成数据传送后更新基址寄存器。ARM的这种自动索引不消耗额外的时间。

.

2)基址加索引寻址基址加索引寻址是指先指定一个基址寄存器,再指定另一个寄存器(称为索引),其值作为位移加到基址上形成存储器地址。例:

LDRR0,[R1,R2] ;R0←[R1+R2]

这条指令是将R1和R2的内容相加得到操作数的地址,再将此地址单元的内容加载到R0。

.

6.多寄存器寻址多寄存器寻址是指一次可以传送多个寄存器的值,允许一条指令一次传送16个寄存器的任何子集,包括16个寄存器。例:

LDMIAR1,{R0,R2,R5} ;R0←[R1] ;R2←[R1+4] ;R5←[R1+8]

由于传送的数据总是32位的字,因此基址寄存器R1应当字对准。这条指令是将R1指向的连续存储单元的内容送到寄存器R0、R2和R5。

.7.堆栈寻址

堆栈是一种按照特定顺序进行存取的存储区。这种特定的顺序是指“后进先出”(LIFO)或“先进后出”(FILO)。使用堆栈时需要使用一个专门的寄存器作为堆栈指针,堆栈指针所指定的存储单元就是堆栈的栈顶。如果堆栈指针指向最后压入堆栈的有效数据项,就称为满堆栈(fullstack);如果堆栈指针指向下一个数据项放入的空位置,就称为空堆栈(emptystack)。另外,根据堆栈存储区地址增长的方向,可将堆栈分为递增堆栈(ascendingstack)和递减堆栈(descendingstack)。

.以上表示递增、递减、满、空的堆栈的各种组合就产生了4种堆栈类型。ARM支持所有这4种类型的堆栈,即满递增、空递增、满递减、空递减。

ARM指令使用push向堆栈写数据,称为进栈;使用pop从堆栈读数据,称为出栈。.8.块拷贝寻址

从堆栈的角度来看,多寄存器传送指令是把一块数据从存储器的某一个位置拷贝到另一位置。从块拷贝的角度来看,具体使用哪条指令还要基于数据存储在基址寄存器地址之上还是之下,地址在存储第一个值之前或之后增加或减少。这两种角度的映射均取决于执行加载操作还是存储操作。表列出了多寄存器加载和存储指令映射。

.表多寄存器加载和存储指令映射

.例:LDMIAR0!,{R2-R9} ;将数据加载到R2~R9STMIAR1,{R2-R9} ;将数据存入存储器执行指令后,由于引用自动索引“!”,R0的值共增加32,而R1不变。若R2~R9的内容有保存价值,就需要把它们压栈,即STMFDR13!,{R2-R9} ;存储寄存器到堆栈LDMIAR0!,{R2-R9}STMIAR1,{R2-R9}LDMFDR13!,{R2-R9} ;从堆栈恢复

.多寄存器指令的后缀含义如下:I:IncrementD:DecrementorDescendingstackA:AfterorAscendingstackB:BeforeF:FullE:Empty例如“FD”即表明是满递减堆栈寻址方式(fulldescendingstack)。

.

9.相对寻址可以将相对寻址看作是以程序计数器PC为基址的一种基址寻址方式。指令的地址码作为位移量,与PC相加得到操作数的有效地址。位移量指出了操作数与当前指令之间的相对位置。例: BLSUBR ;转移到SUBR ... ;返回到此SUBR ... ;子程序入口地址 MOVPC,R14 ;返回

.1.ARM指令集编码ARM指令集采用32位二进制编码方式,大部分指令编码中定义了第一操作数、第二操作数、目的操作数、条件标志影响位以及每条指令所对应的不同功能实现的二进制位。每条ARM指令都具有不同的编码方式,与不同的指令功能相对应,如图2-16所示。

2.2.2ARM指令集..2.条件执行条件执行是指只有在当前程序状态寄存器CPSR中的条件码标志满足指定的条件时,带条件码的指令才能执行。条件转移是绝大多数指令集的标准特征,但ARM指令集将条件执行扩展到所有指令,包括监控调用和协处理器指令。条件域占据32个指令域的高4位,如图2-17所示。

条件域共有16个值,即16个条件码,如表2-5所示,其中AL(Always)条件是缺省条件。

.表2-5条

.

对于条件执行,需要说明的有以下两点:(1)几乎所有的ARM数据处理指令都可以根据执行结果来选择是否更新条件码标志。当指令中包含后缀“S”时,指令将更新条件码标志。(2)可以根据另一条指令设置的标志,有条件地执行某条指令。

.

3.ARM指令格式ARM指令集是Load/Store型的,只能通过Load/Store指令实现对存储器的访问,其他类型的指令都基于寄存器完成。ARM指令使用的基本格式如下:

<opcode>{<cond>}{S} <Rd>,<Rn>{,<operand2>}其中:

opcode:操作码,指令助记符,如LDR、STR等。

cond:可选的条件码,执行条件,如EQ、NE等。

S:可选后缀,若指定S,则根据指令执行结果更新CPSR中的条件码。

.

Rd:目标寄存器。

Rn:存放第1操作数的寄存器。

operand2:第2操作数。

“<>":必需项。

“{}":可选项。例:

LDR R0,[R1] ;将R1地址上的存储器单元的内容加载到R0,执行条件AL.BEQDATAEVEN ;条件执行的分支指令,执行条件EQ,相等则跳转到DATAEVEN

ADDSR2,R1,#1 ;加法指令,R2←R1+1,影响CPSR

SUBNESR2,R1,#0x20 ;条件执行的减法指令,执行条件NE,R2←R1-0x20,影响CPSR.

4.ARM存储器访问指令

1)LDR、STRLDR和STR为单一数据传送指令,可传送字和无符号字节、半字和带符号字节、双字。

(1)字和无符号字节。*句法:op{cond}{B}{T}Rd,[Rn] ;零偏移op{cond}{B}Rd,[Rn,Flexoffset]{!};前索引偏移op{cond}{B}Rd,label ;程序相对偏移op{cond}{B}{T}Rd,[Rn],Flexoffset ;后索引偏移

.*符号说明:op:操作码,LDR或STR。

cond:可选的条件码。

B:可选后缀。若有B,则传送Rd的最低有效字节。若op是LDR,则将Rd的其他字节清零。

T:可选后缀。若有T,则即使处理器处于特权模式下,对存储系统的访问也将处理器看作是在用户模式下。T在用户模式下无效,不能与前索引偏移一起使用。

Rd:用于加载或存储的ARM寄存器。

.

Rn:基址寄存器。若指令是带有写回的前索引或后索引,或使用后缀T,则不允许Rn与Rd相同。

Flexoffset:加到Rn上的偏移量。

label:程序相对偏移表达式。其值必须在当前指令的±4KB范围内。

!:可选后缀。若有“!”,则将包含偏移量的地址写回到Rn。若Rn是R15,则不能使用“!”。

.*指令说明:指令用于加载或存储寄存器32位字或8位无符号字节。字节加载用“0”扩展到32位。对于零偏移形式,Rn的值作为传送数据的地址。对于前索引偏移形式,在传送数据之前,将偏移量加到Rn中,结果作为传送数据的存储器地址。若使用“!”,则结果写回到Rn,且Rn不允许是R15。对于程序相对偏移形式,汇编器由PC计算偏移量,并将PC作为Rn生成前索引指令。不能使用后缀“!”。

.对于后索引形式,Rn的值作为传送数据的存储器地址。数据传送之后,将偏移量加到Rn中,结果写回到Rn。Rn不允许是R15。大多数情况下,必须保证用于32位传送的地址按照字对准。关于非字对准的情况比较复杂,可参考ARM编程模型中非字对准的叙述或相关手册。加载到R15会引起处理器转移到所加载地址处的指令。对于加载值的位[1:0],不同的ARM体系结构,有不同规定。当加载R15时,不允许使用后缀“B”或“T”。

.应尽量避免从R15存储。例:LDR R8,[R10] ;R8←[R10]LDRNE R2,[R5,#960]! ;R2←[R5+960],R5←R5+960,条件执行STR R2,[R9,#CON] ;R2→[R9+CON],CON为常量表达式,且值不超过4KBSTRB R0, [R3,-R8,ASR#2] ;R0→[R3-R8/4],存储R0最低有效字节,R3和R8不变

.(2)半字和带符号字节。*句法:op{cond}typeRd,[Rn] ;零偏移op{cond}typeRd,[Rn,offset]{!} ;前索引偏移op{cond}typeRd,label ;程序相对偏移op{cond}typeRd,[Rn],offset ;后索引偏移.

*符号说明:

type:包括SH(带符号半字,仅LDR)、H(无符号半字)和SB(带符号字节,仅LDR)。*指令说明:指令用于加载寄存器16位半字或带符号8位字节,存储寄存器16位半字。带符号加载是指带符号扩展到32位。无符号半字加载是指零扩展到32位。

半字传送的地址必须是偶数,即按照半字对准。关于非对准的情况比较复杂,可参考ARM编程模型中非对准的叙述或相关手册。

.不能将半字或字节加载到R15。例:LDREQSH R11,[R6] ;R11←[R6],条件执行,加载半字,带符号扩展到32位LDRH R1,[R0,#12] ;R1←[R0+12],加载半字,零扩展到32位STRH R4,[R0,R1]! ;R4→[R0+R1],存储R4最低有效半字到R0+R1地址开始的两个字节, ;地址写回到R0LDRSB R1,[R6],R3,LSL#4 ;错误,这种格式只对字和无符号字节传送有效

.(3)双字。*句法:op{cond}DRd,[Rn] ;零偏移op{cond}DRd,[Rn,offset]{!} ;前索引偏移op{cond}DRd,label ;程序相对偏移op{cond}DRd,[Rn],offset ;后索引偏移

.*指令说明:指令用于加载或存储两个相邻寄存器64位双字。对于双字传送,地址必须是8的倍数。例:LDRD R6,[R11] ;R6←[R11],R7←[R11]+4LDRD R1,[R6] ;错误,Rd必须是偶数STRD R4,[R9,#24] ;R4→[R9+24],R5→[R9+24]+4STRD R14,[R9,#24] ;错误,Rd不允许是R14STRD R2,[R3],R6 ;错误,Rn不允许是Rd或R(d+1).2)LDM、STM*句法:op{cond}modeRn{!},reglist{^}*符号说明:mode:包括IA——每次传送后地址加1IB——每次传送前地址加1DA——每次传送后地址减1DB——每次传送前地址减1FD——满递减堆栈ED——空递减堆栈FA——满递增堆栈EA——空递增堆栈

.

Reglist:加载或存储的寄存器列表,包含在括号中,也可以包含寄存器的范围,必须用逗号隔开。

^:可选后缀。

不允许在用户模式或系统模式下使用。

用途包括以下两点:

若op是LDM,且reglist中包含R15,则进行多寄存器传送时,也将SPSR拷贝到CPSR;用于从异常返回,仅在异常模式下使用。数据传送的是用户模式的寄存器,而不是当前模式的寄存器。

.*指令说明:指令用于加载或存储多个寄存器,可传送R0~R15的任何组合。指令忽略地址的位[1:0]。到R15的加载将引起处理器转移到加载地址处的指令。如果Rn包含在寄存器列表中,且用“!”表明要写回,那么若op是STM,且Rn是寄存器列表中数字最小的寄存器,则Rn的初值被保存;否则,Rn的加载和存储值不可预知。

.例:LDMIA R8,{R0,R2,R9}STMDB R1!,{R3-R6,R11,R12}STMFD R13!,{R0,R4-R7,LR};寄存器进栈LDMFD R13!,{R0,R4-R7,PC};寄存器出栈,从子程序返回STMIA R5!,{R5,R4,R9} ;错误,R5的值不可预知LDMDA R2,{} ;错误,列表中至少要有一个寄存器

.

5.ARM数据处理指令

ARM数据处理指令的特点包括:

(1)操作数为32位,来自寄存器或定义的立即数。对于操作数可进行符号扩展和零扩展。

(2)处理结果除了长乘法指令为64位之外,其余均为32位,存放在寄存器中。

(3)大多数ARM通用数据处理指令都有一个灵活的第二操作数(flexiblesecondoperand)。

.第二操作数operand2可以是立即数形式或寄存器形式。立即数形式——#32位立即数。可以是取值为数字常量的表达式。有效的立即数必须可由8位立即数循环右移偶数位得到。寄存器形式——Rm,{#shift}。可对Rm进行移位或循环移位。shift用来指定移位类型和移位位数。移位位数可以是5位立即数或寄存器。

.移位操作包括:

ASR:算术右移,即将寄存器内容除以2n,寄存器内容看作带符号的补码整数。

LSR:逻辑右移,即将寄存器内容除以2n,寄存器内容看作无符号整数。

LSL:逻辑左移,即将寄存器内容乘以2n,寄存器内容看作无符号整数。

ROR:循环右移。

RRX:带扩展的循环右移。将寄存器内容循环右移1位,进位标志拷贝到位[31]。..ARM数据处理指令可以完成的功能包括:数据传送、算术运算、逻辑运算、比较、测试、乘法等。

1)算术运算指令——ADD、SUB、RSB、ADC、SBC、RSC

*句法:

op{cond}{S}Rd,Rn,Operand2

*符号说明:

S:可选后缀。若指定S,则根据操作结果更新条件码标志(N、Z、C、V)。

Rd:ARM结果寄存器。

Rn:ARM第一操作数寄存器。

Operand2:灵活的第二操作数。.

*指令说明:指令用于加、减、反减等算术运算,包括带进位的算术运算。ADD指令用于将Rn和Operand2的值相加。SUB指令用于从Rn的值中减去Operand2的值。RSB指令用于从Operand2的值中减去Rn的值。反减的优点在于Operand2的可选范围宽,因此扩展了减数的使用范围。ADC、SBC和RSC指令分别是ADD、SUB和RSB指令带进位的减法运算。可用于多个字的运算。算术运算中如果使用R15作为Rn,则其值为指令的地址加8。如果使用R15作为Rd,则执行转移到结果相应的地址;或者在使用“S”的情况下,拷贝SPSR到CPSR,利用这点可从异常返回。.

在有寄存器控制移位的任何数据处理指令中,不能将R15作为Rd或任何操作数来使用。例:ADD R2,R1,R3SUBS R8,R6,#240 ;根据结果设置标志RSB R4,R4,#1280 ;R4←1280-R4ADCHI R11,R0,R3 ;只有标志C置位且标志Z清零时才执行RSCLESR0,R5,R0,LSLR4;条件执行,设置标志,第二操作数逻辑左移RSCLESR0,R15,R0,LSLR4 ;错误,R15不允许与被控制移位的寄存器同时使用.下面两条指令将R2和R3中的64位整数与R0和R1中的64位整数相加,结果放在R4和R5中:ADDS R4,R0,R2 ;加低有效字

ADC R5,R1,R3 ;加高有效字下面的指令进行96位减法:

SUBS R3,R6,R9

SBCS R4,R7,R10SBC R5,R8,R11.

2)逻辑运算指令——AND、ORR、EOR、BIC*句法:

op{cond}{S}Rd,Rn,Operand2*指令说明:

指令用于与、或、异或、位清零等逻辑运算。其中,AND、ORR、和EOR指令分别完成逻辑与、逻辑或、逻辑异或的运算,操作数是Rn和Operand2的值;BIC指令用于将Rn中的位与Operand2值中的相应位的反码进行“与”操作。若指定S,则指令将根据结果更新标志N和Z;计算Operand2时更新标志C;不影响标志V。关于R15的使用与算术运算指令相同。.例:

AND R9,R2,#0xFF00

ORREQ R2,R0,R5 ;条件执行

EORS R0,R0,R3,RORR6 ;设置标志,第二操作数循环右移

BICNES R8,R10,R0,RRX;第二操作数带扩展循环右移

EORS R0,R15,R3,RORR6 ;错误,R15不允许与被控制移位的寄存器同时使用.

3)数据传送指令——MOV、MVN

*句法:

op{cond}{S}Rd,Operand2*指令说明:

指令用于数据传送。其中,MOV指令将Operand2的值拷贝到Rd;MVN指令对Operand2的值按位取非后,将结果拷贝到Rd。关于条件码标志的影响与逻辑运算指令相同。关于R15的使用与算术运算指令相同。.例:MOV R5,R2MVNNE R11,#0x0F000000

;条件执行MOVS R0,R0,ASRR3

;设置标志,第二操作数 算术右移.4)比较指令——CMP、CMN*句法:

op{cond}{S}Rd,Operand2

*指令说明:

指令用于比较操作,根据结果更新条件码标志,结果并不放入寄存器。其中,CMP指令从Rn的值中减去Operand2的值,结果丢弃;CMN指令将Operand2的值加到Rn的值中,结果丢弃。如果将R15用作Rn,则使用的值是指令的地址加8。在控制寄存器移位的操作中,不能使用R15。.例:CMP R2,R9CMN R0,#6400CMPGT R13,R7,LSL#2

;条件执行,第二操作数逻辑左移CMP R2,R15,ASRR0

;错误,R15不允许与控制移位的寄存器同时使用.

5)测试指令——TST、TEQ

*句法:

op{cond}{S}Rd,Operand2

*指令说明:

指令用于测试操作,根据结果更新条件码标志,结果不放入寄存器。其中,TST指令对Rn的值与Operand2的值进行按位“与”操作,结果丢弃;TEQ指令对Rn的值与Operand2的值进行按位“异或”操作,结果丢弃。关于条件码标志的影响与算术运算指令相同。.关于R15的使用与比较指令相同。例:TST R0,#0x3F8TEQEQ R10,R9 ;条件执行TSTNE R1,R5,ASRR1

;条件执行,第二操作数算术右移TEQ R15,R1,RORR0

;错误,R15不允许与控制移位的寄存器同时使用.6)乘法指令——MUL、MLA*句法:MUL{cond}{S}Rd,Rm,RsMLA{cond}{S}Rd,Rm,Rs,Rn*符号说明:Rd:结果寄存器。Rm、Rs、Rn:操作数寄存器。

.

*指令说明:

指令用于进行乘法和乘加32位×32位运算,结果为低32位。其中,MUL指令将Rm和Rs中的值相乘,并将最低有效的32位结果放入Rd中;MLA指令将Rm和Rs中的值相乘,再加上Rn的值,并将最低有效的32位结果放入Rd中。如果指定S,则指令根据结果更新标志N和Z;不影响标志V;在ARMv4之前版本中标志C不可靠;在ARMv5以后版本中不影响标志C。R15不能用作Rd、Rm、Rs或Rn。Rd不能与Rm相同。.例:MUL R10,R2,R5MLA R10,R2,R1,R5MULS R0,R2,R2

;影响标志MULLT R2,R3,R2

;条件执行MLAVCS R8,R6,R3,R8 ;条件执行,影响标志MUL R15,R0,R3

;错误,不允许使用R15MLA R1,R1,R6

;错误,Rd不能与Rm相同

.7)CLZ

*句法:CLZ{cond}Rd,Rm

*指令说明:

指令用于对Rm中值的前导零的个数进行计数,结果放入Rd中。若Rm内容为0,则结果为32;若Rm位[31]为1,则结果为0。指令不影响条件码标志。Rd不允许是R15。.

6.ARM分支指令1)B、BL

*句法:B {cond} labelBL{cond}label*指令说明:

指令用于分支和带链接分支的操作。其中,B指令引起处理器转移到label;BL指令将下一条指令的地址拷贝到R14(LR,链接寄存器),并引起处理器转移到label。.

2)BX

*句法:BX {cond} Rm

*符号说明:

Rm:含转移地址的寄存器。Rm的位[0]不用来作为地址的一部分。若Rm的位[0]为1,则指令将CPSR中的标志T置位,且将目标地址的代码解释为Thumb代码。若Rm的位[0]为0,则位[1]就不能为1。.*指令说明:指令用于实现分支,并可选地交换指令集。BX指令将引起处理器转移到Rm中的地址。若Rm的位[0]为1,则指令集变换到Thumb指令集。

例:

BX R6.

3)BLX

*句法:

BLX{cond}Rm*指令说明:

指令用于实现带链接分支,并可选地交换指令集。指令有两种形式:带链接无条件转移到程序相对偏移地址;带链接有条件转移到寄存器中的绝对地址。

BLX指令具体用途有:将下一条指令的地址拷贝到R14(LR,链接寄存器)中;转移到label或Rm中的地址;切换到Thumb指令集,条件是Rm的位[0]为1或者使用“BLXlabel”的形式。.

7.ARM协处理器指令

1)协处理器的数据操作指令——CDP

2)协处理器的数据传送指令——LDC3)协处理器的寄存器传送指令——MCR、MRC.

8.ARM杂项指令

1)软件中断指令——SWI

*句法:

SWI {cond}immed_24

*符号说明:

immed_24: 表达式,其值为0~224-1范围内的整数。*指令说明:

SWI指令引起处理器SWI异常,即处理器变为管理模式,CPSR内容保存到管理模式的SPSR中,执行转移到SWI向量。这条指令不影响条件码标志。.

2)断点指令——BKPT

*句法:BKPTimmed_16*符号说明:

immed_16:表达式,其值为0~216范围内的整数。*指令说明:

BKPT指令使处理器进入调试模式,调试工具可利用这条指令到达特定的地址时查询系统状态。.3)PSR操作指令——MRS、MSR*句法:MRS {cond}Rd,psrMSR {cond}psr_fields,#immed_8rMSR {cond}psr_fields,Rm*符号说明:psr:CPSR或SPSR。fields:指定传送的区域,包括:

c 控制域屏蔽字节(PSR[7:0]) x 扩展域屏蔽字节(PSR[15:8]) s 状态域屏蔽字节(PSR[23:16]) f 标志域屏蔽字节(PSR[31:24])

.immed_8r:表达式,其值为对应8位位图的数字常量,该位图在32位字中循环移位,每次移动偶数位。*指令说明:

PSR操作指令MRS和MSR配合使用,可用来更新PSR的读-修改-写序列的一部分,如改变处理器模式或清除标志Q。其中MRS指令将PSR的内容传送到通用寄存器;MSR指令用立即数或通用寄存器的内容加载PSR的指定区域。.9.ARM伪指令

顾名思义,伪指令并不是真正的指令。伪指令在编译器对程序进行汇编处理时被替换成相应的指令序列。使用伪指令的目的在于简化程序编写。

ARM伪指令包括ADR、ADRL、LDR和NOP。

1)ADR、ADRL、LDR*句法:

ADR{cond}register,exprADRL{cond}register,exprLDR{cond}register,=[expr|label-expr].

*符号说明:

register:加载的寄存器。expr:PC或寄存器相对偏移表达式。对于LDR指令,被赋值成数字常量。label-expr:程序相对偏移或外部表达式。.2)空操作——NOP*句法:NOP*指令说明:NOP伪指令在汇编时被替换成ARM的空操作,如“MOVR0,R0”等。NOP伪指令不能有条件执行。NOP伪指令不影响CPSR中的条件标志位。

.2.4.4Thumb指令集

1.Thumb指令集概述

Thumb指令集是ARM指令集压缩形式的子集。由于Thumb指令是16位的,因此使用Thumb指令可以提高代码密度。所有的Thumb指令都有相对应的ARM指令,Thumb编程模型也对应ARM编程模型。在ARM指令流水线中实现Thumb指令必须先进行动态解压缩,然后再作为标准ARM指令执行。.1)Thumb指令集编码Thumb指令集编码如图所示。.

2)Thumb编程模型Thumb指令集只能对限定的ARM寄存器进行操作。Thumb编程模型如图所示。

说明:

R13~R15被扩展作为特殊应用,R13用作堆栈指针SP,R14用作链接寄存器LR,R15用作程序计数器PC。阴影寄存器R8~R12访问受限。

CPSR的条件标志位由算术和逻辑操作设置并控制转移。

..

3)Thumb状态切换CPSR的T位决定ARM处理器执行的是ARM指令流还是Thumb指令流。若T置1,则认为是Thumb指令流;若T置0,则认为是ARM指令流。

(1)进入Thumb状态。系统复位后,处理器处于ARM状态。执行BX指令,将转移地址寄存器的位[0]置1,其他位放入PC,即可进入Thumb状态。

(2)退出Thumb状态。退出Thumb状态的方法与进入Thumb状态的方法相对应,使用BX指令,将转移地址寄存器的位[1:0]置为b00,即可退出Thumb状态。如果发生异常,无论处理器当前的工作状态如何,异常都会使处理器返回到ARM状态。.

4)Thumb指令集与ARM指令集的区别

(1)Thumb指令除了分支B指令外大多是无条件执行的。

(2)大多数Thumb指令采用2地址格式,即目的寄存器和源寄存器。(3)Thumb指令集没有协处理器指令、信号量(semaphore)指令和访问PSR的指令。(4)Thumb分支指令与ARM分支指令相比,在寻址范围上有更多限制。(5)Thumb数据处理指令访问R8~R15受限。除MOV和ADD指令访问R8~R15外,数据处理指令总是更新CPSR的ALU状态标志。访问R8~R15的Thumb数据处理指令不能更新标志。.

(6)Thumb的寄存器Load/Store指令只能访问R0~R7。PUSH和POP指令使用堆栈指针R13(SP)作为基址实现满递减堆栈。除传送R0~R7外,PUSH还可用于存储链接寄存器R14(LR),POP还可用于加载程序计数器指针PC。(7)Thumb伪指令不支持ADRL。.2.Thumb存储器访问指令

1)LDR、STR——立即数偏移

*句法:

op Rd,[Rn,#immed_5×4]opH Rd,[Rn,#immed_5×2]opB Rd,[Rn,#immed_5×1]

*符号说明:

H:指明无符号半字传送的参数。B:指明无符号字节传送的参数。Rd:加载和存储寄存器。Rd只能在R0~R7范围内。immed_5×N:偏移量表达式。其取值是N的倍数,在0~31N范围内。.

*指令说明:指令用于加载和存储寄存器,寄存器的地址用一个寄存器的立即数偏移(immediateoffset)指明。字传送的地址必须可被4整除,半字的传送必须可被2整除。例:LDR R3,[R5,#0]STRB R0,[R3,#31] ;字节传送STRH R7,[R3,#16] ;半字传送LDR R13,[R3,#40] ;错误,只能使用R0~R7STRB R0,[R3,#32] ;错误,32超出了字节传送的范围STRH R7,[R3,#15] ;错误,半字传送的偏移量必须是偶数LDRH R6,[R0,#-6] ;错误,不支持负偏移量.2)LDR、STR——寄存器偏移*句法:op Rd,[Rn,Rm]*符号说明:op:op可以是LDR 加载寄存器,4字节字;STR 存储寄存器,4字节字;LDRH 加载寄存器,2字节无符号半字;LDRSH 加载寄存器,2字节带符号半字;STRH 存储寄存器,2字节半字;LDRB 加载寄存器,无符号字节;LDRSB 加载寄存器,带符号半字;STRB 存储寄存器,字节。

.*指令说明:

指令用于加载和存储寄存器,存储器的地址用基址寻址方式指明,即Rn中的基址加上偏移量形成存储器的地址。数据传送可以是字、半字或字节。加载的数据被放到Rd的最低有效位。对于无符号加载,Rd的其余位补0;对于带符号加载,Rd的其余位拷贝符号位。注意,存储指令带符号和无符号没有区别。字传送的地址必须可被4整除,半字传送的地址必须可被2整除。.例:LDR R2,[R1,R5]LDRSH R0,[R0,R6] ;加载带符号半字STRB R1,[R7,R0] ;存储字节LDR R13,[R5,R3] ;错误,只能使用R0~R7STRSH R7,[R3,R1] ;错误,没有带符号的存储指令.3)LDR、STR——PC或SP相对偏移*句法:LDR Rd,[PC,#immed_8×4]LDR Rd,labelLDR Rd,[SP,#immed_8×4]LDR Rd,[SP,#immed_8×4].*符号说明:immed_8×4:偏移量表达式。取值为4的整数倍,范围在0~1020内。label:程序相对偏移表达式。必须在当前指令之后1KB范围内。

*指令说明:

指令用于加载和存储寄存器,存储器的地址用PC或SP的立即数偏移指明,即PC或SP的基址加上偏移量形成存储器地址。其中,PC的位[1]被忽略,确保了地址字对准。注意,没有PC相对偏移的STR指令;地址必须是4的整数倍。.例:LDR R2,[PC,#1016]LDR R5,localdataLDR R0,[SP,#920]STR R1,[SP,#20]LDR R13,[PC,#8] ;错误,Rd只能使用R0~R7STR R7,[PC,#64] ;错误,STR指令没有PC相对偏移STRH R0,[SP,#16] ;错误,半字或字节传送没有PC或SP相对偏移LDR R2,[PC,#81] ;错误,立即数必须是4的整数倍LDR R1,[PC,#-24] ;错误,立即数不能是负数STR R1,[SP,#1024] ;错误,立即数最大为1020.

4)PUSH、POP

*句法:

PUSH {reglist}POP {reglist}PUSH {reglist,LR}POP {reglist,PC}

*符号说明:

reglist:寄存器列表。只能使用R0~R7。列表中至少必须有1个寄存器。.

*指令说明:

指令用于寄存器和可选的LP进栈以及寄存器和可选的PC出栈。Thumb堆栈是满递减堆栈,即堆栈向下增长,SP指向堆栈的最后入口。寄存器以数字顺序存储在堆栈中,最低数字的寄存器其地址最低。对于ARMv5以上版本,若加载PC位[1:0]的值是b00,则处理器转换到ARM状态,其中PC位[1]不允许是1。对于ARMv4T以前版本,PC位[1:0]被忽略,因此POP指令不能改变处理器工作状态。这些指令不影响条件码标志。.例:PUSH {R1,R4-R7}PUSH {R0,LR}POP {R0-R7,PC} ;出栈并从子程序返回PUSH {R3,R5-R8} ;错误,不允许使用高寄存器PUSH {} ;错误,列表中至少必须有1个寄存器PUSH {R1-R4,PC} ;错误,PC不能入栈POP {R1-R4,LR} ;错误,不能弹出LR.

5)LDMIA、STMIA

*句法:

opRn!,{reglist}

*指令说明:

指令用于加载和存储多个寄存器。寄存器以数字顺序加载或存储,最低数字的寄存器存储在Rn的初始化地址中。Rn的值以reglist中寄存器个数的4倍增加。

.例:LDMIA R5!,{R0-R7}STMIA R3!,{R3,R5,R7}LDMIA R3!,{R0,R9} ;错误,不允许使用高寄存器STMIA R5!,{} ;错误,列表中至少必须有1个寄存器STMIA R5!,{R1-R6} ;错误,从R5存储的值不可预知.3.Thumb数据处理指令1)算术运算指令——ADD、SUB、ADC、SBC、MUL*句法:op Rd,Rn,Rm ;对低寄存器操作,Rd←Rn+Rm或Rd←Rn-Rmop Rd,Rn,#expr3 ;对低寄存器操作,Rd←Rn+expr3或Rd←Rn-expr3op Rd,#expr8 ;对低寄存器操作,Rd←Rd+expr8或Rd←Rd-expr8op SP,#expr ;SP←SP+expr或SP←SP-expropp Rd,Rm ;对低寄存器操作,ADC带进位加、SBC带进位减、MUL乘法ADD Rd,Rp,#expr ;Rd必须为低寄存器,Rd←Rp+exprADD Rd,Rm ;对高/低寄存器操作,Rd←Rd+Rm.*符号说明:expr3:取值为在-7~+7范围内的整数。expr8:取值为在-255~+255范围内的整数。Rp:SP或PC。op:ADD或SUB。opp:ADC、SBC或MUL。

*指令说明:

指令用于算术运算,具体含义可参见每句注释。需要说明的是,如果使用的是低寄存器,则会影响到条件码标志。

.例:ADDR3,R1,R5SUB R0,R4,#5ADDR7,#201ADDSP,#312SUB SP,#96ADCR2,R4ADDR6,SP,#64ADDR2,PC,#980ADDR2,R4ADDR12,R4ADDR9,R2,R6 ;错误,不允许使用高寄存器SUBR4,R5,#201 ;错误,立即数超出范围

.

2)逻辑运算指令——AND、ORR、EOR、BIC

*句法:

op Rd,Rm

*指令说明:

指令用于逻辑运算。其中,AND指令进行逻辑“与”运算,ORR指令进行逻辑“或”运算,EOR指令进行逻辑“异或”运算,BIC指令进行“RdANDNOTRm”运算。Rd和Rm必须使用低寄存器。这些指令根据结果更新标志N和Z。

例:

AND R2,R4.

3)移位指令——ASR、LSL、LSR、ROR

*句法:op Rd,Rs ;寄存器控制移位op Rd,Rm,#expr ;立即数移位

*符号说明:

Rs:包含移位量的寄存器。expr:立即数偏移量表达式。取值范围是:若执行LSL,则为0~31的整数;其余为1~32的整数。

.*指令说明:

指令用于移位操作。其中,ASR指令进行算术右移,LSL指令进行逻辑左移,LSR指令进行逻辑右移,ROR指令进行循环右移。Rd、Rs、Rm必须使用低寄存器。ROR指令仅能与寄存器控制的移位一起使用。这些指令根据结果更新标志N和Z,不影响标志V。若移位量为0,则标志C不受影响;否则,C将包含源寄存器的最后移出位。

.例:ASR R3,R5LSR R0,R2,#6LSR R0,R4,#0 ;除了不影响标志C和V外,等同于“MOVR0,R4”RORR2,R7,#3 ;ROR不能使用立即数移位LSL R9,R1 ;错误,不允许使用高寄存器LSL R0,R7,#32 ;错误,立即数移位超出范围ASR R0,R7,#0 ;错误,立即数移位超出范围

.4)比较指令——CMP、CMN*句法:CMPRn,#exprCMPRn,RmCMNRn,Rm*符号说明:expr:取值范围为在0~255范围内的整数。

.*指令说明:

指令用于比较操作。其中,CMP指令从Rn的值中减去expr或Rm的值,CMN指令将Rn和Rm的值相加。对于第1、3条指令,Rn和Rm必须使用低寄存器;对于第2条指令,Rn和Rm可以使用R0~R15中的任何寄存器。这些指令更新条件码标志,但不在寄存器保存结果。

.例:CMPR2,#255CMPR7,R12CMNR1,R0CMPR2,#508 ;错误,立即数超出范围CMPR9,#24 ;错误,立即数不允许和高寄存器一起出现CMNR1,R10 ;错误,CMN不允许与高寄存器一起出现

.5)数据传送指令——MOV、MVN、NEG*句法:Op Rd,RmMOV Rd,#expr*符号说明:expr:取值范围为在0~255范围内的整数。

.

*指令说明:

指令用于进行数据传送。其中,MOV指令将#expr或Rm的值放入Rd;MVN指令从Rm取值,按位逻辑“非”后,将结果放入Rd;NEG指令取Rm的值,乘以-1后,将结果放入Rd。除了“MOVRd,Rm”指令中Rd和Rm可以使用R0~R15中的任何寄存器之外,其余指令Rd和Rm必须使用低寄存器。“MOVRd,#expr”和MVN指令更新标志N和Z,对标志C和V无影响。NEG指令更新标志N、Z、C和V。

.对于“MOVRd,Rm”指令,如果Rd或Rm使用高寄存器,则标志不受影响;如果Rd和Rm都使用低寄存器,则更新标志N和Z,清除标志C和V。如果希望在低寄存器之间传送数据而不清除标志C和V,可使用移位为0的LSL指令。例:

MOVR3,#0MOVR0,R12 ;不更新标志MVNR7,R1NEGR2,R2MOVR2,#256 ;错误,立即数超出范围MOVR8,#3 ;错误,不能传送立即数到高寄存器MVNR8,R2 ;错误,MVN和NEG指令不允许使用高寄存器NEGR0,#3 ;错误,MVN和NEG指令不允许使用立即数

.

6)测试指令——TST

*句法:

TST Rn,Rm

*指令说明:

指令用于测试位操作。TST指令将Rn和Rm中的值按位“与”操作,更新条件码标志N和Z,不影响C和V,结果不放入寄存器。Rn和Rm必须使用低寄存器。例:

TST R2,R4.

4.Thumb分支指令

1)B*句法:

B{cond} label

*符号说明:label:程序相对转移表达式,通常是在同一代码块内的标号。如果有条件,则label必须在当前指令的-252~+256B范围内;如果无条件,则label必须在±2KB范围内。.*指令说明:

这是Thumb指令集中唯一的有条件指令。如果条件满足(或不使用条件),则B指令使处理器转移到label。B指令使用的条件与ARM指令集中的条件基本相同。例:B dloopBEG sectB.

2)BL

*句法:

BL label

*指令说明:

BL指令是带链接的长分支指令,它将下一条指令的地址拷贝到链接寄存器R14(LR),并使处理器转移到label。机器级指令不能转移到当前指令±4KB范围以外的地址。必要时,可使用ARM链接器插入代码以允许更长的转移。

例:BL extract

.

3)BX

*句法:

BX Rm

*指令说明:

BX指令除了完成分支外,还可以可选地交换指令集。其中,Rm的位[0]不用于地址部分,若Rm的位[0]清零,则位[1]也必须清零,指令将清除CPSR中的标志T,目的地址的代码被解释为ARM代码。例:

BX R5.

4)BLX

*句法:

BLX RmBLX label

*指令说明:

BLX指令是带链接的分支指令,且可以可选地交换指令集。关于转移范围的说明同BL指令,关于Rm的说明同BX指令。.BLX指令可用于:拷贝下一条指令的地址到R14;引起处理器转移到label或Rm存储的地址;如果Rm的位[0]清零,或使用“BLXlabel”的形式,则指令集切换到ARM状态。例:BLX R6BLX armsub.5.Thumb中断和断点指令1)SWI*句法:SWIimmed_8*符号说明:immed_8:取值范围为0~255范围内的整数。

.

*指令说明:SWI指令引起SWI异常。处理器切换到ARM状态、管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量地址。异常处理程序利用immed_8来确定正在请求何种服务。该指令不影响条件码标志。

例:

SWI12.

2)BKPT

*句法:

BKPT immed_8

*指令说明:

BKPT指令使处理器进入调试模式。调试工具可利用该指令查询到达特定地址的指令时的系统状态。调试器利用immed_8来保存有关断点的附加信息。

例:BKPT 67.

6.Thumb伪指令

1)ADR

*句法:ADR register,expr*符号说明:

expr:程序相对偏移量表达式。偏移量必须是正数,且小于1KB。expr必须局部定义,不能被导入。

*指令说明:

ADR伪指令将程序相对偏移地址加载到寄存器中。在Thumb状态,ADR仅可以产生字对准地址。使用ALIGN指令来确保expr是对准的。expr必须被赋值成与ADR伪指令在同一代码区域的地址。

.例:ADR R4,txampl ;=>ADDR4,PC,#nn;codeALIGNtxampl DCW 0,0,0,0.

2)LDR

*句法:

LDR register,=[expr|label-exp]

*符号说明:

expr:赋值成数字常量。若expr值在MOV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论