《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统_第1页
《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统_第2页
《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统_第3页
《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统_第4页
《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统_第5页
已阅读5页,还剩166页未读 继续免费阅读

下载本文档

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

文档简介

教学目的掌握汇编指令的基本知识掌握寻址方式掌握ARM指令集掌握Thumb指令集教学内容3.1指令基础3.2ARM汇编语言3.3ARM指令的寻址方式3.4数据处理指令3.5数据加载与存储指令3.6分支指令3.7程序状态寄存器访问指令教学内容3.8协处理器指令3.9软件中断指令3.10ARM伪指令3.11Thumb指令集3.12Thumb伪指令3.1指令基础3.1.1程序设计语言的层次结构3.1.2指令周期和时序3.1.3程序的执行过程3.1.1程序设计语言的层次结构

计算机程序设计语言的层次结构如图3-1所示,分为机器语言级、汇编语言级、高级语言级,机器语言是与计算机硬件最为密切的一种语言,它由微程序解释机器指令统。这一级也是硬件级,是软件系统和硬件系统之间的纽带。图3-1程序设计语言的层次结构为了提高程序设计的效率,人们提出了汇编语言的概念。将机器码用指令助记符表示,这样就比机器语言方便得多。不过,在使用汇编语言后,虽然编程的效率和程序的可读性都有所提高,但汇编语言同机器语言非常接近,它的书写风格在很大程度上取决于特定计算机的机器指令,所以它仍然是一种面向机器的语言。为了更好地进行程序设计,提高程序设计的效率,人们又提出了高级语言程序设计的概念。如C、JAVA等,这类高级语言对问题的描述十分接近人们的习惯,并且还具有较强的通用性。这就给程序员带来极大的方便。当然这类高级语言在执行前必须转换为汇编语言或其它中间语言,最终转换为机器语言。通常有两种方法实现这个转换:编译或解释。3.1.2指令周期和时序微处理器执行一条指令所需要的时间称为指令周期(InstructionCycle),不同指令的指令周期不是等长的.,如果要处理的数据在微处理器的寄存器中,则需要的时间短;如果要处理的数据在存储器或I/O设备中则需要的时间长,一般情况下,以访问存储器所需最长的时间来衡量指令周期。对于ARM7微处理器而言,所有存储器的传输周期都可以被归结到以下四种类型之一:(1)不连续周期:ARM请求传输到某个地址或者从某个地址传输,但这个地址跟前一个周期用到的地址没有联系,这种情况所需的时间称为访问一个非顺序的内存位置的周期,简称为N周期。(2)连续周期:ARM请求传输到某个地址或者从某个地址传输,此地址或者同上一个周期的地址相同或者是上一个周期的地址之后一个字。这种情况所需的时间称为访问一个顺序的内存位置的周期,简称为S周期。(3)内部周期:ARM不请求一个传输,因为它执行一个内部功能,同时不执行有效的预取。这种情况所需的时间称为内部周期,简称为I周期。(4)协处理器寄存器传输周期:ARM希望通过数据总线同协处理器通信,ARM与一个协处理器之间在数据总线(对于无缓存的ARM)或协处理器总线(对于有缓存的ARM)上写传送一个字的周期,简称C周期。ARM指令在时序上是S、N、I和C周期的混合。各种类型的周期都必须至少与ARM的时钟周期一样长。对于典型的SRAM系统,所有类型的周期是最小长度,内存系统也可以伸展它们,如典型的DRAM系统伸展如下:N周期伸展为最小长度的两倍:这是因为DRAM在内存访问是非顺序时要求更长的时间。S周期通常是最小长度,但有时也会被伸展成N周期的长度,如从一个内存“行”的最后一个字移动到下一行的第一个字的时候。I周期和C周期总是最小长度。例如:在8MHz的ARM微处理器中,一个S周期是125ns,而一个N周期是250ns。应当注意到这些时序不是ARM的属性,而是内存系统的属性。例如,一个8MHz的ARM微处理器可以与一个给出125ns的N周期的RAM系统相连接。处理器的速率是8MHz只是简单的意味着如果你使任何类型的周期,在长度上小于125ns则它不保证能够工作。图3-2显示一种ARM存储器周期时序。图3-2存储器访问时序其中N-cycle比其它的周期长,这考虑了对DRAM的访问时间。

3.1.3程序的执行过程

典型的微型计算机硬件逻辑结构如图3-3所示。CPU通过数据总线、地址总线、控制总线和存储器、外部I/O设备联系起来。计算机采取“存储程序与程序控制”的工作方式,即事先把程序加载到计算机的存储器中,当启动运行后,计算机会自动按照存储程序的要求进行工作,这称为程序控制。计算机执行程序是一条指令一条指令地执行。执行一条指令的过程可分为取指、译码和执行等阶段。首先,CPU进入取指阶段,通过控制总线(CB)发出读命令,并在地址总线上(AB)给出所取指令的地址,从存储器中取出的指令代码经过数据总线(DB)送到CPU的指令寄存器中,然后对该指令译码,再转入执行阶段,在这期间,CPU执行指令指定的操作。图3-3计算机程序的执行过程3.2ARM汇编语言3.2.1指令和指令格式3.2.2指令的可选后缀3.2.3指令的条件执行3.2.4ARM指令分类3.2.1指令和指令格式

1.指令和指令系统指令是指示计算机进行某种操作的命令指令的集合称为指令系统。指令系统的功能强弱在很大程度上决定了这类计算机智能的高低,它集中地反映了微处理器的硬件功能和属性。2.指令的表示方法从形式上看,ARM指令在机器中的表示格式是用32位的二进制数表示。计算机根据二进制代码去完成所需的操作,如ARM中有一条指令为:ADDEQSR0,R1,#8;其二进制代码形式为:31~2827~2524~212019~1615~1211~000000010100100010000000000001000conedopcodeRnRdOp2ARM指令代码一般可以分为5个域:第1个域是4位[31:28]的条件码域,4位条件码共有16种组合;第2个域是指令代码域[27:20],除了指令编码外,还包含几个很重要的指令特征和可选后缀的编码;第3个域是地址基址Rn,是4位[19:16],为R0~R15共16个寄存器编码;第4个域是目标或源寄存器Rd,是4位[15:12],为R0~R15共16个寄存器编码;第5个域是地址偏移或操作寄存器、操作数区[11:0]。3.汇编指令格式用助记符表示的ARM指令一般格式如下:

<opcode>{<cond>}{S}<Rd>,<Rn>{,<OP2>}

格式中<>的内容必不可少,{}中的内容可省略。如<opcode>是指令助记符,是必须的。而{<cond>}为指令的执行条件,是可选的,缺省的情况下表示使用默认条件AL(无条件执行,参看表3-1)。<opcode>表示操作码,如ADD表示算术加法。

{<cond>}表示指令执行的条件域,如EQ、NE等。

{S}决定指令的执行结果是否影响CPSR的值,使用该后缀则指令执行的结果影响CPSR的值,否则不影响。

<Rd>表示目的寄存器。

<Rn>表示第一个操作数,为寄存器。

<op2>表示第二个操作数,可以是立即数、寄存器和寄存器移位操作数。例如上述指令ADDEQSR0,R1,#8;其中操作码为ADD,条件域cond为EQ,

S表示该指令的执行影响CPSR寄存器的值,目的寄存器Rd为R0,第一个操作数寄存器Rn为R1,第二个操作数OP2为立即数#8。例3.1指令格式举例:

LDRR0,[R1];读取R1地址上的存储单元的数据到寄存器R0BEQENDDATA;条件分支执行指令,执行条件EQ,即相等则跳转到ENDDATA处

ADDSR2,R1,#1;寄存器R1中的内容加1存入寄存器R2,并影响CPSR寄存器的值3.2.2指令的可选后缀

1.S后缀指令中使用S后缀时,指令执行后程序状态寄存器的条件标志位将被刷新,不使用S后缀时,指令执行后程序状态寄存器的条件标志将不会发生变化。S后缀通常用于对条件进行测试,例如是否有溢出,是否进位等;根据这些变化,就可以进行一些判断,如是否大于,是否相等;从而可能影响指令执行的顺序。

例3.2假设R0=0x1,R3=0x3,指令执行之前CPSR=nzcvqIFt_SVC,分别执行如下指令CPSR的值有何变化?

SUBR1,R0,R3;R0的值减去R3的值,结果存入R1SUBSR1,R0,R3;R0的值减去R3的值,结果存入R1,影响标志位

分析:执行第1条指令对于标志寄存器的值没有任何影响,因此CPSR的值不变。执行第2条指令后CPSR=NzcvqIFt_SVC,因为R0的值减去R3值,结果变成了一个负数,故而N被置位了。

2.!后缀如果指令地址表达式中不含!后缀,则基址寄存器中的地址值不会发生变化。指令中的地址表达式中含有!后缀时,指令执行后,基址寄存器中的地址值将发生变化,变化的结果如下:基址寄存器中的值(指令执行后)=指令执行前的值+地址偏移量

例3.3分别执行下面两条指令有何区别?

LDRR3,[R0,#4]LDRR3,[R0,#4]!

分析:在上述指令中,第1条指令没有后缀!,指令的结果是把R0加4作为地址指针,把这个指针所指向的地址单元所存储的数据读入R3,R0的值不变。第2条指令除了实现以上操作外,还把R0+4的结果送到R0中。使用!后缀需要注意如下事项:(1)!后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量。

(2)!后缀不能用于R15(PC)的后面

(3)当用在单个地址寄存器后面时,必须确信这个寄存器有隐性的偏移量,例如“STMDBR1!{R3,R5,R7}”此时地址基址寄存器R1的隐性偏移量是4。3.2.3指令的条件执行

程序要执行的指令,均保存在存储器中,当计算机需要执行一条指令时,首先产生这条指令的地址,并根据地址号打开相应的存储单元,取出指令代码,CPU根据指令代码的要求以及指令中的操作数,去执行相应的操作。表3-2指令的条件码

例3.4下面三条指令有何区别?ADDR4,R3,#1ADDEQR4,R3,#1ADDSR4,R3,#1

分析:第1条指令不带条件标志(无条件AL),指令的执行不受条件标志位的影响,完成加法运算:将R3的值加1存入寄存器R4。第2条ADD指令加上后缀EQ变为ADDEQ表示“相等则相加”,即当CPSR中的Z标志置位时该指令执行,否则不执行。第3条指令的执行也不受条件标志的影响,但是由于附带了后缀S,这条指令执行的结果将影响CPSR中条件标志位的值。条件后缀只是影响指令是否执行,不影响指令的内容,如上述ADDEQ指令,可选后缀EQ并不影响本指令的内容,它执行时仍然是一条加法指令。条件后缀和S后缀的关系如下:(1)如果既有条件后缀又有S后缀,则书写时S排在后面,如:ADDEQSR1,R0,R2

该指令在Z=1时执行,将R0+R2的值放入R1,同时刷新条件标志位。(2)条件后缀是要测试条件标志位,而S后缀是要刷新条件标志位。(3)条件后缀要测试的是执行前的标志位,而S后缀是依据指令的结果改变条件标志。3.2.4ARM指令分类ARM微处理器的指令集是加载/存储型的,即指令集中的大部分指令仅能处理寄存器中的数据,而且处理结果都要放回寄存器,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。ARM微处理器的指令集可以分为数据处理指令、数据加载与存储指令、分支指令、程序状态寄存器(PSR)处理指令、协处理器指令和异常产生指令六大类。

3.3ARM指令的寻址方式3.3.1立即数寻址3.3.2寄存器寻址3.3.3寄存器间接寻址3.3.4寄存器移位寻址3.3.5基址变址寻址3.3.6多寄存器寻址3.3.7相对寻址3.3.8堆栈寻址3.3.1立即数寻址立即数寻址也叫立即寻址,操作数本身就在指令中给出,取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址例3.5

MOVR0,#15立即数要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”;对于以二进制表示的立即数,要求在“#”后加上“0b”;对于以十进制表示的立即数,要求在“#”后加上“0d”或缺省。此指令是将立即数15传送到R0中,该指令的机器编码为E3A0000FH,由指令编码中0x00F即可得到一个32位的立即0x0000000FH,这个数再送入R03.3.2寄存器寻址

寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式例3.6ADDR0,R1,R2;R0←R1+R23.3.3寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例3.7LDRR0,[R4];R0←[R4]

3.3.4寄存器移位寻址

寄存器移位寻址的操作数由寄存器中的数值做相应移位而得到;例3.8ADDR0,R1,R2,LSL#1MOVR0,R1,LSLR3

3.3.5基址变址寻址

基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。

例3.9LDRR0,[R1,#4];R0←[R1+4]LDRR0,[R1,#4]!;R0←[R1+4]、R1←R1+4LDRR0,[R1],#4;R0←[R1]、R1←R1+4LDRR0,[R1,R2];R0←[R1+R2]

3.3.6多寄存器寻址

采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式中用一条指令最多可传送16个通用寄存器的值。连续的寄存器间用“-”连接,否则用“,”分隔。

例3.10LDMIAR0!,{R1-R4};R1←[R0];R2←[R0+4] ;R3←[R0+8];R4←[R0+12]

指令执行前内存和寄存器值指令执行后内存和寄存器值3.3.7相对寻址与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用,分支指令BL采用了相对寻址方式:BLproc;跳转到子程序proc处执行… procMOVR0,#1… 3.3.8堆栈寻址

堆栈是一种数据结构,按后进先出(LastInFirstOut,LIFO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。ARM中采用LDMFD和STMFD指令分别用来支持POP操作(出栈)和PUSH操作(进栈),R13作为堆栈指针。

例3.11STMFDR13!,{R0-R4};LDMFDR13!,{R0-R4};

3.4数据处理指令3.4.1数据传送指令3.4.2移位操作3.4.3算术指令3.4.4逻辑运算指令3.4.5比较指令3.4.6乘法指令3.4数据处理指令数据处理指令对存放在寄存器中的数据进行操作,分为数据传送指令、算术指令、逻辑运算指令、比较指令和乘法指令。算术逻辑运算指令完成常用的算术与逻辑运算,这两类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。比较指令不保存运算结果,只更新CPSR中相应的条件标志位。cond:指令执行的条件码I:用于区别第二操作数是立即数(I=1)还是寄存器移位(I=0)opcode:数据处理指令操作码S:

用于设置条件码,S=0,条件码不改变,S=1,条件码根据具体指令的结果修改Rn:第一操作数寄存器Rd:目标寄存器Operand2:第二操作数,该数可以是立即数或寄存器移位数。3.4.1数据传送指令数据传送指令主要用于将一个寄存器中的数据传送到另一个寄存器,或者将一个立即数传送到寄存器,这类指令通常用来设置寄存器的初始值。数据传送指令包括:MOV数据传送指令MVN数据取反传送指令1.MOV指令汇编格式:MOV{<cond>}{S}Rd,operand2功能:MOV指令将源操作数operand2传送到目的寄存器Rd中。通常operand2是一个立即数、寄存器Rm或被移位的寄存器。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N和Z值,在计算第2操作数时更新标志C,不影响V标志例3.12MOV指令示例:MOVR1,R0;将寄存器R0的值传送到寄存器R1MOVPC,R14;将寄存器R14的值传送到PC,常用于子程序返回MOVR1,R0,LSL#3;将寄存器R0的值左移3位后传送到R1MOVR0,#5;将立即数5传送到寄存器R02.MVN指令汇编格式:MVN{<cond>}{S}Rd,operand2功能:MVN指令可完成从另一个寄存器、被移位的寄存器或将一个立即数传送到目的寄存器Rd。与MOV指令不同之处是:数据在传送之前被按位取反了,即把一个被取反的值传送到目的寄存器中。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N和Z值,在计算第2操作数时更新标志C,不影响V标志。例3.13MVN指令示例:MVNR0,#0;将立即数0取反传送到寄存器R0中,完成后R0=-1MVNR1,R2;将R2取反,结果存到R1中3.4.2移位操作ARM微处理器一个显著的特征是:在操作数进入ALU之前,对操作数进行预处理。如:指定位数的左移或右移,这种功能明显增强了数据处理操作的灵活性。这种预处理是通过ARM微处理器内嵌的桶形移位器(BarrelShifter)来实现的。桶形移位器和ALU的关系如图3-11所示

桶形移位器支持数据的各种移位操作,移位操作在ARM指令集中不作为单独的指令使用,它只能作为指令格式中的一个字段,在汇编语言中作为指令中的选项。例如,数据处理指令的第二个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下5种类型:LSL逻辑左移LSR逻辑右移ASR算术右移ROR循环右移RRX带扩展的循环右移图3-11桶形移位器和ALU1.LSL逻辑左移汇编格式:Rm,LSL<op1>功能:LSL指令可完成对通用寄存器Rm中的内容进行逻辑左移操作,按操作数op1所指定的数量向左移位,低位用零来填充。逻辑左移一次相当于将无符号数据做乘2操作。逻辑左移如图3-12所示。指令格式中的操作数op1用来控制左移的次数,op1有如下两种表示方式:图3-12逻辑左移(1)立即数控制方式立即数控制方式就是寄存器Rm移位的位数由一个数值常量来控制,例如:Rm,LSL#2在这个表达式中,对Rm中的数据逻辑左移2位。使用立即数控制方式时必须满足:0≤立即数≤31。(2)寄存器控制方式寄存器控制方式就是寄存器Rm移位的位数由另一个寄存器Rs来控制,Rs是通用寄存器,但不可使用R15(程序计数器)。例如:Rm,LSLRs假设Rs的值为3,则在这个表达式中表示对Rm中的数据逻辑左移3位。同样使用寄存器控制方式也必须满足:0≤Rs≤31。例3.14设指令操作之前R0=0x00000000,R1=0x80000004,则执行如下指令后R0,R1的值有何变化?MOVR0,R1,LSL#1例3.15设指令操作之前CPSR=nzcvqiFt_USER,R0=0x00000000,R1=0x80000004,则执行如下指令后R0,R1,CPSR中的值有何变化?MOVSR0,R1,LSL#12.LSR逻辑右移汇编格式:Rm,LSR<op1>功能:LSR指令可完成对通用寄存器Rm中的数据,按操作数op1所指定的数量向右移位,空出的最高位用零来填充。逻辑右移一次相当于将无符号数据做除2操作。逻辑右移如图3-14所示。图3-14逻辑右移指令格式中的操作数op1用来控制右移的次数,关于操作数op1的要求如LSL指令所述,唯一区别是取值范围要求:1≤立即数或Rs≤32。同样地,当指令中附加了S选项时,移位指令操作的结果还将影响CPSR中的标志位。例3.16设指令操作之前CPSR=nzcvqiFt_USER,R0=0xFFFFFFFF,

R1=0x00000001,则执行如下指令后R0,R1,CPSR中的值有何变化?

MOVSR0,R1,LSR#13.ASR算术右移汇编格式:Rm,ASR<op1>功能:ASR可完成对通用寄存器中的内容,按操作数所指定的数量向右移位,左端用第31位的值来填充。算术右移如图3-15所示。图3-15算术右移指令格式中的操作数op1用来控制右移的次数,关于操作数op1的要求如LSL指令所述,唯一区别是取值范围要求:1≤立即数或Rs≤32。同样地,当指令中附加了S选项时,移位指令操作的结果还将影响CPSR中的标志位。例3.17设指令操作之前CPSR=nzcvqiFt_USER,R0=0x00000000,

R1=0x80000001,则执行如下指令后R0,R1,CPSR中的值有何变化?MOVSR0,R1,ASR#1

4.ROR循环右移汇编格式:Rm,ROR<op1>功能:ROR可完成对通用寄存器中的内容,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。循环右移如图3-16所示。图3-16循环右移指令格式中的操作数op1用来控制右移的次数,关于操作数op1的要求如LSL指令所述,取值范围要求:1≤立即数或Rs≤31。同样地,当指令中附加了S选项时,移位指令操作的结果还将影响CPSR中的标志位。例3.18设指令操作之前R0=0x00000000,R1=0x40000001,则执行如下指令后R0,R1的值有何变化?MOVR0,R1,ROR#15.RRX带扩展的循环右移汇编格式:Rm,RRX功能:RRX可完成对通用寄存器中的内容进行带扩展的循环右移一位的操作,右移时32位数据和C标志位共33位数据组成一个循环往右移一次。C标志位移入最高位,最低位移入C位。带扩展的循环右移如图3-17所示。图3-17带扩展的循环右移例3.19设指令操作之前CPSR=nzcvqiFt_USER,R0=0x00000000,

R1=0x80000001,则执行如下指令后R0,R1,CPSR中的值有何变化

?

MOVSR0,R1,RRX3.4.3算术指令ARM中的算术指令主要指加法和减法,这些指令主要实现两个32位数据的加减操作,该类指令常常和桶形移位器结合起来,获得许多灵活的功能。算术指令主要包括:ADD加法指令ADC带进位加法指令SUB减法指令SBC带借位减法指令RSB逆向减法指令RSC带借位的逆向减法指令

1.ADD加法指令汇编格式:ADD{<cond>}{S}Rd,Rn,operand2功能:ADD指令用于把寄存器Rn的值和操作数operand2相加,并将结果存放到Rd寄存器中。即Rd=Rn+operand2,其中Rd为目的寄存器,Rn为操作数1,要求是一个寄存器,operand2是操作数2,可以是一个寄存器,被移位的寄存器,或一个立即数。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N、Z、C、V标志。

例3.20ADD指令示例:ADDR0,R1,R2;R0=R1+R2ADDR0,R1,#5;R0=R1+5ADDR0,R1,R2,LSL#2;R0=R1+(R2左移2位)

(1)立即数控制的寄存器移位表达式立即数控制方式就是寄存器Rm移位的位数由一个数值常量来控制,例如:ADDR0,R1,R2,LSL#2;R0=R1+(R2左移2位)在这个表达式中,对R2中的数据逻辑左移2位,然后和R1相加,其结果放入寄存器R0中。(2)寄存器控制的寄存器移位方式寄存器控制方式就是寄存器Rm移位的位数由另一个寄存器Rs来控制,Rs是通用寄存器,但不可使用R15(程序计数器)。例如:ADDR0,R1,R2,LSLR3假设R3的值为3,则在这个表达式中表示对R2中的数据逻辑左移3位,然后和R1相加,其结果放入寄存器R0中。(3)数字常量表达式数字常量表达式可以简单到一个立即数,还可以使用单目操作符、双目操作符、逻辑操作符和算术操作符等。各种操作符将在第4章介绍,这里仅举例说明:#0x88;立即数#0x40+0x20;使用加法#0x40+0x20*4;使用加减乘除算术运算#0x80:ROR:02;使用移位操作,循环右移2位#2_11010010;使用二进制#0xFF:MOD:08;取模操作#0xFF0000:AND:660000;逻辑操作,两数相与

2.ADC带进位加法指令汇编格式:ADC{<cond>}{S}Rd,Rn,operand2功能:ADC指令用于把寄存器Rn的值和操作数operand2相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器Rd中。即Rd=Rn+operand2+C,其中Rn为操作数1,必须是一个寄存器,operand2为操作数2,可以是一个寄存器,被移位的寄存器,或一个立即数。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N、Z、C、V标志。该指令使用一个进位标志位,这样就可以做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。该指令用于实现超过32位的加法。例3.21用ADC指令完成64位加法,设第一个64位操作数放在R2、R3中,第二个64位操作数放在R4、R5中。64位结果放在R0、R1中。

3.SUB减法指令汇编格式:SUB{<cond>}{S}Rd,Rn,operand2功能:SUB指令用于把寄存器Rn的值减去操作数operand2,并将结果存放到目的寄存器Rd中。即Rd=Rn-operand2,其中Rd为目的寄存器,Rn为操作数1,必须是一个寄存器,operand2是操作数2,可以是一个寄存器,被移位的寄存器或一个立即数。该指令可用于有符号数或无符号数的减法运算。S选项决定指令操作的结果是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N、Z、C、V标志。例3.22SUB指令示例:SUBR0,R1,R2;R0=R1-R2SUBR0,R1,#6;R0=R1-6SUBR0,R2,R3,LSL#1;R0=R2-(R3左移一位)4.SBC带借位减法指令汇编格式:SBC{<cond>}{S}Rd,Rn,operand2功能:SBC指令用于把寄存器Rn的值减去操作数operand2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器Rd中。即Rd=Rn-operand2-!C,其中Rd为目的寄存器,Rn为操作数1,必须是一个寄存器,operand2是操作数2,可以是一个寄存器,被移位的寄存器或一个立即数。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N、Z、C、V标志。例3.23用SBC指令完成64位减法,设第一个64位操作数0x2000000050000000放在R2、R3中,第二个64位操作数0x3000000040000000放在R4、R5中。64位结果放在R0、R1中。

5.RSB逆向减法指令汇编格式:RSB{<cond>}{S}Rd,Rn,operand2功能:RSB指令称为逆向减法指令,指令表示把操作数2减去操作数1,并将结果存放到目的寄存器中。即Rd=operand2-Rn,其中Rn为操作数1,应是一个寄存器,operand2为操作数2,可以是一个寄存器,被移位的寄存器或一个立即数。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N、Z、C、V标志。该指令可用于有符号数或无符号数的减法运算。

例3.24RSB指令示例:RSBR0,R1,R2;R0=R2-R1RSBR0,R1,#6;

R0=6-R1RSBR0,R2,R3,LSL#1;R0=(R3左移一位)-R26.RSC带借位的逆向减法指令汇编格式:RSC{<cond>}{S}Rd,Rn,operand2功能:RSC指令表示把操作数operand2减去寄存器Rn的值,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器Rd中。即Rd=operand2-Rn-!C,其中Rd为目的寄存器,Rn为操作数1,必须是一个寄存器,operand2是操作数2,可以是一个寄存器,被移位的寄存器,或一个立即数。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N、Z、C、V标志。例3.25RSC指令示例:RSCR0,R1,R2;R0=R2–R1-!C3.4.4逻辑运算指令

逻辑运算是对操作数按位进行操作的,位与位之间无进位或借位,无数的正负与数的大小之分,这种运算的操作数称为逻辑数或逻辑值。逻辑运算指令主要包括:AND逻辑与指令ORR逻辑或指令EOR逻辑异或指令BIC位清除指令1.AND逻辑与指令汇编格式:AND{<cond>}{S}Rd,Rn,operand2功能:AND指令将两个操作数按位进行逻辑与运算,结果放置到目的寄存器

Rd中。即Rd=RnANDoperand2,其中Rn为操作数1,是一个寄存器,operand2为操作数2,可以是一个寄存器,被移位的寄存器或一个立即数。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N和Z值,在计算第2操作数时更新标志C,不影响V标志。该指令常用于将操作数1的特定位清零的操作,所谓将某位清零就是将该位置0。例3.26设R0=0xFFFFFFFF,则执行下列指令后R0的值是多少?ANDR0,R0,#0xF

2.ORR逻辑或指令汇编格式:ORR{<cond>}{S}Rd,Rn,operand2功能:ORR指令将两个操作数按位进行逻辑或运算,结果放置到目的寄存器Rd中。即Rd=RnORN,其中Rn为操作数1,是一个寄存器,operand2为操作数2,可以是一个寄存器,被移位的寄存器或一个立即数。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N和Z值,在计算第2操作数时更新标志C,不影响V标志。该指令常用于将操作数1的特定位置位的操作,所谓将特定位置位就是将该位置1。例3.27若要将R0的第0位和第3位设置为1,其余位不变则应执行什么指令?

3.EOR逻辑异或指令汇编格式:EOR{<cond>}{S}Rd,Rn,operand2功能:EOR指令将两个操作数按位进行逻辑异或运算,并把结果放置到目的寄存器Rd中。即Rd=RnEORoperand2,其中Rn为操作数1,是一个寄存器,operand2为操作数2,可以是一个寄存器、被移位的寄存器或一个立即数。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N和Z值,在计算第2操作数时更新标志C,不影响V标志。该指令常用于反转操作数1的某些位。例3.28若要将R0的低4位取反,其余位不变则应执行什么指令?

4.BIC位清除指令汇编格式:BIC{<cond>}{S}Rd,Rn,operand2功能:BIC指令用于清除操作数Rn的某些位,并把结果放置到目的寄存器Rd中。即Rd=RnAND(!operand2),其中Rn为操作数1,是一个寄存器,operand2为操作数2,可以是一个寄存器,被移位的寄存器,或一个立即数。这里operand2可以看作一个32位的掩码,如果在掩码中设置了某一位,则清除Rn中相应的位。未设置掩码位的则Rn中相应位保持不变。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N和Z值,在计算第2操作数时更新标志C,不影响V标志。

例3.29若要将R0的第0位和第3位清0,其余位不变则应执行什么指令?

3.4.5比较指令比较指令通常用于把一个寄存器与一个32位的值进行比较或测试。比较指令根据结果更新CPSR中的标志位,但不影响其它的寄存器。在设置标志位后,其它指令可以通过条件执行来改变程序的执行顺序。对于比较指令,不需要使用S后缀就可以改变标志位的值。比较指令包括:CMP比较指令CMN反值比较指令TST位测试指令TEQ相等测试指令

1.CMP比较指令汇编格式:CMP{<cond>}{S}Rn,operand2功能:CMP指令将寄存器Rn的内容和另一个操作数operand2进行比较,同时更新CPSR中条件标志位的值。该指令实质上是进行一次减法运算,但不存储结果,只更改条件标志位。后面的指令就可以根据条件标志位来决定是否执行。例如,当操作数Rn大于操作操作数operand2时,执行CMP指令后,则此后带有GT后缀的指令将可以执行。

例3.30CMP指令示例:CMPR1,#10;将寄存器R1的值与10相减,并设置CPSR的标志位ADDGTR0,R0,#5;如果R1>10,则执行ADDGT指令,将R0加52.CMN反值比较指令汇编格式:CMN{<cond>}{S}Rn,operand2功能:CMN指令用于把一个寄存器Rn的内容和另一个操作数operand2取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际上是将操作数Rn和操作数operand2相加,并根据结果更改条件标志位。同样,后面的指令就可以根据条件标志位来决定是否执行。

例3.31CMN指令示例:CMNR0,R1;将寄存器R0的值与寄存器R1的值相加,;并根据结果设置CPSR的标志位CMNR0,#10;将寄存器R0的值与立即数10相加,;并根据结果设置CPSR的标志位3.TST位测试指令汇编格式:TST{<cond>}{S}Rn,operand2功能:TST指令用于把一个寄存器Rn的内容和另一个操作数operand2按位进行与运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用来检查是否设置了特定的位。其中操作数Rn是要测试的数据,这里操作数operand2可以看作一个32位的掩码,如果在掩码中设置了某一位,表示检查该位。未设置的掩码位则表示不检查。例3.32如要检查R0中的第0位和第1位是否为1则应执行什么指令?分析:检查R0中的第0位和第1位是否为1则不应改变R0的值,因此执行如下指令:

TSTR1,#3 4.TEQ相等测试指令汇编格式:TEQ{<cond>}{S}Rn,operand2功能:TEQ指令用于把一个寄存器Rn的内容和另一个操作数operand2按位进行异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数Rn和操作数operand2是否相等。例3.33TEQ指令示例:TEQR1,R2;将寄存器R1的值与寄存器R2的值按位异或,;并根据结果设置CPSR的标志位3.4.6乘法指令乘法指令把一对寄存器的内容相乘,然后根据指令类型把结果累加到其它的寄存器。ARM微处理器支持的乘法指令与乘加指令共有6条,根据运算结果可分为32位运算和64位运算两类。

64位乘法又称为长整型乘法指令,由于结果太大,不能在放在一个32位的寄存器中,所以把结果存放在2个32位的寄存器Rdlo和Rdhi中。Rdlo存放低32位,Rdhi存放高32位。与前面的数据处理指令不同,指令中的所有源操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器。同时,目的寄存器Rd和操作数Rm必须是不同的寄存器。乘法指令与乘加指令共有以下6条:

MUL32位乘法指令MLA32位乘加指令SMULL64位有符号数乘法指令SMLAL64位有符号数乘加指令UMULL64位无符号数乘法指令UMLAL64位无符号数乘加指令1.MUL32位乘法指令

汇编格式:MUL{<cond>}{S}Rd,Rm,Rs功能:MUL指令完成将操作数Rm与操作数Rs的乘法运算,并把结果放置到目的寄存器Rd中,即Rd=Rm×Rs。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N和Z值,在ARMv4及以前版本中,标志C和V不可靠,在ARMV5及以后版本中不影响C和V标志(以下几个乘法指令对于S的规定与此相同)。

例3.34MUL指令示例:MUL

R0,R1,R2;R0=R1×R2MULSR0,R1,R2;R0=R1×R2,同时设置CPSR中的相关条件标志位2.MLA32位乘加指令汇编格式:MLA{<cond>}{S}Rd,Rm,Rs,Rn功能:MLA指令完成将操作数Rm与操作数Rs的乘法运算,再将乘积加上Rn,并把结果放置到目的寄存器Rd中,即Rd=(Rm×Rs)+Rn。如果书写了S,同时根据运算结果设置CPSR中相应的条件标志位。例3.35MLA指令示例:MLA

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

3.SMULL

64位有符号数乘法指令汇编格式:SMULL{<cond>}{S}Rdlo,Rdhi,Rm,Rs,功能:SMULL指令实现32位有符号数相乘,得到64位结果。32操作数Rm与32操作数Rs作乘法运算,并把结果的低32位放置到目的寄存器Rdlo中,结果的高32位放置到目的寄存器Rdhi中,即[RdhiRdlo]=Rm×Rs。如果书写了S,同时根据运算结果设置CPSR中相应的条件标志位。其中,操作数Rm和操作数Rs均为32位的有符号数。例3.36SMULL指令示例:SMULL

R0,R1,R2,R3;R0=(R2×R3)的低32位Rdlo;R1=(R2×R3)的高32位Rdhi

4.SMLAL

64位有符号数乘加指令汇编格式:SMLAL{<cond>}{S}Rdlo,Rdhi,Rm,Rs,功能:SMLAL指令实现32位有符号数相乘并累加,得到64位结果。32位操作数Rm与32位操作数Rs作乘法运算,并把结果的低32位同目的寄存器Rdlo中的值相加后又放置到目的寄存器Rdlo中,结果的高32位同目的寄存器Rdhi中的值相加后又放置到目的寄存器Rdhi中,即[RdhiRdlo]=[RdhiRdlo]+Rm×Rs。如果书写了S,同时根据运算结果设置CPSR中相应的条件标志位。其中,操作数Rm和操作数Rs均为32位的有符号数。对于目的寄存器Rdlo,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位。对于目的寄存器Rdhi,在指令执行前存放64位加数的高32位,指令执行后存放结果的高32位。

例3.37SMLAL指令示例指令示例:SMLAL

R0,R1,R2,R3;R0=(R2×R3)的低32位+R0Rdlo;R1=(R2×R3)的高32位+R1Rdhi5.UMULL64位无符号数乘法指令

汇编格式:UMULL{<cond>}{S}Rdlo,Rdhi,Rm,Rs,功能:UMULL指令实现32位无符号数相乘,得到64位结果。32操作数Rm与32操作数Rs作乘法运算,并把结果的低32位放置到目的寄存器Rdlo中,结果的高32位放置到目的寄存器Rdhi中,即[RdhiRdlo]=Rm×Rs。如果书写了S,同时根据运算结果设置CPSR中相应的条件标志位。其中,操作数Rm和操作数Rs均为32位的无符号数。

例3.38UMULL指令示例:

UMULLR0,R1,R2,R3;R0=(R2×R3)的低32位Rdlo;R1=(R2×R3)的高32位Rdhi

6.UMLAL64位无符号数乘加指令汇编格式:UMLAL{<cond>}{S}Rdlo,Rdhi,Rm,Rs,功能:UMLAL指令实现32位无符号数相乘并累加,得到64位结果。

例3.39UMLAL指令示例指令示例:UMLAL

R0,R1,R2,R3

;R0=(R2×R3)的低32位+R0Rdlo;R1=(R2×R3)的高32位+R1Rdhi使用乘法指令应该注意如下事项(1)在操作中使用寄存器,但R15不可用。(2)在寄存器的使用中,注意Rd不能同时作为Rm,其它无限制。(3)有符号运算和无符号运算的低32位是没有区别的。(4)Rdlo、Rdhi和Rm必须使用不同的寄存器(5)对于UMULL和UMLAL,即使操作数的最高位为1,也解释为无符号数

例3.40下列指令都是错误的:MULR1,R1,R6MULR1,R6,[R5]MLAR4,R5,R6MULSNER6,R3,R0UMLALR6,R4,R4,R1SMULLR5,R3,R0MULR2,R5,#0x203.5数据加载与存储指令3.5.1数据加载与存储指令概述3.5.2单寄存器加载与存储指令3.5.3多寄存器加载与存储指令3.5.4堆栈操作3.5.5交换指令3.5.1数据加载与存储指令概述

ARM处理器是加载/存储体系结构的处理器,对存储器的访问只能通过加载和存储指令实现。1.数据加载与存储的方向问题数据加载与存储(Load-store)指令用于在存储器和处理器的寄存器之间传送数据。如图3-18所示,Load用于把内存中的数据装载到寄存器中,而Store则用于把寄存器中的数据存入内存。数据加载与存储指令共有三种类型:单寄存器加载与存储指令、多寄存器加载与存储指令和交换指令。2.数据加载与存储指令的寻址数据加载与存储类指令的基本格式为opcode{<cond>}Rd,addr。格式中opcode为指令代码,如LDR表示将存储器中的数据加载到寄存器中。addr为存储器的地址表达式,也称为第2操作数,可表示为[Rn,offset],其中Rn表示基址寄存器,offset表示偏移量。Addr有如下几种表示形式:

温馨提示

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

评论

0/150

提交评论