ARM寻址方式与指令系统_第1页
ARM寻址方式与指令系统_第2页
ARM寻址方式与指令系统_第3页
ARM寻址方式与指令系统_第4页
ARM寻址方式与指令系统_第5页
已阅读5页,还剩103页未读 继续免费阅读

下载本文档

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

文档简介

第三章ARM寻址方式与指令系统嵌入式系统原理与接口技术2内容提要思考题

Thumb指令集ARM指令集

ARM指令格式和寻址方式

ARM编程模型(第二章已讲)

3机器指令、伪指令和宏指令机器指令能被处理器直接执行,而汇编指令、伪指令和宏指令不能。机器指令包括ARM指令集和Thumb指令集。伪指令是在源程序汇编期间,由汇编编译器处理。其作用是为汇编程序完成准备工作。宏指令在程序中用于调用宏,宏是一段独立的程序代码;在程序汇编时,对宏调用进行展开,用宏体代替宏指令。4内容提要思考题

Thumb指令集

ARM指令集

ARM指令格式和寻址方式

ARM编程模型

53.1ARM编程模型

3.1.2处理器工作状态3.1.3寄存器组织

3.1.4异常中断

3.1.1处理器模式63.1.1处理器模式

ARM微处理器支持7种工作模式;除用户模式之外的其余6种称为非用户模式,或特权模式(PrivilegedModes);而特权模式中,除系统模式之外的其余5种又称为异常模式(ExceptionModes),不同的工作模式间可以相互切换。处理器的各种工作模式由当前程序状态寄存器CPSR的低4位M[4:0]决定,对应关系如下表。7处理器模式用于高速数据传输或通道处理10001

快速中断模式(fiq)运行特权级的操作系统任务11111系统模式(sys)用于支持硬件协处理器的软件仿真11011未定义指令模式(und)用于虚拟存储及存储保护10111中止模式(abt)操作系统的保护模式10011管理模式(svc)用于通用的中断处理

10010外部中断模式(irq)正常的程序执行状态10000

用户模式(usr)功能M[4:0]工作模式非用户模式或特权模式

异常模式

83.1.2处理器工作状态从编程的角度来讲,ARM处理器可工作在两种状态:ARM状态或Thumb状态,并可在两种状态间进行切换。ARM状态:处理器执行32位的ARM指令集时,工作在此状态;Thumb状态:处理器执行16位的Thumb指令集时,工作在此状态。93.1.3寄存器组织ARM处理器总共有37个寄存器,各寄存器均为32位。31个通用寄存器,包括程序计数器PC;6个状态寄存器。10

寄存器组织11通用寄存器1.通用寄存器:包括R0~R15,以及程序计数器PC。R0~R7称为不分组寄存器;R8~R12有两组物理寄存器。一组属于快速中断模式(R8_fiq~R12_fiq),另一组属于其它模式(R8_usr~R12_usr);R13和R14有6组物理寄存器。其中用户模式和系统模式共用一组。寄存器R13通常作为堆栈指针(SP),寄存器R14常用作连接寄存器(LR)寄存器R15,又称为PC12状态寄存器2.状态寄存器:当前程序状态寄存器CPSR,可以在任何工作模式下被访问程序状态备份寄存器SPSR,只有在异常模式下,才能被访问负数标志零标志进位标志溢出标志中断请求禁用快速中断请求禁用处理器工作模式NzcvFIM0M1M2M3M413状态寄存器对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。V有3种情况会改变C的值:加法运算(包括比较指令CMN):当运算结果产生了进位时(无符号数上溢出),C=1,否则C=0。减法运算(包括比较指令CMP):当运算时产生了借位(无符号数下溢出),C=0,否则C=1。对于包含移位操作的非加/减运算指令,C为移出值的最后一位CZ=1表示运算的结果为零;Z=0表示运算的结果不为零;Z当两个补码表示的带符号数运算时,N=1表示运算的结果为负数;N=0表示运算的结果为正数或零;N含义标志位条件标志位

14状态寄存器对于ARMv4以上版本的T系列处理器,T=0,表示执行ARM指令,否则,表示执行Thumb指令;对于ARMv5以上版本的非T系列处理器,T=0,表示指令ARM指令,否则,表示强制下一条执行的指令产生未定义指令中断。TF=1,表示禁止FIQ中断;否则,表示允许FIQ中断FI=1,表示禁止IRQ中断;否则,表示允许IRQ中断I在ARMv5及以上版本的E系列处理器中,用Q标志位指示增强的DSP运算指令是否发生了溢出。Q含义标志位条件标志位

控制位

15状态寄存器PC,R0~R12,R13_und~R14_und,CPSR,SPSR_und未定义指令模式11011PC,R0~R14,CPSR系统模式11111PC,R0~R12,R13_abt~R14_abt,CPSR,SPSR_abt中止模式10111PC,R0~R12,R13_svc~R14_svc,CPSR,SPSR_svc管理模式10011PC,R0~R12,R13_irq~R14_irq,CPSR,SPSR_irq外部中断模式10010PC,R0~R7,R8_fiq~R14_fiq,CPSR,SPSR_fiq快速中断模式10001PC,R0~R14,CPSR用户模式10000可访问的寄存器处理器工作模式M[4:0]M[4:0]含义标志位控制位

163.1.4异常中断异常中断是指处理器由于外部或内部的原因,停止执行当前任务,转而处理特定的事件,处理完后返回原程序,继续执行。ARM共有7种类型的异常,不同类型的异常将导致处理器进入不同的工作模式,并执行不同特定地址的指令。各异常类型具有不同的优先级,如下表所示17异常中断30xFFFF001C0x0000001C快速中断模式快速中断请求(FIQ)40xFFFF00180x00000018外部中断模式外部中断请求(IRQ)20xFFFF00100x00000010中止模式数据访问中止50xFFFF000C0x0000000C中止模式指令预取中止60xFFFF00080x00000008管理模式软件中断(SWI)60xFFFF00040x00000004未定义指令中止模式未定义指令10xFFFF00000x00000000管理模式复位优先级特定地址(高端)特定地址(低端)工作模式异常类型18举例

1.整个地址空间的起始位置(地址0x00000000开始)有以下指令

对应地址

b SYS_RST_HANDLER ; 0x00000000 b UDF_INS_HANDLER ; 0x00000004 b SWI_SVC_HANDLER ; 0x00000008 b INS_ABT_HANDLER ; 0x0000000c b DAT_ABT_HANDLER ; 0x00000010 b . ; b IRQ_SVC_HANDLER ; 0x00000018 b FIQ_SVC_HANDLER ; 0x0000001c

一旦发生外部中断请求,处理器首先自动保存当前状态,进入外部中断模式

接着执行地址0x00000018处的指令,即bIRQ_SVC_HANDLER

跳转到标号IRQ_SVC_HANDLER处开始执行PC->R14CPSR->SPSR19举例2.IRQ_SVC_HANDLER处的代码为:

IRQ_SVC_HANDLER sub lr,lr,#4 stmfd sp!,{r0-r3,lr} ldr r0,=IRQ_SVC_Vector ldr pc,[r0]处理器将通用寄存器和返回地址压入堆栈IRQ_SVC_Vector为外部中断请求的中断向量跳转到外部中断请求的中断服务程序中20内容提要思考题

Thumb指令集

ARM指令集

ARM指令格式和寻址方式

ARM编程模型(第二章已讲)

213.2ARM指令格式和寻址方式

3.2.1ARM指令的一般格式3.2.2条件域<cond>3.2.3寻址方式

223.2.1ARM指令的一般格式ARM指令的编码格式首先来看一条实际的指令,其语法结构(助记符)为

ADDEQSR0,R1,R231~2827~2524~212019~1615~1211~0cond

opcodeSRnRdop200000010100100010000000000000010该指令的编码格式为:23ARM指令的一般格式ARM指令的助记符

ARM指令在汇编程序中用助记符表示,一般ARM指令的助记符格式为:

<opcode>{<cond>}{S}<Rd>,<Rn>,<op2>例:ADDEQSR1,R2,#5操作码决定指令执行的条件域决定指令执行是否影响CPSR寄存器的值第一个操作数,为寄存器目的寄存器第二个操作数其中操作码opcode为ADD,条件域cond为EQ,表示该指令只有当CPSR中Z标志置位时才执行,目的寄存器Rd为R1,第一个操作数寄存器Rn为R2,第二个操作数op2为5;执行的结果为R1=R2+5,S表示将影响CPSR寄存器的值。243.2.2条件域<cond>溢出V置位VS正数或零N清零PL负数N置位MI无符号数小于C清零CC无符号数大于或等于C置位CS不相等Z清零NE相等Z置位EQ含义CPSR中标志位cond25

条件域<cond>含义CPSR中标志位cond无条件执行忽略AL 带符号数小于或等于Z置位或(N不等于V)LE带符号数大于Z清零且(N等于V)GT带符号数小于N不等于VLT带符号数大于或等于N等于VGE无符号数小于或等于C清零Z置位LS无符号数大于C置位Z清零HI未溢出V清零VC263.2.3寻址方式立即数寻址寄存器寻址寄存器移位寻址寄存器间接寻址基址变址寻址相对寻址多寄存器寻址块拷贝寻址堆栈寻址

所谓寻址方式,就是根据指令中操作数的信息寻找操作数实际物理地址的方式。依据指令中给出的操作数的不同格式,ARM指令系统具有以下几种常见的寻址方式。27立即数寻址

在立即数寻址中,操作数本身直接在指令中给出,取出指令也就获得了操作数,这个操作数也称为立即数。

例如:

ADDR0,R1,#5; R0=R1+5MOVR0,#0x55; R0=0x55

其中:操作数5,0x55就是立即数,立即数在指令中要以“#”为前缀,后面跟实际数值。0x00R0MOVR0,#0x55程序存储MOVR0,#0x550x55从代码中获得数据28寄存器寻址

在寄存器寻址方式下,寄存器的值即为操作数。ARM指令普遍采用此种寻址方式。

例如:ADDR0,R1,R2; R0=R1+R2MOVR0,R1; R0=R10xAA0x55R2R10xAAMOVR0,R1寄存器移位寻址寄存器移位寻址的操作数由寄存器的数值做相应移位而得到;移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。

例如:ADDR0,R1,R2,RORR3;R0=R1+R2循环右移R3位MOVR0,R1,LSL#3;R0=R1逻辑左移3位移位操作在ARM指令集中不作为单独的指令使用,ARM指令集共有5种位移操作。如下所示:0x00000000R0R10x00000001MOVR0,R1,LSL#30x00001000逻辑左移3位0x000010002930

寄存器移位寻址0LSL逻辑左移:Rx,LSL<op1>(LogicalShiftLeft)LSR逻辑右移

:Rx,LSR<op1>(LogicalShiftRight)ASR算术右移:Rx,ASR<op1>(ArithmeticShiftRight)ROR循环右移:Rx,ROR<op1>(RotateRight)RRX带扩展的循环右移:Rx,RRX(RotateRightwithextend)0C031313131310000注意:将寄存器的值作为操作数的物理地址的寻址方式中,寄存器助记符放在“[]”中。31寄存器间接寻址

寄存器中的值为操作数的物理地址,而实际的操作数存放在存储器中。例如:STRR0,[R1]; [R1]=R0LDRR0,[R1]; R0=[R1]0x55R0R10x400000000xAA0x400000000xAALDRR0,[R1];32基址变址寻址将寄存器(称为基址寄存器)的值与指令中给出的偏移地址量相加,所得结果作为操作数的物理地址。

例如:LDRR0,[R1,#5]; R0=[R1+5]LDRR0,[R1,R2]; R0=[R1+R2]0x55R0R10x400000000xAA0x40000005将R1+5作为地址装载数据0xAALDRR0,[R1,#5];33相对寻址相对寻址同基址变址寻址相似,区别只是将程序计数器PC作为基址寄存器,指令中的标记作为地址偏移量。例如:

BEQprocess1 ……process1: ……BEQ指令采用了相对寻址方式,它将程序跳转到prscess1处执行34多寄存器寻址

在多寄存器寻址方式中,一条指令可实现一组寄存器值的传送。连续的寄存器间用“-”连接,否则用“,”分隔。例如:LDMIAR0,{R1-R5};

R1=[R0],R2=[R0+4],R3=[R0+8],R4=[R0+12],R5=[R0+16]指令中IA表示在执行完一次Load操作后,R0自增4。该指令将以R0为起始地址的5个字数据分别装入R1,R2,R3,R4,R5中。0x40000000R0R10x??0x010x400000000x??R2R30x??R40x??0x020x030x040x400000040x400000080x4000000CR50x??0x050x400000100x010x020x030x040x05LDMIAR0,{R1-R5}0x40000014数据地址35块拷贝寻址块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。

例如:将取出的数据存入以R1的值为起始地址的存储单元中LDMIAR0,{R1-R5};STMIAR1,{R1-R5};从以R0的值为起始地址的存储单元中取出5个字的数据36堆栈寻址

堆栈寻址用于数据栈与寄存器组之间批量数据传输。堆栈是一种后进先出的数据结构。当数据写入和读出内存的顺序不同时,使用堆栈寻址可以很好的解决这问题。

例如:将数据出栈,恢复R0-R4原先的值。STMFDR13!,{R0,R1,R2,R3,R4};LDMFDR13!,{R0,R1,R2,R3,R4};将R0-R4中的数据压入堆栈,R13为堆栈指针37内容提要思考题Thumb指令集

ARM指令集

ARM指令格式和寻址方式

ARM编程模型38

3.3ARM指令集3.3.1数据处理指令3.3.3Load/Store指令3.3.2跳转指令3.3.4程序状态寄存器指令3.3.6异常中断指令3.3.5协处理器指令393.3.1数据处理指令1.MOV数据传送指令(Move)

MOV{<cond>}{S}<Rd>,<op1>;

功能:从另一个寄存器、被移位的寄存器、或一个立即数装载一个值到目的寄存器;

Rd=op1

。指定相同的寄存器来实现NOP指令的效果,还可以专门移位一个寄存器:

MOVR0,R0;R0=R0...NOP

MOVR0,R0,LSL#3;R0=R0*8如果R15是目的寄存器,将修改程序计数器或标志。用于返回到调用代码,方法是把连接寄存器的内容传送到R15:

MOVPC,R14;

退出到调用者

MOVSPC,R14;

退出到调用者并恢复标志位40MVN数据取反传送指令2.

MVN数据取反传送指令(MoveNegative)

MVN{<cond>}{S}<Rd>,<op1>;功能:MVN从另一个寄存器、被移位的寄存器、或一个立即值装载一个被取反的值到目的寄存器;

Rd=!op1

这是逻辑非操作而不是算术操作,这个取反的值加1才是它的取负的值.MVNR0,#0;

R0=-1ADD加法指令3.ADD加法指令(Addition)ADD{<cond>}{S}<Rd>,<Rn>,<op2>;

功能:ADD将把两个操作数加起来,把结果放置到目的寄存器中。

Rd=Rn+op2操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数:

ADDR0,R1,R2;

R0=R1+R2

ADDR0,R1,#256;

R0=R1+256

ADDR0,R2,R3,LSL#1;

R0=R2+(R3<<1)加法可以在有符号和无符号数上进行。41ADC带进位加法指令4.ADC带进位加法指令(AdditionwithCarry)

ADC{<cond>}{S}<Rd>,<Rn>,<op2>;

功能:将寄存器Rn、操作数op2表示的值以及进位标志位三者相加,然后把结果存入目的寄存器Rd中。它使用一个进位标志位,这样就可以做比32位大的加法。

Rd=Rn+op2+carry

进位标志值

4243ADC带进位加法指令下列例子将加两个128位的数。128位结果:寄存器0、1、2、和3;第一个128位数:寄存器4、5、6、和7;第二个128位数:寄存器8、9、10、和11。

ADDSR0,R4,R8;

加低端的字

ADCSR1,R5,R9;

加下一个字,带进位

ADCSR2,R6,R10;

加第三个字,带进位

ADCSR3,R7,R11;

加高端的字,带进位注意:相加时,不要忘记设置S后缀来更改进位标志。44SUB减法指令5.SUB减法指令(Subtraction)

SUB{<cond>}{S}<Rd>,<Rn>,<op2>;功能:SUB用操作数Rn减去操作数op2,把结果放置到目的寄存器中。

Rd=Rn-op2

操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:

SUBR0,R1,R2;R0=R1-R2

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

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

减法可以在有符号和无符号数上进行45RSB反向减法指令6.RSB反向减法指令(ReverseSubtraction)

RSB{<cond>}{S}<Rd>,<Rn>,<op2>;功能:SUB用操作数op2减去操作数Rn,把结果放置到目的寄存器中。Rd=op2–Rn操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:RSBR0,R1,R2;

R0=R2-R1

RSBR0,R1,#256;

R0=256-R1

RSBR0,R2,R3,LSL#1;

R0=(R3<<1)-R2反向减法可以在有符号或无符号数上进行。46SBC带借位减法指令7.SBC带借位减法指令:(SubtractionwithCarry)

SBC{<cond>}{S}<Rd>,<Rn>,<op2>;功能:用寄存器Rn的值减去操作数op2表示的值,再减去进位标志取反的值,然后把结果存入目的寄存器Rd中。它使用进位标志来表示借位,这样就可以做大于32位的减法。

Rd=Rn-op2-!carry

。47SBC带借位减法指令该指令用于实现超过32位的数的减法。例如:第一个64位操作数存放在寄存器R2,R3中;第二个64位操作数存放在寄存器R4,R5中;64位结果存放在R0,R1中。

SUBSR0,R2,R4;

低32位相减,S表示结果影响条件标志位的值

SBCR1,R3,R5;

高32位相减48RSC带借位的反向减法指令8.RSC带借位的反向减法指令(ReverseSubtractionwithCarry)

RSC{<cond>}{S}<Rd>,<Rn>,<op2>;功能:同于SBC,但倒换了两个操作数的前后位置。Rd=op2-Rn-!carry

例如:第一个64位操作数存放在寄存器R2,R3中;第二个64位操作数存放在寄存器R4,R5中;64位结果存放在R0,R1中。SUBSR0,R2,R4;

低32位相减,S表示结果影响寄存器CPSR的值

RSCR1,R5,R3;

高32位相减49MUL32位乘法指令乘法指令与普通算术指令在对操作数的限制上有所不同:

给出的所有操作数和目的寄存器必须为简单的寄存器。操作数2不能使用立即值或被移位的寄存器。目的寄存器和操作数1必须是不同的寄存器。不能指定R15为目的寄存器。9.MUL32位乘法指令(Multiplication)

MUL{<cond>}{S}<Rd>,<Rn>,<op2>;

功能:MUL提供32位整数乘法。该指令根据S标志,决定操作是否影响CPSR的值。Rn和op2的值为32位的有符号数或无符号数。

Rd=Rn*op2

例如:

MULSR0,R1,R2;

R0=R1×R2,结果影响寄存器CPSR的值50MLA32位乘加指令10.MLA32位乘加指令(MultiplicationwithAccumulate)MLA{<cond>}{S}<Rd>,<Rn>,<op2>,<op3>;功能:MLA的行为同于MUL,但它把操作数3的值加到结果上,其中op2,op3必须为寄存器

。Rd=(Rn*op2)+op3,这在求总和时有用Rn、op2和op3的值为32位的有符号数或无符号数。例如:

MLAR0,R1,R2,R3;R0=R1×R2+R351AND逻辑与指令11.AND逻辑与指令(logicalAND)

AND{<cond>}{S}<Rd>,<Rn>,<op2>;功能:AND将在两个操作数上按位进行逻辑与,把结果放置到目的寄存器中;

Rd=RnANDop2。对屏蔽某些位很有用。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值:

例如:

ANDR0,R0,#3;R0=保持R0的位0和1,其余位清0。52ORR逻辑或指令12.ORR逻辑或指令(logicalOR)

ORR{<cond>}{S}<Rd>,<Rn>,<op2>;功能:OR将在两个操作数上按位进行逻辑或,把结果放置到目的寄存器中,Rd=RnORop2

;对设置特定的位有用。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值。

例如:

ORRR0,R0,#3;

设置R0中位0和1,其余位不变53EOR逻辑异或指令13.EOR逻辑异或指令(logicalExclusiveOR)

EOR{<cond>}{S}<Rd>,<Rn>,<op2>;功能:EOR将在两个操作数上按位进行逻辑异或,把结果放置到目的寄存器中,Rd=RnEORop2

;对反转特定的位有用。操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即值。例如:

EORR0,R0,#3;

反转R0中的位0和154BIC位清除指令14.BIC位清除指令(BitClear)

BIC{<cond>}{S}<Rd>,<Rn>,<op2>;功能:BIC是在一个字中清除位的一种方法,与OR位设置是相反的操作。Rd=RnAND(!op_2)

操作数2是一个32位位掩码(mask)。如果在掩码中设置了某一位,则清除Rn中的这一位。未设置的掩码位指示Rn中此位保持不变。

BICR0,R0,#11;

清除R0中的位0,1和位3。其余位不变BICR0,R0,#5;R0中第0位和第2位清0,其余位不变CMP比较指令15.CMP比较指令(Compare)

CMP{<cond>}<Rn>,<op1>;功能:将寄存器Rn的值和操作数op1所表示的值进行比较,根据结果更新CPSR中条件标志位的值。

status=Rn-op2

该指令进行一次减法运算,但不存储结果,只更改条件标志位,后面的指令就可以根据条件标志位来决定是否执行。该指令不需要显式的指定S后缀来更改状态标志。操作数op1为寄存器或立即数。CMPR0,#5;计算R0-5,根据结果设置条件标志位ADDGTR0,R0,#5;如果R0>5,则执行ADDGT指令56TST位测试指令16.TST位测试指令(Testbits)

TST{<cond>}<Rn>,<op1>;

功能:将寄存器Rn的值和操作数op1所表示的值按位做逻辑与操作,根据结果更新CPSR中条件标志位的值,但不储存结果。用于检查寄存器Rn是否设置了op1中相应的位。

Status=RnANDop1

操作数Rn是要测试的数据字而操作数op1是一个位掩码。经过测试后,设置Zero标志。不需要指定S后缀。

TSTR0,#5;

测试R0中第0位和第2位是否为1573.3.2跳转指令B跳转指令:

B{<cond>}<addr>;功能:B是最简单的跳转指令。遇到一个B指令,ARM处理器将立即跳转到给定的地址addr,从那里继续执行。

注意:addr的值是相对当前PC(即寄存器R15)的值的一个偏移量;而不是一个绝对地址。它是24位有符号数。实际地址的值由汇编器来计算。addr的值有符号扩展为32位后,左移两位,然后与PC值相加,即得到跳转的目的地址。跳转的范围为-32M~+32M。

例如:

Bexit; 程序跳转到标号exit处

……

exit……58BL带返回的跳转指令2.BL带返回的跳转指令

BL{<cond>}<addr>;功能:同B指令,但BL指令执行跳转操作的同时,还将PC(寄存器R15)的值保存到LR寄存器(寄存器R14)中。该指令用于实现子程序调用

。程序的返回可通过把LR寄存器的值复制到PC寄存器中来实现

例如:BLfunc;

调用子程序func……

func……MOVR15,R14;

子程序返回593.3.3Load/Store指令Load/Store指令用于寄存器和内存间数据的传送,Load用于把内存中的数据装载到寄存器中,而Store则用于把寄存器中的数据存入内存。Load/Store指令分为三类:

单一数据传送指令(LDR和STR等);

多数据传送指令(LDM和STM);

数据交换指令(SWP和SWPB)。

60LDR字数据加载指令1.LDR字数据加载指令:

LDR{<cond>}<Rd>,<addr>;功能:把addr所表示的内存地址中的字数据装载到目标寄存器Rd中,同时还可以把合成的有效地址写回到基址寄存器。61LDR字数据加载指令地址addr可以是一个简单的值、或一个偏移量、或者是一个被移位的偏移量。其寻址方式有以下几种:

Rn是表示基址寄存器,Rm表示变址寄存器,index表示偏移量,为12位的无符号数。LDRRd,[Rn]

把内存中地址为Rn的字数据装入寄存器Rd中;LDRRd,[Rn,Rm]

;

将内存中地址为Rn+Rm的字数据装入寄存器Rd中;LDRRd,[Rn,#index];

将内存中地址为Rn+index的字数据装入寄存器Rd中;LDRRd,[Rn,Rm,LSL#5];将内存中地址为Rn+Rm×32的字数据装入寄存器Rd;LDRRd,[Rn,Rm]!;

将内存中地址为Rn+Rm的字数据装入寄存器Rd,并将新地址Rn+Rm写入Rn;LDRRd,[Rn,#index]!;将内存中地址为Rn+index的字数据装入寄存器Rd,并将新地址Rn+index写入Rn;LDR Rd,[Rn,Rm,LSL#5]!;将内存中地址为Rn+Rm×32的字数据装入寄存器Rd,并将新地址Rn+Rm×32写入RnLDR Rd,[Rn],Rm;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm写入Rn;LDRRd,[Rn],#index;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+index写入Rn;LDRRd,[Rn],Rm,LSL#5;将内存中地址为Rn的字数据装入寄存器Rd,并将新地址Rn+Rm×32写入Rn。62LDR字数据加载指令也可从基址上减去偏移量:

LDRBR0,[R1,#-1];

针对小端模式配置,字装载(LDR)将生成一个字对齐的地址。使用一个非字对齐的地址将有不明显和未规定的结果。实际上不能使用LDR从一个非对齐的地址装载一个字。

可以存储或装载PC,但不可以用装载或存储指令来修改CPSR。要装载一个被存储的‘状态’并正确的恢复它,请使用:

LDRR0,[Rbase];MOVSR15,R0;63LDRB字节数据加载指令2.LDRB字节数据加载指令:

LDR{<cond>}B<Rd>,<addr>;功能:同LDR指令,但该指令只是从内存读取一个8位的字节数据而不是一个32位的字数据,并将Rd的高24位清0。

可以在这些指令上使用条件执行。但要注意条件标志要先于字节标志,LDREQBRx,<address>(不是LDRBEQ...)。

例如:

LDRBR0,[R1];

将内存中起始地址为R1的一个字节数据装入R0中64STR字数据存储指令3.STR字数据存储指令:

STR{<cond>}<Rd>,<addr>;功能:把寄存器Rd中的字数据(32位)保存到addr所表示的内存地址中,同时还可以把合成的有效地址写回到基址寄存器。针对小端模式配置,字存储(STR)将生成一个字对齐的地址。使用一个非字对齐的地址将有不明显和未规定的结果。实际上不能使用LDR从一个非对齐的地址装载一个字。

地址addr可以是一个简单的值、或一个偏移量、或者是一个被移位的偏移量,其寻址方式同LDR指令。例如:

STRR0,[R1,#5]!;

把R0中的字数据保存到以R1+5为地址的内存中,然后R1=R1+565STRB字节数据存储指令4.STRB字节数据存储指令:

STR{<cond>}B<Rd>,<addr>;功能:把寄存器Rd中的低8位字节数据保存到addr所表示的内存地址中。其他用法同STR指令。

字节存储(STRB)在数据总线上重复源寄存器的的低端8位4次。由外部的内存系统来激活适当的字节子系统来存储数据。

例如:

STRBR0,[R1];

将寄存器R0中的低8位数据存入R1表示的内存地址中66批量数据加载/存储指令5.LDM批量数据加载指令:LDM{<cond>}{<type>}<Rn>{!},<regs>{^};功能:从一片连续的内存单元读取数据到各个寄存器中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。该指令一般用于多个寄存器数据的出栈。

{!}:若选用了此后缀,则当指令执行完毕后,将最后的地址写入基址寄存器。

在存储R15到内存中时,自动保存CPSR

位。在重新装载R15的时候,除非你要求,否则不恢复CPSR位。要求的方法是在寄存器列表后跟随一个‘^’。67批量数据加载/存储指令6.STM批量数据存储指令:

STM{<cond>}{<type>}<Rn>{!},<regs>{^};功能:将各个寄存器的值存入一片连续的内存单元中,内存单元的起始地址为基址寄存器Rn的值,各个寄存器由寄存器列表regs表示。该指令一般用于多个寄存器数据的入栈。68批量数据加载/存储指令指令中,type字段有以下几种:IA:每次传送后地址加4;IB:每次传送前地址加4;DA:每次传送后地址减4;DB:每次传送前地址减4;FD:满递减堆栈;FA:满递增堆栈;(一个满栈的栈指针指向上次写的最后一个数据单元)ED:空递减堆栈;EA:空递增堆栈;(空栈的栈指针指向第一个空闲单元。)69批量数据加载/存储指令4种‘类型’就变成了8个指令:

栈其他LDMEDLDMIB

预先增加装载LDMFDLDMIA

过后增加装载LDMEALDMDB

预先减少装载LDMFALDMDA

过后减少装载栈其他STMFASTMIB

预先增加存储STMEASTMIA

过后增加存储STMFDSTMDB

预先减少存储STMEDSTMDA

过后减少存储

7026262626595959590000888866663333546936451554854514543862363388320x123456a00x123456900x1234568c0x123456880x123456840x123456800x1234567c0x123456780x12345684R13内存中的数据批量数据加载/存储指令IA、IB、DA、DB指定了地址加还是减,是传送前还是传送后。例如:LDMIA/IB/DA/DBR13!,{R0-R1,R3};各指令执行完后,结果如图所示:R3R1R0155485455469364566663333IA:每次传送后地址加4;71批量数据加载/存储指令FD、ED、FA、和EA指定是满栈还是空栈,是升序栈还是降序栈,用于堆栈寻址。一个满栈的栈指针指向上次写的最后一个数据单元,而空栈的栈指针指向第一个空闲单元。一个降序栈是在内存中反向增长而升序栈在内存中正向增长。如下图所示,数据以16进制存储。66663333546936451554854514543862363388320x123456a00x123456900x1234568c0x123456880x123456840x123456800x1234567c0x12345678栈指针FD:满递减堆栈;66663333546936451554854514543862363388320x123456a00x123456900x1234568c0x123456880x123456840x123456800x1234567c0x12345678ED:空递减堆栈;栈指针FA:满递增堆栈;栈指针26262626595959590000888866663333546936450x123456a00x123456900x1234568c0x123456880x123456840x123456800x1234567c0x1234567826262626595959590000888866663333546936450x123456a00x123456900x1234568c0x123456880x123456840x123456800x1234567c0x12345678栈指针EA:空递增堆栈;72批量数据加载/存储指令提供一个有用的简写,要包含一个范围的寄存器,可以简单的只写第一个和最后一个,并在其间加一个横杠。

例如:

R0-R3

等同与

R0,R1,R2,R3,STMFDR13!,{R0-R12,R14}

...LDMFDR13!,{R0-R12,PC}保存所有的寄存器,做一些事情,接着重新装载所有的寄存器。从R14装载PC,不触及CPSR标志。低存储单元对应低标号寄存器寄存器列表无顺序,73SWP字数据交换指令7.SWP字数据交换指令:

SWP{<cond>}<Rd>,<op1>,[<op2>];功能:从op2所表示的内存装载一个字并把这个字放置到目的寄存器Rd中,然后把寄存器op1的内容存储到同一内存地址中,即Rd=[op2],[op2]=op1。其中op1,op2均为寄存器

如果目的和操作数1是同一个寄存器,则把寄存器的内容和给定内存位置的内容进行交换。例如:

SWPR0,R1,[R2];

将R2所表示的内存单元中的字数据装载到R0,然后将R1中的字数据保存到R2所表示的内存单元中。74SWPB字节数据交换指令8.SWPB字节数据交换指令:

SWP{<cond>}B<Rd>,<op1>,[<op2>];

功能:从op2所表示的内存装载一个字节并把这个字节放置到目的寄存器Rd的低8位中,Rd的高24位设置为0;然后将寄存器op1的低8位数据存储到同一内存地址中。

例如:SWPBR0,R1,[R2];

将R2所表示的内存单元中的一个字节数据装载到R0的低8位,然后将R1中的低8位字节数据保存到R2所表示的内存单元中。753.3.6异常中断指令ARM处理器支持两条异常中断指令:软件中断指令SWI和断点中断指令

BKPT。1.

SWI软件中断指令:

SWI{条件}24位的立即数;功能:用于产生软件中断,以使用户程序调用操作系统的系统例程。使用SWI来访问操作系统例程或第三方生产的模块。76SWI软件中断指令SWI的例子有:

文件SWI,它辅助读写磁盘、设置属性等。打印机驱动器SWI,用来辅助使用打印并行端口。TCP/IP协议栈SWI,用TCP/IP协议在Internet上发送和接收数据

指令中24位的立即数指定用户程序调用系统例程的类型,其参数通过通用寄存器传递。当24位的立即数被忽略时,系统例程类型由寄存器R0指定,其参数通过其他通用寄存器传递。77SWI软件中断指令当SWI处理程序得到对特定的例程编号的一个请求的时候,它找到这个例程的位置并执行它,并传递(有关的)数据。

例如:

SWI&02;

该指令进入SWI处理程序并传递值&02。它是如何这么作的?它如何传递SWI编号和进入SWI处理程序?78SWI软件中断指令查看内存的开始32字节(位于0-&1C)并反汇编它们(查看实际的ARM指令)将见到如下:

地址内容反汇编00000000::E5000030:STRR0,[R0,#-48]00000004::E59FF31C:LDRPC,&0000032800000008::E59FF31C:LDRPC,&0000032C0000000C::E59FF31C:LDRPC,&0000033000000010::E59FF31C:LDRPC,&0000033400000014::E59FF31C:LDRPC,&0000033800000018::E59FF31C:LDRPC,&0000033C0000001C::E3A0A632:MOVR10,#&3200000

79SWI软件中断指令一个SWI所做:把模式改变成超级用户(管理模式)并设置PC来执行在地址&08处的一条指令!.把处理器转换到超级用户模式会切换掉两个寄存器R13、R14,并用R13_svc和R14_svc

替换它们。在进入超级用户模式的时候,还把R14_svc设置为在这个SWI指令之后的地址。这个实际上就象一个连接到地址&08的分支指令(BL&08),地址&08包含跳转到另一个地址的一个指令,就是实际的SWI程序的地址!80SWI软件中断指令完成SWI编号的步骤(在存储寄存器r0-r12之后):

它从R14中减去4来获得SWI指令的地址。把这个指令装载到一个寄存器。清除这个指令的高端8位,去掉了OpCode而只剩下的SWI编号。使用这个值来找到要被执行的代码的例程的地址(使用查找表等)。恢复寄存器r0-r12。使处理器离开超级用户模式。跳转到这个例程的地址。81BKPT断点中断指令2.BKPT断点中断指令:

BKPT16位的立即数;功能:用于产生软件断点中断,以便软件调试时使用。16位的立即数用于保存软件调试中额外的断点信息。ARM协处理器指令ARM作为32位处理器,虽然能进行长乘法和乘加等运算,但没有除法指令和更复杂的运算指令。因此,ARM可以通过外接协处理器来解决此问题,协处理器是一种专门用于进行辅助运算的芯片,其本身除了运算功能以外没有其他功能,因此,不能独立工作,必须和CPU一起工作.ARM处理器可支持多达16个协处理器,每个协处理器都有自己的编号,命名为Pn,每个协处理器都有自己的寄存器,命名为Cn。ARM协处理器指令ARM的协处理器指令主要用于ARM处理器初始化ARM协处理器的数据处理操作,以及在ARM处理器的寄存器和协处理器的寄存器之间传送数据,和在ARM协处理器的寄存器和存储器之间传送数据。

ARM协处理器指令包括以下5条:CDP指令LDC指令STC指令MCR和MRC指令ARM协处理器指令1.CDP指令格式为:CDP{条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。CDP指令是协处理器数据操作指令,用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。

其中,协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,

目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。ARM协处理器指令指令示例:CDPP1,2,C1,C2,C3

命令1号(P1)协处理器把自己的寄存器(协处理器寄存器)C2和C3作为操作数,进行第2方式的操作,结果放在C1(协处理器寄存器)中。3.2.6ARM协处理器指令

2.LDC指令格式为:LDC{条件}{L}协处理器编码,目的寄存器,[源寄存器]LDC指令是协处理器加载指令,用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。3.2.6ARM协处理器指令

指令示例:LDC P3,C4,[R5]

;将ARM处理器的寄存器R5所指向的存储器中的字数据传送到协处理器P3的寄存器C4中。ARM协处理器指令3.STC指令格式为:STC{条件}{L}协处理器编码,源寄存器,[目的寄存器]STC指令是协处理器存储指令,将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。3.2.6ARM协处理器指令

指令示例:STCEQP2,C4,[R5]

当Z=1时,执行将协处理器P2的寄存器C4中的字数据传送到ARM处理器的寄存器R5所指向的存储器中。ARM协处理器指令4.MCR和MRC指令格式为:MCR/MRC{条件}协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。这两条指令是用来在两个寄存器之间进行数据传送。从ARM处理器寄存器中的数据传送到协处理器寄存器使用MCR指令;从协处理器寄存器中的数据传送到ARM处理器寄存器使用MRC指令。ARM协处理器指令ARM处理器指定一个寄存器作为传送数据的源或接收数据的目标。协处理器指定两个寄存器,同时可以像CDP指令一样指定操作要求。这类指令可以用在浮点数运算和传送中,ARM处理器把数据传送给协处理器,然后可以从协处理器读出浮点数的计算结果。ARM协处理器指令指令示例:MCR P2,3,R2,C4,C5,6

该指令将ARM处理器寄存器R2中的数据传送到协处理器P2的寄存器C4和C5中。实现:指定协处理器P2执行第3,6种操作,操作数是,把操作结果传送给R4,R5。MRC P0,3,R2,C4,C5,6

;该指令将协处理器P0的寄存器中的数据传送到ARM处理器寄存器中。具体实现是:指定协处理器P0执行第3种操作,操作类型是6,操作数是C4,C5,结果放在R2中。Thumb指令集为兼容数据总线宽度为16位的应用系统,ARM体系结构除了支持执行效率很高的32位ARM指令集以外,同时支持16位的Thumb指令集。Thumb指令集是ARM指令集的一个子集,允许指令编码为16位的长度。与等价的32位代码相比较,Thumb指令集在保留32代码优势的同时,大大的节省了系统的存储空间。Thumb指令集Thumb指令集与ARM指令集在以下几个方面有区别:跳转指令。条件跳转在范围上有更多的限制,转向子程序只具有无条件转移。数据处理指令。对通用寄存器进行操作,操作结果需放入其中一个操作数寄存器,而不是第三个寄存器。单寄存器加载和存储指令。Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0~R7。批量寄存器加载和存储指令。LDM和STM指令可以将任何范围为R0~R7的寄存器子集加载或存储,PUSH和POP指令使用堆栈指针R13作为基址实现满递减堆栈,除R0~R7外,

温馨提示

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

评论

0/150

提交评论