《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统.ppt

上传人(卖家):momomo 文档编号:5716751 上传时间:2023-05-05 格式:PPT 页数:171 大小:855KB
下载 相关 举报
《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统.ppt_第1页
第1页 / 共171页
《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统.ppt_第2页
第2页 / 共171页
《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统.ppt_第3页
第3页 / 共171页
《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统.ppt_第4页
第4页 / 共171页
《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统.ppt_第5页
第5页 / 共171页
点击查看更多>>
资源描述

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

2、语言级、高级语言级,机器语言是与计算机硬件最为密切的一种语言,它由微程序解释机器指令统。这一级也是硬件级,是软件系统和硬件系统之间的纽带。图3-1程序设计语言的层次结构为了提高程序设计的效率,人们提出了汇编语言的概念。将机器码用指令助记符表示,这样就比机器语言方便得多。不过,在使用汇编语言后,虽然编程的效率和程序的可读性都有所提高,但汇编语言同机器语言非常接近,它的书写风格在很大程度上取决于特定计算机的机器指令,所以它仍然是一种面向机器的语言。为了更好地进行程序设计,提高程序设计的效率,人们又提出了高级语言程序设计的概念。如C、JAVA等,这类高级语言对问题的描述十分接近人们的习惯,并且还具有

3、较强的通用性。这就给程序员带来极大的方便。当然这类高级语言在执行前必须转换为汇编语言或其它中间语言,最终转换为机器语言。通常有两种方法实现这个转换:编译或解释。3.1.2指令周期和时序指令周期和时序微处理器执行一条指令所需要的时间称为指令周期(Instruction Cycle),不同指令的指令周期不是等长的.,如果要处理的数据在微处理器的寄存器中,则需要的时间短;如果要处理的数据在存储器或I/O设备中则需要的时间长,一般情况下,以访问存储器所需最长的时间来衡量指令周期。对于ARM7微处理器而言,所有存储器的传输周期都可以被归结到以下四种类型之一:(1)不连续周期:ARM请求传输到某个地址或者

4、从某个地址传输,但这个地址跟前一个周期用到的地址没有联系,这种情况所需的时间称为访问一个非顺序的内存位置的周期,简称为N 周期。(2)连续周期:ARM请求传输到某个地址或者从某个地址传输,此地 址或者同上一个周期的地址相同或者是上一个周期的地 址之后一个字。这种情况所需的时间称为访问一个顺序 的内存位置的周期,简称为S 周期。(3)内部周期:ARM不请求一个传输,因为它执行一个内部功能,同 时不执行有效的预取。这种情况所需的时间称为内部周 期,简称为I 周期。(4)协处理器寄存器传输周期:ARM希望通过数据总线同协处理器通 信,ARM 与一个协处理器之间在数据总线(对于无缓存 的 ARM)或协

5、处理器总线(对于有缓存的 ARM)上写传 送一个字的周期,简称C 周期。ARM 指令在时序上是 S、N、I 和 C 周期的混合。各种类型的周期都必须至少与 ARM 的时钟周期一样长。对于典型的 SRAM 系统,所有类型的周期是最小长度,内存系统也可以伸展它们,如典型的 DRAM 系统伸展如下:N 周期伸展为最小长度的两倍:这是因为 DRAM 在内存访问是非顺序时要求更长的时间。S 周期通常是最小长度,但有时也会被伸展成 N 周期的长度,如从一个内存“行”的最后一个字移动到下一行的第一个字的时候。I 周期和 C 周期总是最小长度。例如:在8MHz的ARM微处理器中,一个 S 周期是125ns,而

6、一个 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设备联系起来。计算机采取“存储程序与程

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

8、M指令分类3.2.1指令和指令格式1.指令和指令系统 指令是指示计算机进行某种操作的命令 指令的集合称为指令系统。指令系统的功能强弱在很大程度上决定了这类计算机智能 的高低,它集中地反映了微处理器的硬件功能和属性。2.指令的表示方法从形式上看,ARM指令在机器中的表示格式是用32位的二进制数表示。计算机根据二 进制代码去完成所需的操作,如ARM中有一条指令为:ADDEQS R0,R1,#8;其二进制代码形式为:3128 2725 2421 2019161512 110 00000010100100010000000000001000 conedopcode RnRd Op2 ARM指令代码一般

9、可以分为5个域:第1个域是4位31:28的条件码 域,4位条件码共有16种组合;第2个域是指令代码域27:20,除了指 令编码外,还包含几个很重要的指令特征和可选后缀的编码;第3个域 是地址基址Rn,是4位19:16,为R0R15共16个寄存器编码;第4个 域是目标或源寄存器Rd,是4位15:12,为R0R15共16个寄存器编 码;第5个域是地址偏移或操作寄存器、操作数区11:0。3.汇编指令格式 用助记符表示的ARM指令一般格式如下:S,格式中的内容必不可少,中的内容可省略。如是指令 助记符,是必须的。而为指令的执行条件,是可选的,缺省 的情况下表示使用默认条件AL(无条件执行,参看表3-1

10、)。表示操作码,如ADD表示算术加法。表示指令执行的条件域,如EQ、NE等。S决定指令的执行结果是否影响CPSR的值,使用该后缀则指令执行的结 果影响CPSR的值,否则不影响。表示目的寄存器。表示第一个操作数,为寄存器。表示第二个操作数,可以是立即数、寄存器和寄存器移位操作数。例如上述指令ADDEQS R0,R1,#8;其中操作码为ADD,条件域cond为EQ,S表示该指令的执行影响CPSR寄存器的值,目的寄存器Rd为R0,第一个操 作数寄存器Rn为R1,第二个操作数OP2为立即数8。例3.1 指令格式举例:LDR R0,R1 ;读取R1地址上的存储单元的数据到寄存器R0 BEQ ENDDAT

11、A ;条件分支执行指令,执行条件EQ,即相等则跳转到ENDDATA处 ADDS R2,R1,#1;寄存器R1中的内容加1存入寄存器R2,并影响CPSR寄存器的值3.2.2指令的可选后缀 1.S后缀后缀 指令中使用S后缀时,指令执行后程序状态寄存器的条件标志位将被刷 新,不使用S后缀时,指令执行后程序状态寄存器的条件标志将不会发生变 化。S后缀通常用于对条件进行测试,例如是否有溢出,是否进位等;根据 这些变化,就可以进行一些判断,如是否大于,是否相等;从而可能影响指令执行的顺序。例 3.2 假设R0=0 x1,R3=0 x3,指令执行之前 CPSR=nzcvqIFt_SVC,分别执行如下指令CP

12、SR的值有何变化?SUB R1,R0,R3 ;R0的值减去R3的值,结果存入R1 SUBS R1,R0,R3 ;R0的值减去R3的值,结果存入R1,影响标志位 分析:执行第1条指令对于标志寄存器的值没有任何影响,因此CPSR的值不 变。执行第2条指令后CPSR=NzcvqIFt_SVC,因为R0的值减去R3值,结果变成了一个负数,故而N被置位了。2.!后缀 如果指令地址表达式中不含!后缀,则基址寄存器中的地址值不会发生变化。指令中的地址表达式中含有!后缀时,指令执行后,基址寄存器中的地址值将发生变化,变化的结果如下:基址寄存器中的值(指令执行后)指令执行前的值地址偏移量 例 3.3分别执行下面

13、两条指令有何区别?LDR R3,R0,#4 LDR R3,R0,#4!分析:在上述指令中,第1条指令没有后缀!,指令的结果是把R0加4作为地址指针,把这个指针所指向的地址单元所存储的数据读入R3,R0的值不变。第2条指令除了实现以上操作外,还把R04的结果送到R0中。使用!后缀需要注意如下事项:(1)!后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量。(2)!后缀不能用于R15(PC)的后面 (3)当用在单个地址寄存器后面时,必须确信这个寄存器有隐性的偏移量,例如“STMDB R1!R3,R5,R7”此时地址基址寄存器R1的隐性偏移量是4。3.2.3指令的条件执行 程序要执行的指

14、令,均保存在存储器中,当计算机需要执行一条指令时,首 先产生这条指令的地址,并根据地址号打开相应的存储单元,取出指令代 码,CPU根据指令代码的要求以及指令中的操作数,去执行相应的操作。表3-2指令的条件码 例 3.4 下面三条指令有何区别?ADD R4,R3,#1 ADDEQ R4,R3,#1 ADDS R4,R3,#1 分析:第1条指令不带条件标志(无条件AL),指令的执行不受条件标志 位的影响,完成加法运算:将R3的值加1存入寄存器R4。第2条 ADD 指令加上后缀EQ变为ADDEQ表示“相等则相加”,即当CPSR中的Z标 志置位时该指令执行,否则不执行。第3条指令的执行也不受条件标志

15、的影响,但是由于附带了后缀S,这条指令执行的结果将影响CPSR中 条件标志位的值。条件后缀只是影响指令是否执行,不影响指令的内容,如上述ADDEQ指令,可选后缀 EQ并不影响本指令的内容,它执行时仍然是一条加法指令。条件后缀和S后缀的关系如下:(1)如果既有条件后缀又有S后缀,则书写时S排在后面,如:ADDEQS R1,R0,R2 该指令在Z=1时执行,将R0+R2的值放入R1,同时刷新条件标志位。(2)条件后缀是要测试条件标志位,而S后缀是要刷新条件标志位。(3)条件后缀要测试的是执行前的标志位,而S后缀是依据指令的结果改变条件标志。3.2.4 ARM指令分类 ARM微处理器的指令集是加载/

16、存储型的,即指令集中的大部分指令仅能处理 寄存器中的数据,而且处理结果都要放回寄存器,而对系统存储器的访问则 需要通过专门的加载/存储指令来完成。ARM微处理器的指令集可以分为数据处理指令、数据加载与存储指令、分支 指令、程序状态寄存器(PSR)处理指令、协处理器指令和异常产生指令六大 类。3.3 ARM指令的寻址方式 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立即数寻址 立即数寻址也叫立即寻址,操作数本身就在指令中给出,取出指令也就取到了操作数

17、。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址 例 3.5 MOV R0,#15 立即数要求以“”为前缀,对于以十六进制表示的立即数,还要求在“”后加上“0 x”或“&”;对于以二进制表示的立即数,要求在“#”后加上“0b”;对于以十进制表示的立即数,要求在“#”后加上“0d”或缺省。此指令是将立即数15传送到R0中,该指令的机器编码为E3A0000FH,由指令编码中0 x00F即可得到一个32位的立即0 x0000000FH,这个数再送入R03.3.2寄存器寻址 寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式

18、例 3.6 ADD R0,R1,R2 ;R0R1R23.3.3寄存器间接寻址 寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例 3.7 LDR R0,R4;R0R4 3.3.4寄存器移位寻址 寄存器移位寻址的操作数由寄存器中的数值做相应移位而得到;例 3.8 ADD R0,R1,R2,LSL#1 MOV R0,R1,LSL R3 3.3.5基址变址寻址基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。例 3.9 LDR R0,R1,4 ;R0R14 LDR R0,R1,4!;R0R14、R1R

19、14 LDR R0,R1,4 ;R0R1、R1R14 LDR R0,R1,R2 ;R0R1R2 3.3.6多寄存器寻址采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址 方式中用一条指令最多可传送16个通用寄存器的值。连续的寄存器间用“-”连 接,否则用“,”分隔。例 3.10 LDMIA R0!,R1-R4 ;R1R0 ;R2R04 ;R3R08 ;R4R012 指令执行前内存和寄存器值指令执行后内存和寄存器值3.3.7相对寻址与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为 基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数 的有效地址。以下程序段完成

20、子程序的调用,分支指令BL采用了相对寻址方式:BL proc ;跳转到子程序proc处执行 proc MOV R0,#1 3.3.8堆栈寻址 堆栈是一种数据结构,按后进先出(Last In First Out,LIFO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指 向栈顶。ARM中采用LDMFD和STMFD指令分别用来支持POP操作(出栈)和PUSH操作(进栈),R13作为堆栈指针。例 3.11 STMFD R13!,R0-R4;LDMFD R13!,R0-R4;3.4数据处理指令 3.4.1数据传送指令 3.4.2移位操作 3.4.3算术指令 3.4.4逻辑

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

22、存器Operand2:第二操作数,该数可以是立即数或寄存器移位数。3.4.1数据传送指令 数据传送指令主要用于将一个寄存器中的数据传送到另一个寄存器,或者 将一个立即数传送到寄存器,这类指令通常用来设置寄存器的初始值。数据传送指令包括:MOV数据传送指令 MVN数据取反传送指令1MOV指令 汇编格式:MOV S Rd,operand2 功 能:MOV指令将源操作数operand2传送到目的寄存器Rd中。通常 operand2是一个立即数、寄存器Rm或被移位的寄存器。S选项 决定指令的操作是否影响CPSR中条件标志位的值,有S时指令 执行后的结果影响CPSR中条件标志位N和Z值,在计算第2操作

23、数时更新标志C,不影响V标志例 3.12 MOV指令示例:MOV R1,R0 ;将寄存器R0的值传送到寄存器R1 MOV PC,R14 ;将寄存器R14的值传送到PC,常用于子程序返回 MOV R1,R0,LSL3 ;将寄存器R0的值左移3位后传送到R1 MOV R0,#5 ;将立即数5传送到寄存器R02MVN指令 汇编格式:MVNS Rd,operand2 功 能:MVN指令可完成从另一个寄存器、被移位的寄存器或将一个立 即数传送到目的寄存器Rd。与MOV指令不同之处是:数据在传送 之前被按位取反了,即把一个被取反的值传送到目的寄存器中。S选项决定指令的操作是否影响CPSR中条件标志位的值,

24、有S时 指令执行后的结果影响CPSR中条件标志位N和Z值,在计算第2 操作数时更新标志C,不影响V标志。例 3.13 MVN指令示例:MVN R0,0 ;将立即数0取反传送到寄存器R0中,完成后R0=-1 MVN R1,R2 ;将R2取反,结果存到R1中3.4.2移位操作ARM微处理器一个显著的特征是:在操作数进入ALU之前,对操作数进行预 处理。如:指定位数的左移或右移,这种功能明显增强了数据处理操作的灵 活性。这种预处理是通过ARM微处理器内嵌的桶形移位器(Barrel Shifter)来实现的。桶形移位器和ALU的关系如图3-11所示 桶形移位器支持数据的各种移位操作,移 位操作在ARM

25、指令集中不作为单独的指令 使用,它只能作为指令格式中的一个字段,在汇编语言中作为指令中的选项。例如,数据处理指令的第二个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位 操作。移位操作包括如下5种类型:LSL 逻辑左移LSR 逻辑右移ASR 算术右移ROR 循环右移 RRX 带扩展的循环右移图3-11 桶形移位器和ALU1LSL逻辑左移 汇编格式:Rm,LSL 功 能:LSL指令可完成对通用寄存器Rm中的内容进行逻辑左移操作,按操作 数op1所指定的数量向左移位,低位用零来填充。逻辑左移一次相当于将 无符号数据做乘2操作。逻辑左移如图3-12所示。指令格式中的操作数op1 用来控制左移

26、的次数,op1有如下两种表示方式:图3-12 逻辑左移(1)立即数控制方式立即数控制方式就是寄存器Rm移位的位数由一个数值常量来控制,例如:Rm,LSL#2在这个表达式中,对Rm中的数据逻辑左移2位。使用立即数控制方式时必须满足:0立即数31。(2)寄存器控制方式寄存器控制方式就是寄存器Rm移位的位数由另一个寄存器Rs来控制,Rs是通用寄存器,但不可使用R15(程序计数器)。例如:Rm,LSL Rs假设Rs的值为3,则在这个表达式中表示对Rm中的数据逻辑左移3位。同样使用寄存器控制方式也必须满足:0Rs31。例 3.14 设指令操作之前R0=0 x00000000,R1=0 x80000004

27、,则执行如下指令后R0,R1的值有何变化?MOV R0,R1,LSL#1 例 3.15 设指令操作之前CPSR=nzcvqiFt_USER,R0=0 x00000000,R1=0 x80000004,则执行如下指令后R0,R1,CPSR中的值有何变化?MOVS R0,R1,LSL#1 2LSR逻辑右移 汇编格式:Rm,LSR 功 能:LSR指令可完成对通用寄存器Rm中的数据,按操作数op1所指定的数量向 右移位,空出的最高位用零来填充。逻辑右移一次相当于将无符号数据做除2 操作。逻辑右移如图3-14所示。图3-14 逻辑右移 指令格式中的操作数op1用来控制右移的次数,关于操作数op1的要求如

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

29、求如LSL指令所述,唯一区别是取值范围要求:1立即数或Rs32。同样地,当指令中附加了S选项时,移位指令操作的结果还将影响CPSR中的标志位。例 3.17 设指令操作之前CPSR=nzcvqiFt_USER,R0=0 x00000000,R1=0 x80000001,则执行如下指令后R0,R1,CPSR中的值有何变化?MOVS R0,R1,ASR#1 4ROR循环右移 汇编格式:Rm,ROR 功 能:ROR可完成对通用寄存器中的内容,按操作数所指定的数量向右循 环移位,左端用右端移出的位来填充。循环右移如图3-16所示。图3-16循环右移 指令格式中的操作数op1用来控制右移的次数,关于操作数

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

31、令操作之前CPSR=nzcvqiFt_USER,R0=0 x00000000,R1=0 x80000001,则执行如下指令后R0,R1,CPSR中的值有何变化?MOVS R0,R1,RRX3.4.3算术指令 ARM中的算术指令主要指加法和减法,这些指令主要实现两个32位数据的加 减操作,该类指令常常和桶形移位器结合起来,获得许多灵活的功能。算术指令主要包括:ADD 加法指令 ADC 带进位加法指令 SUB 减法指令 SBC 带借位减法指令 RSB 逆向减法指令 RSC 带借位的逆向减法指令 1.ADD 加法指令 汇编格式:ADDS Rd,Rn,operand2 功 能:ADD指令用于把寄存器R

32、n的值和操作数operand2相加,并将结果 存放到Rd寄存器中。即Rd=Rn+operand2,其中Rd为目的寄存器,Rn 为操作数1,要求是一个寄存器,operand2是操作数2,可以是一个寄 存器,被移位的寄存器,或一个立即数。S选项决定指令的操作是否影 响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条 件标志位N、Z、C、V标志。例 3.20 ADD指令示例:ADD R0,R1,R2 ;R0=R1+R2 ADD R0,R1,#5 ;R0=R1+5 ADD R0,R1,R2,LSL#2 ;R0=R1+(R2左移2位)(1)立即数控制的寄存器移位表达式 立即数控制方式就是

33、寄存器Rm移位的位数由一个数值常量来控制,例如:ADD R0,R1,R2,LSL#2 ;R0=R1+(R2左移2位)在这个表达式中,对R2中的数据逻辑左移2位,然后和R1相加,其结果放入寄存器R0中。(2)寄存器控制的寄存器移位方式 寄存器控制方式就是寄存器Rm移位的位数由另一个寄存器Rs来控制,Rs是通用寄存器,但不可使用R15(程序计数器)。例如:ADD R0,R1,R2,LSL R3 假设R3的值为3,则在这个表达式中表示对R2中的数据逻辑左移3位,然后和R1相加,其结果放入寄存器R0中。(3)数字常量表达式 数字常量表达式可以简单到一个立即数,还可以使用单目操作符、双目操 作符、逻辑操

34、作符和算术操作符等。各种操作符将在第4章介绍,这里仅举例说明:0 x88 ;立即数 0 x40+0 x20 ;使用加法#0 x40+0 x20*4 ;使用加减乘除算术运算#0 x80:ROR:02 ;使用移位操作,循环右移2位#2_11010010 ;使用二进制#0 xFF:MOD:08 ;取模操作#0 xFF0000:AND:660000;逻辑操作,两数相与 2.ADC带进位加法指令 汇编格式:ADCS Rd,Rn,operand2 功 能:ADC指令用于把寄存器Rn的值和操作数operand2相加,再 加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器 Rd中。即Rd=Rn+ope

35、rand2+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减法指令 汇编格式:SUBS Rd,Rn,opera

36、nd2 功 能:SUB指令用于把寄存器Rn的值减去操作数operand2,并将结果存放 到目的寄存器Rd中。即Rd=Rn-operand2,其中Rd为目的寄存器,Rn为操作数1,必须是一个寄存器,operand2是操作数2,可以是一 个寄存器,被移位的寄存器或一个立即数。该指令可用于有符号数或 无符号数的减法运算。S选项决定指令操作的结果是否影响CPSR中 条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位 N、Z、C、V标志。例 3.22 SUB指令示例:SUB R0,R1,R2 ;R0=R1-R2 SUB R0,R1,#6 ;R0=R1-6 SUB R0,R2,R3,LSL#1

37、;R0=R2-(R3 左移一位)4.SBC 带借位减法指令 汇编格式:SBCS 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位操

38、作数0 x20000000 50000000放在R2、R3中,第二个64位操作数0 x3000000040000000放在 R4、R5中。64位结果放在R0、R1中。5.RSB 逆向减法指令 汇编格式:RSBS Rd,Rn,operand2 功 能:RSB指令称为逆向减法指令,指令表示把操作数2减去操作数1,并将结果存放到目的寄存器中。即Rd=operand2-Rn,其中Rn为操作数1,应是一个寄存器,operand2为操作数2,可以是一个寄存器,被移位的寄存器或一个立即数。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N、Z、C、V标志。

39、该指令可用于有符号数或无符号数的减法运算。例 3.24 RSB指令示例:RSB R0,R1,R2 ;R0=R2-R1 RSB R0,R1,#6 ;R0=6-R1 RSB R0,R2,R3,LSL#1 ;R0=(R3左移一位)-R26.RSC带借位的逆向减法指令 汇编格式:RSCS Rd,Rn,operand2 功 能:RSC指令表示把操作数operand2减去寄存器Rn的值,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器Rd中。即Rd=operand2-Rn-!C,其中Rd为目的寄存器,Rn为操作数1,必须是一个寄存器,operand2是操作数2,可以是一个寄存器,被移位的寄存

40、器,或一个立即数。S选项决定指令的操作是否影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR中条件标志位N、Z、C、V标志。例 3.25 RSC指令示例:RSC R0,R1,R2 ;R0=R2R1-!C3.4.4逻辑运算指令 逻辑运算是对操作数按位进行操作的,位与位之间无进位或借位,无数的正负与数 的大小之分,这种运算的操作数称为逻辑数或逻辑值。逻辑运算指令主要包括:AND 逻辑与指令 ORR 逻辑或指令 EOR 逻辑异或指令 BIC 位清除指令1.AND 逻辑与指令 汇编格式:ANDS Rd,Rn,operand2 功 能:AND指令将两个操作数按位进行逻辑与运算,结果放置到目

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

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

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

44、结果放置到目的寄存器 Rd中。即Rd=Rn AND(!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比较指令 比较指令通常用于把一个寄

45、存器与一个32位的值进行比较或测试。比较 指令根据结果更新CPSR中的标志位,但不影响其它的寄存器。在设置标志位 后,其它指令可以通过条件执行来改变程序的执行顺序。对于比较指令,不 需要使用S后缀就可以改变标志位的值。比较指令包括:CMP 比较指令 CMN 反值比较指令 TST 位测试指令 TEQ 相等测试指令 1.CMP比较指令 汇编格式:CMPS Rn,operand2 功 能:CMP指令将寄存器Rn的内容和另一个操作数operand2进行比较,同时更新CPSR中条件标志位的值。该指令实质上是进行一次减法运 算,但不存储结果,只更改条件标志位。后面的指令就可以根据条件标 志位来决定是否执行

46、。例如,当操作数Rn大于操作操作数operand2时,执行CMP指令后,则此后带有GT 后缀的指令将可以执行。例 3.30 CMP指令示例:CMP R1,10 ;将寄存器R1的值与10相减,并设置CPSR的标志位 ADDGT R0,R0,#5 ;如果R110,则执行ADDGT指令,将R0加5 2.CMN反值比较指令 汇编格式:CMNS Rn,operand2 功 能:CMN指令用于把一个寄存器Rn的内容和另一个操作数operand2取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际上是将操作数Rn和操作数operand2相加,并根据结果更改条件标志位。同样,后面的指令就可以根据条件标

47、志位来决定是否执行。例 3.31 CMN指令示例:CMN R0,R1 ;将寄存器R0的值与寄存器R1的值相加,;并根据结果设置CPSR的标志位 CMN R0,10;将寄存器R0的值与立即数10相加,;并根据结果设置CPSR的标志位 3.TST位测试指令 汇编格式:TSTS Rn,operand2 功 能:TST指令用于把一个寄存器Rn的内容和另一个操作数operand2按位进行与运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用来检查是否设置了特定的位。其中操作数Rn是要测试的数据,这里操作数operand2可以看作一个32位的掩码,如果在掩码中设置了某一位,表示检查该位。未设置的

48、掩码位则表示不检查。例 3.32 如要检查R0中的第0位和第1位是否为1则应执行什么指令?分析:检查R0 中的第0位和第1位是否为1则不应改变R0的值,因此执行如下指令:TST R1,3 4.TEQ相等测试指令 汇编格式:TEQS Rn,operand2 功 能:TEQ指令用于把一个寄存器Rn的内容和另一个操作数operand2按 位进行异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数Rn和操作数operand2是否相等。例 3.33 TEQ指令示例:TEQ R1,R2 ;将寄存器R1的值与寄存器R2的值按位异或,;并根据结果设置CPSR的标志位3.4.6乘法指令

49、乘法指令把一对寄存器的内容相乘,然后根据指令类型把结果累加到其它的寄存器。ARM微处理器支持的乘法指令与乘加指令共有6条,根据运算结果可分为32位运算和64位运算两类。64位乘法又称为长整型乘法指令,由于结果太大,不能在放在一个32位的寄 存器中,所以把结果存放在2个32位的寄存器Rdlo和Rdhi中。Rdlo存放低32 位,Rdhi存放高32位。与前面的数据处理指令不同,指令中的所有源操作 数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄 存器。同时,目的寄存器Rd和操作数Rm必须是不同的寄存器。乘法指令与 乘加指令共有以下6条:MUL 32位乘法指令 MLA 32位乘加指

50、令 SMULL 64位有符号数乘法指令 SMLAL 64位有符号数乘加指令 UMULL 64位无符号数乘法指令 UMLAL 64位无符号数乘加指令 1.MUL 32位乘法指令 汇编格式:MULS Rd,Rm,Rs 功 能:MUL指令完成将操作数Rm与操作数Rs 的乘法运算,并把结果放 置到目的寄存器Rd中,即Rd=RmRs。S选项决定指令的操作是否 影响CPSR中条件标志位的值,有S时指令执行后的结果影响CPSR 中条件标志位N和Z值,在ARMv4及以前版本中,标志 C和V不可靠,在ARMV5及以后版本中不影响C和V标志(以下几个乘法指令对于S 的规定与此相同)。例 3.34 MUL指令示例:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《汇编语言程序设计 -基于ARM体系结构》课件第3章ARM指令系统.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|