1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级二级二级二级二级二级二级二级二级二级二级,第三级,第四级,第五级,*,第,2,章,ARM,指令分类及其寻址方式,在本章中,将介绍,ARM,指令分类以及各类指令对应的寻址方式。,2,2.1 ARM,指令集概要介绍,在本节中,将介绍,ARM,指令相关的一些基本概念,包括指令的分类、指令的一般编码格式以及,ARM,指令中的条件码。,3,2.1.1 ARM,指令的分类,ARM,指令集可以分为跳转指令、数据处理指令、程序状态寄存器,(PSR),传输指令、,Load/Store,指令、协处理器指令和异常中断产生指令,6,类。,4,2.1.2 ARM
2、指令的一般编码格式,ARM,指令字长为固定的,32,位。一条典型的,ARM,指令编码格式如下:,31 28 27 25 24 21 20 19 16 15 12 11 8 7 0,其中的符号及参数说明如下。,opcode,:指令操作符编码。,cond,:指令执行的条件编码。,S,:决定指令的操作是否影响,CPSR,的值。,Rd,:目标寄存器编码。,Rn,:包含第,1,个操作数的寄存器编码。,shifter_operand,:表示第,2,个操作数。,cond,0 0 1,opcode,S,Rn,Rd,shifter_operand,5,2.1.3 ARM,指令的条件码域,条件码共有,16,个,
3、各条件码的含义和助记符如表,2.1,所示。可条件执行的指令可以在其助记符的扩展域加上条件码助记符,从而在特定的条件下执行。,参见教材,P23,6,2.2 ARM,指令的寻址方式,ARM,指令的寻址方式有以下几种,分别进行讨论:,数据处理指令的操作数的寻址方式。,字及无符号字节的,Load/Store,指令的寻址方式。,杂类,Load/Store,指令的寻址方式。,批量,Load/Store,指令的寻址方式。,协处理器,Load/Store,指令的寻址方式。,7,2.2.1,数据处理指令的操作数的寻址方式,通常数据处理指令的格式如下所示:,S,其中的符号及参数说明如下。,:是指令助记符,如,AD
4、D,表示算术加操作指令。,:表示指令执行的条件。,S,:决定指令的操作是否影响,CPSR,的值。,:表示目标寄存器。,:表示包含第,1,个操作数的寄存器。,:表示第,2,个操作数。,8,2.2.1,数据处理指令的操作数的寻址方式,通常有下面,3,种格式。,(1),立即数方式。,(2),寄存器方式。,(3),寄存器移位方式。,数据处理指令操作数的具体寻址方式有下面,11,种。,#,LSL#,LSL ,LSR#,LSR ,ASR#,ASR ,ROR#,ROR ,RRX,9,2.2.2,字及无符号字节的,Load/Store,指令的寻址方式,各种类型的,Load/Store,指令的寻址方式由两部分组
5、成。一部分为一个的基址寄存器;另一部分为一个地址偏移量。基址寄存器可以为任一个通用寄存器;地址偏移量可以有以下,3,种格式:,立即数。,寄存器。,寄存器及一个移位常数。,同样,寻址方式的地址计算方法有如下,3,种:,偏移量方法。,事先更新方法。,事后更新方法。,10,2.2.2,字及无符号字节的,Load/Store,指令的寻址方式,LDR,指令的语法格式如下所示:,LDRB T,其中,,表示第,2,个操作数的内存地址,共有如下,9,种格式:,#+/,+/,+/,,,#,#+/!,+/!,+/,,,#!,#+/,+/,+/,,,#,11,2.2.3,杂类,Load/Store,指令的寻址方式,
6、这里所说的杂类,Load/Store,指令,包括操作数为半字,(,无符号数或带符号数,),数据的,Load/Store,指令;操作数为带符号的字节数据的,Load,指令;双字的,Load/Store,指令。这类指令的语法格式为:,LDR|STRH|SH|SB|D ,其中,,是指令中内存单元的寻址方式,具体有以下,6,种格式:,#+/,+/,#+/!,+/!,#+/,+/,12,2.2.4,批量,Load/Store,指令的寻址方式,一条批量,Load/Store,指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。其语法格式如下:,DM|STM!,其中,指令中寄存器和内存单元的对应关系满
7、足这样的规则,即编号低的寄存器对应于内存中的低地址单元,编号高的寄存器对应于内存中的高地址单元,,中存放地址块的最低地址值。,13,2.2.4,批量,Load/Store,指令的寻址方式,表示地址的变化方式,有以下,4,种方式。,IA(Increment After),:事后递增方式。,IB(Increment Before),:事先递增方式。,DA(Decrement After),:事后递减方式。,DB(Decrement Before),:事先递减方式。,批量,Load/Store,指令的编码格式如下:,14,2.2.4,批量,Load/Store,指令的寻址方式,1.,事后递增方式,I
8、A,2.,事先递增方式,IB,3.,事后递减方式,DA,4.,事先递减方式,DB,5.,对应于栈操作的寻址方式,15,2.2.5,协处理器,Load/Store,指令的寻址方式,一条协处理器,Load/Store,指令可以在,ARM,处理器和协处理器之间传输批量数据。其语法格式如下:,L,其中,,表示地址的变化方式,有以下,4,种格式:,#+/*4,#+/*4!,#+/*4,协处理器,Load/Store,指令的编码格式如下所示。,16,2.2.5,协处理器,Load/Store,指令的寻址方式,1.,偏移量,#+/*4,2.,事先更新,#+/*4!,3.,事先更新,#+/*4,4.,非索引,
9、17,第,3,章,ARM,指令集介绍,在本章中,将详细介绍各,ARM,指令,并给出一些典型的,ARM,功能代码段。,19,3.1 ARM,指令集,ARM,指令集可以分为,6,类,即跳转指令、数据处理指令、程序状态寄存器,(PSR),传输指令、,Load/Store,指令、协处理器指令和异常中断产生指令。,为了更清楚地描述这些指令,将一些大类的指令进一步分为几个小类分别讲述。,20,3.1.1,跳转指令,在,ARM,中,有两种方式可以实现程序的跳转:一种是跳转指令;另一种是直接向,PC,寄存器,(R15),中写入目标地址值。,在,ARM,版本,5,以前的体系中,传送到,PC,寄存器中的目标地址值
10、的低两位,bits1:0,被忽略,跳转指令只能在,ARM,指令集中执行,即程序不能从,ARM,状态切换到,Thumb,状态。,非,T,系列版本,5,的,ARM,体系不含,Thumb,指令,当程序试图切换到,Thumb,状态时,将产生未定义指令异常中断。,ARM,的跳转指令可以从当前指令向前或向后,32MB,的地址空间跳转。这类跳转指令有以下,4,种。,B,:跳转指令。,BL,:带返回的跳转指令。,BLX,:带返回和状态切换的跳转指令。,BX,:带状态切换的跳转指令。,21,3.1.1,跳转指令,1.B(,跳转指令,),及,BL(,带返回的跳转指令,),2.BLX(1),3.BLX(2),4.B
11、X,指令,22,3.1.2,数据处理指令,数据处理指令又可大致分为,3,类:数据传送指令,如,MOV,;算术逻辑运算指令,如,ADD,、,SUB,和,AND,等;比较指令,如,TST,。,数据处理指令包括以下指令。,MOV,:数据传送指令。,MVN,:数据求反传送指令。,CMP,:比较指令。,CMN,:基于相反数的比较指令。,TST,:位测试指令。,TEQ,:相等测试指令。,ADD,:加法指令。,SUB,:减法指令。,23,3.1.2,数据处理指令,RSB,:逆向减法指令。,ADC,:带位加法指令。,SBC,:带位减法指令。,RSC,:带位逆向减法指令。,AND,:逻辑与操作指令。,BIC,:
12、位清除指令。,EOR,:逻辑异或操作指令。,ORR,:逻辑或操作指令。,24,3.1.3,乘法指令,ARM,有两类乘法指令:一类为,32,位的乘法指令,即乘法操作的结果为,32,位;另一类为,64,位的乘法指令,即乘法操作的结果为,64,位。两类指令共有以下,6,条。,MUL,:,32,位乘法指令。,MLA,:,32,位带加数的乘法指令。,SMULL,:,64,位有符号数乘法指令。,SMLAL,:,64,位带加数的有符号数乘法指令。,UMULL,:,64,位无符号数乘法指令。,UMLAL,:,64,位带加数的无符号数乘法指令。,25,3.1.4,杂类的算术指令,在,ARMv5,及以上的版本中,
13、包含一条特别的指令,CLZ,,用于计算操作数最高端,0,的个数。这条指令主要用于以下两种场合:,计算操作数规范化,(,使其最高位为,1),时需要左移的位数。,确定一个优先级掩码中的最高优先级,(,最高位的优先级,),。,CLZ,前导,0,个数计数指令,CLZ,指令用于计算寄存器中操作数最高端,0,的个数。如果操作数的,bit31,为,1,,则指令返回,0,;如果操作数为,0,,则指令返回,32,。,指令的编码格式,26,3.1.5,状态寄存器访问指令,ARM,中有两条指令用于在状态寄存器和通用寄存器之间传送数据。,关于状态寄存器,这里仅强调以下几点。,(1),状态寄存器中,有些位是当前没有使用
14、的,但在,ARM,将来的版本中有可能使用这些位,因此用户程序不要使用这些位。,(2),程序不能通过直接修改,CPSR,中的,T,控制位直接将程序状态切换到,Thumb,状态,必须通过,BX,等指令完成程序状态的切换。,(3),通常修改状态寄存器是通过“读取,-,修改,-,写回”的操作序列来实现的。,(4),状态寄存器访问指令包括以下两条。,MRS,:状态寄存器到通用寄存器的传送指令。,MSR,:通用寄存器到状态寄存器的传送指令。,27,3.1.6 Load/Store,内存访问指令,Load,指令用于从内存中读取数据放入寄存器中;,Store,指令用于将寄存器中的数据保存到内存。,ARM,有两
15、大类的,Load/Store,指令:一类用于操作,32,位的字类型数据以及,8,位无符号的字节类型数据;另一类用于操作,16,位半字类型的数据以及,8,位的有符号字节类型的数据。,Load/Store,内存访问指令的一个操作数放在寄存器中,另一个操作数的寻址方式参见,2.2,节。,28,3.1.6 Load/Store,内存访问指令,用于操作,32,位的字类型数据以及,8,位无符号的字节类型数据的,Load/Store,指令有以下指令。,LDR,:字数据读取指令。,LDRB,:字节数据读取指令。,LDRBT,:用户模式的字节数据读取指令。,LDRH,:半字数据读取指令。,LDRSB,:有符号的
16、字节数据读取指令。,LDRSH,:有符号的半字数据读取指令。,LDRT,:用户模式的字数据读取指令。,STR,:字数据写入指令。,STRB,:字节数据写入指令。,STRBT,:用户模式字节数据写入指令。,STRH,:半字数据写入指令。,STRT,:用户模式字数据写入指令。,29,3.1.7,批量,Load/Store,内存访问指令,批量,Load,内存访问指令可以一次从连续的内存单元中读取数据,传送到指令中的内存列表中的各个寄存器中。,批量,Store,内存访问指令可以将指令中寄存器列表中的各个寄存器值写入到内存中,内存的地址由指令中的寻址模式确定。,批量,Load/Store,内存访问指令的
17、语法格式如下:,LDM|STM Rn!,其中,操作数的寻址方式参见,2.2,节。,30,3.1.7,批量,Load/Store,内存访问指令,批量,Load/Store,内存访问指令主要有以下几条。,LDM(1),:批量内存字数据读取指令。,LDM(2),:用户模式的批量内存字数据读取指令。,LDM(3),:带状态寄存器的批量内存字数据读取指令。,STM(1),:批量内存字数据写入指令。,STM(2),:用户模式的批量内存字数据写入指令。,31,3.1.8,信号量操作指令,信号量用于进程间的同步和互斥。对信号量的操作通常要求是一个原子操作,即在一条指令中完成信号量的读取和修改操作。,ARM,提
18、供了如下两条指令来完成信号量的操作。,SWP,:交换指令。,SWPB,:字节交换指令。,32,3.1.9,异常中断产生指令,ARM,有两条异常中断产生指令。,SWI,:软中断指令。,SWI,用于产生,SWI,异常中断,,ARM,正是通过这种机制实现在用户模式中对操作系统中特权模式的程序的调用。,BKPT,:断点中断指令。,BKPT,在,ARMv5,及以上的版本中引入,主要用于产生软件断点,供调试程序使用。,33,3.1.10 ARM,协处理器指令,ARM,支持,16,个协处理器。,ARM,协处理器可以部分地执行一条指令,然后产生异常中断,如像除法运算除数为,0,的情况。所有这些操作均由,ARM
19、协处理器决定,,ARM,处理器并不参与这些操作。同样,,ARM,协处理器指令中的协处理器的寄存器标识符以及操作类型助记符也有各种不同的实现定义,程序员可以通过宏来定义这些指令的语法格式。,ARM,协处理器指令包括以下,3,类:,用于,ARM,处理器初始化,ARM,协处理器的数据处理操作。,用于,ARM,处理器的寄存器和,ARM,协处理器的寄存器间的数据传送操作。,用于在,ARM,协处理器的寄存器和内存单元之间传送数据。,34,3.1.10 ARM,协处理器指令,这些指令包括以下,5,条。,CDP,:协处理器数据操作指令。,LDC,:协处理器数据读取指令。,STC,:协处理器数据写入指令。,M
20、CR,:,ARM,寄存器到协处理器寄存器的数据传送指令。,MRC,:协处理器寄存器到,ARM,寄存器的数据传送指令。,35,3.2,一些基本的,ARM,指令功能段,本节介绍一些基本的,ARM,指令代码段。通过对这些代码段的分析,进一步理解相关的,ARM,指令的用法,逐步学习如何使用,ARM,指令编写高效率的程序。本节主要包括以下几部分的内容:,算术逻辑运算指令的应用。,跳转指令的应用。,Load/Store,指令的应用。,批量,Load/Store,指令的应用。,信号量指令的应用。,与系统相关的一些指令的应用。,36,3.2.1,算术逻辑运算指令的应用,1.,位操作指令应用举例,2.,实现乘法
21、的指令段举例,3.64,位数据运算举例,4.,转换内存中数据存储方式的指令段,一种是字数据中的高位数据存放在高地址处,低位数据存放在低地址处,另一种是字中高位数据存放在低地址处,低位数据存放在高地址处,37,3.2.2,跳转指令的应用,1.,子程序调用,2.,条件执行,3.,条件判断语句,4.,循环语句,5.,多路分支程序语句,38,3.2.3 Load/Store,指令的应用,1.,链表操作,2.,简单的串比较,3.,长跳转,4.,多路跳转,39,3.2.4,批量,Load/Store,指令的应用,1.,简单的块复制,2.,子程序进入和退出时数据的保存和恢复,40,3.2.5,信号量指令的应
22、用,信号量用于实现对临界区数据访问的同步。下面的代码说明了在,ARM,中如何实现这一过程。代码中用进程标识符来表示各信号量的所有者,代码执行前进程的标识符保存在,R1,中,信号量的地址保存在,R0,中。当信号量值为,0,时,表示与该信号量相关的临界区可用;当信号量值为,1,时,表示当前有进程正在查看该信号量的值。如果当前进程查看的信号量正忙,当前进程将一直等待该信号量。为了避免当前进程的查询操作阻塞操作系统的进程调度,可以在下一次查询之前完成操作系统中的系统调用,使当前进程休眠一段时间。,参见教材,P116,41,3.2.6,与系统相关的一些指令代码段,1.SWI,中断处理程序示例,2.IRQ
23、中断处理程序示例,3.,进程切换,42,3.3 Thumb,指令介绍,在,ARM,体系结构中,,ARM,指令集中的指令是,32,位指令,其执行效率很高。对于存储系统数据总线为,16,位的应用系统,,ARM,体系提供了,Thumb,指令集。,Thumb,指令集是对,ARM,指令集的一个子集进行重新编码而得到的,其指令长度为,16,位。在,ARM,体系的,T,变种,(T Variant),的版本中,同时支持,ARM,指令集和,Thumb,指令集,而且遵守一定的调用规则时,,Thumb,子程序和,ARM,子程序可以相互调用。,通常在处理器执行,ARM,程序时,称处理器处于,ARM,状态;在处理器执
24、行,Thumb,程序时,称处理器处于,Thumb,状态。注意处理器状态和处理器模式指的是不同的概念。,Thumb,指令集并没有改变,ARM,体系底层的程序设计模型,只是在该模型上增加了一些限制条件。,Thumb,指令集中的数据处理指令的操作数仍然是,32,位的,指令寻址地址也是,32,位的。,43,3.3 Thumb,指令介绍,处理器执行,Thumb,指令时,可以使用的整数寄存器通常为,R0,R7,,有些指令还使用到了程序计数器寄存器,PC(R15),、程序返回寄存器,LR(R14),以及栈指针寄存器,SP(R13),。在,Thumb,状态下,读取,R15,寄存器时,位,0,值为,0,,位,3
25、1:1,包含了程序计数器的值;在向,R15,寄存器写入数据时时,位,0,被忽略,位,31:1,被设置成当前程序计数器的值。,Thumb,指令集没有提供访问,CPSR/SPSR,寄存器的指令。处理器根据,CPSR,寄存器中的,T,位来确定指令类型:,当,T,位为,0,时,指令为,ARM,指令。,当,T,位为,1,时,指令为,Thumb,指令。,44,第,4,章,ARM,汇编语言程序设计,本章介绍如何编写,ARM,和,Thumb,汇编语言程序,同时介绍,ARM,汇编编译器,armasm,的使用方法。,46,4.1,伪,操,作,伪操作不像机器指令那样在计算机运行期间由机器执行,它是在汇编程序对源程序
26、汇编期间由汇编程序处理的。宏是一段独立的程序代码。在程序中通过宏指令调用该宏。当程序被汇编时,汇编程序将对每个宏调用进行展开,用宏定义体取代源程序中的宏指令。本节介绍以下类型的,ARM,伪操作和宏指令:,符号定义,(Symbol Definition),伪操作。,数据定义,(Data Definition),伪操作。,汇编控制,(Assembly Control),伪操作。,数据帧描述,(Frame Description),伪操作。,信息报告,(Reporting),伪操作。,其他,(Miscellaneous),伪操作。,47,4.1.1,符号定义伪操作,符号定义,(Symbol Defi
27、nition),伪操作用于定义,ARM,汇编程序中的变量,对变量进行赋值以及定义寄存器名称。包括以下伪操作。,GBLA,、,GBLL,及,GBLS,:声明全局变量。,LCLA,、,LCLL,及,LCLS,:声明局部变量。,SETA,、,SETL,及,SETS,:给变量赋值。,RLIST,:为通用寄存器列表定义名称。,CN,:为协处理器的寄存器定义名称。,CP,:为协处理器定义名称。,DN,及,SN,:为,VFP,的寄存器定义名称。,FN,:为,FPA,的浮点寄存器定义名称。,48,4.1.2,数据定义伪操作,数据定义,(Data Definition),伪操作包括以下具体的伪操作。,LTORG
28、声明一个数据缓冲池,(Literal Pool),的开始。,MAP,:定义一个结构化的内存表,(Storage Map),的首地址。,FIELD,:定义结构化的内存表中的一个数据域,(Field),。,SPACE,:分配一块内存单元,并用,0,初始化。,DCB,:分配一段字节的内存单元,并用指定的数据初始化。,DCD,及,DCDU,:分配一段字的内存单元,并用指定的数据初始化。,DCDO,:分配一段字的内存单元,并将各单元的内容初始化成该单元相对于静态基值寄存器的偏移量。,49,4.1.2,数据定义伪操作,DCFD,及,DCFDU,:分配一段双字的内存单元,并用双精度的浮点数据初始化。,D
29、CFS,及,DCFSU,:分配一段字的内存单元,并用单精度的浮点数据初始化。,DCI,:分配一段字节的内存单元,用指定的数据初始化,指定内存单元中存放的是代码,而不是数据。,DCQ,及,DCQU,:分配一段双字的内存单元,并用,64,位的整数数据初始化。,DCW,及,DCWU,:分配一段半字的内存单元,并用指定的数据初始化。,DATA,:在代码段中使用数据。现已不再使用,仅用于保持向前兼容。,50,4.1.3,汇编控制伪操作,汇编控制,(Assembly Control),伪操作包括下面的伪操作:,IF,、,ELSE,及,ENDIF,WHILE,及,WEND,MACRO,及,MEND,MEXI
30、T,51,4.1.4,数据帧描述伪操作,栈中数据帧描述伪操作主要用于调试,这里不介绍这部分内容。感兴趣的读者可以参考,ARM,的相关资料。,52,4.1.5,信息报告伪操作,信息报告,(Reporting),伪操作包括下列具体的伪操作:,ASSERT,INFO,OPT,TTL,及,SUBT,53,4.1.6,其他的伪操作,这些杂类的伪操作包括:,CODE16,及,CODE32,EQU,AREA,ENTRY,END,ALIGN,EXPORT,或,GLOBAL,IMPORT,EXTERN,GET,或,INCLUDE,54,4.1.6,其他的伪操作,INCBIN,KEEP,NOFP,REQUIRE,
31、REQUIRE8,及,PRESERVE8,RN,ROUT,55,4.2 ARM,汇编语言伪指令,ARM,中伪指令不是真正的,ARM,指令或者,Thumb,指令,这些伪指令在汇编编译器对源程序进行汇编处理时被替换成对应的,ARM,或者,Thumb,指令,(,序列,),。,ARM,伪指令包括,ADR,、,ADRL,、,LDR,和,NOP,。,1.ADR(,小范围的地址读取伪指令,),2.ADRL(,中等范围的地址读取伪指令,),3.LDR,大范围的地址读取伪指令,4.NOP,空操作伪指令,56,4.3 ARM,汇编语言语句的格式,ARM,汇编语言语句格式如下:,symbol instruction
32、directive|pseudo-instruction;comment,其中的符号及参数说明如下:,instruction,为指令。在,ARM,汇编语言中,指令不能从一行的行头开始。在一行语句中,指令的前面必须有空格或者符号。,directive,为伪操作。,pseudo-instruction,为伪指令。,symbol,为符号。在,ARM,汇编语言中,符号必须从一行的行头开始,并且符号中不能包含空格。在指令和伪指令中,符号用作地址标号,(label),;在有些伪操作中,符号用作变量或者常量。,comment,为语句的注释。在,ARM,汇编语言中,注释以分号,(;),开头。注释的结尾即为一
33、行的结尾。注释也可以单独占用一行。,57,4.3.1 ARM,汇编语言中的符号,在,ARM,汇编语言中,符号,(Symbols),可以代表地址,(Addresses),、变量,(Variables),和数字常量,(Numeric Constants),。当符号代表地址时,又称为标号,(Label),。当标号以数字开头时,其作用范围为当前段,(,没有使用,ROUT,伪操作时,),,这种标号又称为局部标号,(Local Label),。符号包括变量、数字常量、标号和局部标号。,符号的命名规则如下:,符号由大小写字母、数字以及下划线组成。,局部标号以数字开头,其他的符号都不能以数字开头。,符号是区分
34、大小写的。,符号中的所有字符都是有意义的。,符号在其作用范围内必须惟一,即在其作用范围内不可有同名的符号。,程序中的符号不能与系统内部变量或者系统预定义的符号同名。,程序中的符号通常不要与指令助记符或者伪操作同名。当程序中的符号与指令助记符或者伪操作同名时,可用双竖线将符号括起来,如,|require|,,这时双竖线并不是符号的组成部分。,58,4.3.1 ARM,汇编语言中的符号,1.,变量,2.,数字常量,3.,汇编时的变量替换,4.,标号,5.,局部标号,59,4.3.2 ARM,汇编语言中的表达式,表达式是由符号、数值、单目或多目操作符以及括号组成的。在一个表达式中,各种元素的优先级如
35、下所示:,括号内的表达式优先级最高。,各种操作符有一定的优先级。,相邻的单目操作符的执行顺序为由右到左,单目操作符优先级高于其他操作符。,优先级相同的双目操作符执行顺序为由左到右。,60,4.3.2 ARM,汇编语言中的表达式,1.,字符串表达式,(1),字符串,(2),字符串变量,(3),操作符,LEN,CHR,STR,LEFT,RIGHT,CC,(4),字符变量的声明和赋值,(5),字符串表达式应用举例,61,4.3.2 ARM,汇编语言中的表达式,2.,数字表达式,(1),整数数字量,(2),浮点数字量,(3),数字变量,(4),操作符,NOT,按位取反,+,、,、,、,/,及,MOD,
36、算术操作符,ROL,、,ROR,、,SHL,及,SHR,移位,(,循环移位操作,),AND,、,OR,及,EOR,按位逻辑操作符,62,4.3.2 ARM,汇编语言中的表达式,3.,基于寄存器和基于,PC,的表达式,(1)BASE,(2)INDEX,(3)+,、,4.,逻辑表达式,(1),关系操作符,(2),逻辑操作符,5.,其他的一些操作符,(1)?,(2)DEF,(3)SB_OFFSET_19_12,(4)SB_OFFSET_11_0,63,4.4 ARM,汇编语言程序的格式,本小节介绍,ARM,汇编语言程序的基本格式以及子程序间调用的格式。,64,4.4.1,汇编语言程序的格式,ARM,
37、汇编语言以段,(Section),为单位组织源文件。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个,ARM,源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。,ARM,汇编语言源程序经过汇编处理后,生成一个可执行的映像文件,(,类似于,Windows,系统下的,EXE,文件,),。该可执行的映像文件通常包括下面,3,部分:,一个或多个代码段。代码段通常是只读的。,零个或多个包含初始值的数据段。这些数据段通常是可读写的。,零个或多个不包含初始值的数据段。这些数据段被初始化为,0,,它
38、们通常是可读写的。,65,4.4.2,汇编语言子程序的调用,在,ARM,汇编语言中,子程序调用是通过,BL,指令完成的。,BL,指令的语法格式如下:,BL subname,其中,,subname,是调用的子程序的名称。,BL,指令完成两个操作:将子程序的返回地址放在,LR,寄存器中,同时将,PC,寄存器值设置成目标子程序的第一条指令地址。,在子程序返回时,可以通过将,LR,寄存器的值传送到,PC,寄存器中来实现。,子程序调用时,通常使用寄存器,R0,R3,来传递参数和返回结果,这些在后面的编程模型中还会有详细的介绍。,66,4.5 ARM,汇编编译器的使用,内嵌的,ARM,汇编编译器是,ARM
39、中,C/C+,编译器的一部分,它没有自己的命令行格式。在,ARMASM,命令中,除了文件名区分大小写之外,其他的参数都不区分大小写。,ARMASM,的语法格式如下所示:,armasm-16|-32-apcs none|/qualifier/qualifier.,-bigend|-littleend-checkreglist-cpu cpu-depend dependfile|-m|-md,-errors errorfile-fpu name-g-help-i dir,dir,-keep-list,listingfile options-maxcache n-memaccess attribu
40、tes-nocache,-noesc-noregs-nowarn-o filename-predefine directive-split_ldm,-unsafe-via file inputfile,67,4.6,汇编程序设计举例,在本节中,将通过一些例子来说明,ARM,中伪操作以及指令的用法。,4.6.1,小节中给出了一些伪操作的实例,,4.6.2,小节中是一些,ARM,汇编程序的实例。,68,4.6.1 ARM,中伪操作的使用实例,程序,4.1 ARM,中伪操作的使用实例:,参见教材,P166,69,4.6.2 ARM,汇编程序的实例,1.,数据块复制,2.ADR,伪操作的使用实例,3.
41、利用跳转表实现程序跳转,4.,伪指令,LDR,的使用实例,70,第,5,章,ARM,的存储系统,与其他的中、低档单片机不同,,ARM,处理器中可以包含一个存储管理部件。本章介绍,ARM,体系中两种典型的存储管理实现机制。并在最后给出一个实例。,72,5.1 ARM,存储系统概述,ARM,存储系统的体系结构可以适应多种不同的嵌入式应用系统。最简单的存储系统使用普通的地址映射机制,就像在一些简单的单片机系统中一样,地址空间的分配方式是固定的,系统中各部分都使用物理地址。而一些复杂的系统可能包括一种或者多种下面的技术,从而可以提供功能更为强大的存储系统:,系统中可能包含多种类型的存储器件,通过使用
42、Cache,及,Write Buffer,技术,可以缩小处理器和存储系统的速度差别,从而提高系统的整体性能。,内存管理部件使用内存映射技术实现虚拟空间到物理空间的映射,引入存储保护机制,增强系统的安全性。,引入一些机制,保证将,I/O,操作映射成内存操作后,各种,I/O,操作能够得到正确的结果。,73,5.1 ARM,存储系统概述,本章中主要介绍以下内容。在介绍相关内容时,将以,LinkUp,公司的通用,ARM,芯片,L7205,作为例子。,ARM,中用于存储管理的系统控制协处理器,CP15,。,ARM,中的存储管理部件,MMU(Memory Management Unit),。,ARM,中
43、的,Cache,及,Write Buffer,技术。,快速进程上下文切换技术。,74,5.2 ARM,中用于存储管理的系统控制协处理器,CP15,CP15,可以包含,16,个,32,位的寄存器,其编号为,0,15,。实际上,对于某些编号的寄存器,可能对应有多个物理寄存器,在指令中可指定特定的标志位来区分这些物理寄存器。这种机制有些类似于,ARM,中的寄存器,当处于不同的处理器模式时,某些,ARM,寄存器可能是不同的物理寄存器,比如对于寄存器,SPSR,,每一种处理器模式下都对应一个独立的物理寄存器,(,用户模式和系统模式对应同样的物理寄存器,这是一个例外,),。,CP15,中的寄存器可能是只读
44、的,也可能是只写的,还有一些是可以读写的。对于每一种寄存器,将会详细介绍:,寄存器的访问类型,(,只读,/,只写,/,读写,),。,各种访问操作对于寄存器的作用。,寄存器是否对应有多个物理寄存器。,寄存器的具体作用。,75,5.2.1,访问,CP15,寄存器的指令,访问,CP15,寄存器的指令有下面两种。,MCR,:,ARM,寄存器到协处理器寄存器的数据传送指令。,MRC,:协处理器寄存器到,ARM,寄存器的数据传送指令。,MCR,指令和,MRC,指令只能在处理器模式是系统模式时执行,在用户模式下执行,MCR,指令和,MRC,指令将会触发未定义指令的异常中断。,76,5.2.2 CP15,中的
45、寄存器,1.CP15,中的寄存器,C0,(1),标识符寄存器,ARM7,之后的处理器,ARM7,处理器,ARM7,之前的处理器,(2)Cache,类型标识符寄存器,2.CP15,中的寄存器,C1,CP15,中的寄存器,C1,是一个控制寄存器,它包括以下控制功能:,禁止,/,使能,MMU,以及其他的与存储系统相关的功能。,配置存储系统以及,ARM,处理器中的相关部分的工作方式。,77,5.3,存储器管理单元,MMU,5.3.1,存储器管理单元,MMU,概述,在,ARM,系统中,存储器管理单元,MMU,主要完成以下工作:,虚拟存储空间到物理存储空间的映射。在,ARM,中采用了页式虚拟存储管理。它把
46、虚拟地址空间分成一个个固定大小的块,每一块称为一页,把物理内存的地址空间也分成同样大小的页。页的大小可以分为粗粒度和细粒度两种。,MMU,就要实现从虚拟地址到物理地址的转换。,存储器访问权限的控制。,设置虚拟存储空间的缓冲的特性。,78,5.3.1,存储器管理单元,MMU,概述,页表,(Translate Table),是实现上述这些功能的重要手段,它是一个位于内存中的表。,页表存放在内存中,系统通常用一个寄存器来保存页表的基地址。在,ARM,中,系统控制协处理器,CP15,的寄存器,C2,用来保存页表的基地址。,当,CPU,需要访问内存时,先在,TLB,中查找需要的地址变换条目。如果该条目不
47、存在,,CPU,从位于内存中的页表中查询,并把相应的结果添加到,TLB,中。这样,当,CPU,下一次又需要该地址变换条目时,就可以从,TLB,中直接得到了,从而使地址变换的速度大大加快。,79,5.3.1,存储器管理单元,MMU,概述,当内存中的页表内容改变,或者通过修改系统控制协处理器,CP15,的寄存器,C2,使用新的页表时,,TLB,中的内容需要全部清除。,MMU,提供了相关的硬件支持这种操作。系统控制协处理器,CP15,的寄存器,C8,用来控制清除,TLB,内容的相关操作。,MMU,可以将某些地址变换条目锁定,(Locked Down),在,TLB,中,从而使得进行与该地址变换条目相关
48、的地址变换速度保持很快。在,MMU,中,寄存器,C10,用于控制,TBL,内容的锁定。,MMU,可以将整个存储空间分为最多,16,个域,(Domain),。每个域对应一定的内存区域,该区域具有相同的访问控制属性。,MMU,中,寄存器,C3,用于控制与域相关的属性的配置。,当存储访问失效时,,MMU,提供了相应的机制用于处理这种情况。在,MMU,中,寄存器,C5,和寄存器,C6,用于支持这些机制。,80,5.3.2,禁止,/,使能,MMU,CP15,的寄存器,C1,的位,0,用于控制禁止,/,使能,MMU,。当,CP15,的寄存器,C1,的位,0,设置成,0,时,禁止,MMU,;当,CP15,的
49、寄存器,C1,的位,0,设置成,1,时,使能,MMU,。下面的指令使能,MMU,:,MRC P15,0,R0,C1,0,0,ORR R0,#01,MCR P15,0,R0,C1,0,0,1.,使能,MMU,时存储访问过程,2.,禁止,MMU,时存储访问过程,3.,禁止,/,使能,MMU,时应注意的问题,81,5.3.3 MMU,中的地址变换过程,ARM,支持的存储块大小有以下几种。,段,(section),:是大小为,1MB,的存储块。,大页,(Large Pages),:是大小为,64KB,的存储块。,小页,(Small Pages),:是大小为,4KB,的存储块。,极小页,(Tiny Pa
50、ges),:是大小为,1KB,的存储块。,在,MMU,中采用下面两级页表实现上述地址映射:,一级页表中包含有以段为单位的地址变换条目以及指向二级页表的指针。一级页表实现的地址映射粒度较大。,二级页表中包含以大页和小页为单位的地址变换条目。其中,一种类型的二级页表还包含有以极小页为单位的地址变换条目。,82,5.3.3 MMU,中的地址变换过程,1.,基于一级页表的地址变换过程,(1),基于一级页表的地址变换过程,(2),段描述符及其地址变换过程,(3),粗粒度页表描述符,(4),细粒度页表描述符,83,5.3.3 MMU,中的地址变换过程,2.,基于二级页表的地址变换过程,二级页表有两种:粗粒






