ARM汇编语言程序设计习题.ppt
《ARM汇编语言程序设计习题.ppt》由会员分享,可在线阅读,更多相关《ARM汇编语言程序设计习题.ppt(115页珍藏版)》请在三一办公上搜索。
1、1,第5章 ARM指令集和汇编语言程序,本章主要介绍以下内容:ARM汇编语言程序格式典型ARM汇编语言程序举例ARM汇编与C,C+混合编程,2,嵌入式系统开发中汇编语言设计的意义,汇编语言程序设计更能充分发挥处理器的硬件特性两个优势操作系统移植需要编写几百行底层硬件的汇编语言程序,这是C语言不可取代的。优化算法的时空效率,C语言的目标代码优化是编译器完成的,而汇编语言的目标代码优化是人工完成的。人是算法的创造者,也是编译器的设计者,人工优化比编译器质量高。弱点编程效率低,开发周期长,经济代价大。,3,5.1 ARM汇编语言程序格式,两种ARM汇编语言格式ARM汇编语言程序格式主要有两种:基于A
2、DS1.2集成开发环境的汇编器格式包括SDT在内,统称为ADS基于Linux的GNU汇编器格式在本章主要介绍基于ARM公司ADS集成开发环境汇编器格式的汇编语言程序设计。在后面将介绍基于GNU汇编器的ARM汇编语言程序编写方法。,4,预定义寄存器名及内部变量名,ARM汇编器中将几十个寄存器名称作为保留字预先给与了定义,这些预定义寄存器名都是大小写敏感的,它们都与具体的寄存器一一对应。参看下面的表格。,5,ARM公司ADS预定义的寄存器名一览表,6,ARM公司ADS预定义的寄存器名一览表(续),7,ARM汇编语言程序的部分内部变量名清单,8,ARM汇编语言程序的语句格式,ARM汇编语言程序的语句
3、格式格式如下:symbol instruction|directive|pseudo-instruction;comment 对应的中文语句格式描述是:符号(标号)指令|指示符|伪指令;注释 语句格式中,花括号括起来的部分表示可以省略;竖线分隔的字段表示可以替换。,9,ARM汇编语言程序中的符号,ARM汇编语句中的符号可以是指令地址或标号、变量、常量和局部标号,符号属性可以是程序相关的、寄存器相关的或者是绝对地址。,10,(一)符号命名和书写规则,符号的命名和书写有以下规则:符号命名可以使用大小写字母,数字和下划线。符号是大小写字母敏感的。除本地行号外,名称不能以数字开头。一个程序段中不能重名
4、。符号在其作用范围内必须唯一。符号不能够与系统内部变量或者系统预定义的符号同名。例如:a1 or R0、sp、cpsr、PC or.、VAR or、CONFIG、CPU等等。,11,符号命名和书写规则(续),当程序中的符号与指令助记符或者指示符同名时,用双竖线将符号括起来。如|buffe_a|,这时双竖线并不是符号的组成部分。在ARM汇编语言程序中,所有符号必须在一行的最左边位置开始书写,即所谓的顶格书写,不允许包含空格或者制表符。符号的字符序列中不能大小写字母相混杂。,12,(二)常量,ARM汇编语言中使用到的常量可以是数字常量、字符常量、字符串常量和布尔常量。数字常量有以下3种表示方式:1
5、)十进制数,如:535,246。2)十六进制数,如:0 x645,0 xff00。3)n进制数,格式为n_XXX,其中n表示n进制,从29,XXX是具体的数字。例如:8_3777,8_5237702,数字常量,13,字符常量,字符常量由一对单引号括起来,包括一个单字符或者标准C中的转义字符。例如:A,n。字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准C中的转义字符。如果需要使用双引号或字符$,则必须用”和$代替。例如执行语句:strtwo SETS“This is character of”其编译结果是:字符串“This is character of”被赋值给strtwo变量。
6、,14,$在汇编语句中的使用举例,GBLS add4ffadd4ff SETS“ADD r4,r4,#0 xFF“;set up add4ff$add4ff.00;invoke add4ff;this produces;ADD r4,r4,#0 xFF00;elaborate substitution GBLS s1 GBLS s2 GBLS fixup GBLA countcount SETA 14s1 SETS a$b$count;s1 now has value a$b0000000Es2 SETS abcFixup SETS|xy$s2.z|;fixup now has value|x
7、yabcz|C$code|MOV r4,#16;but the label here is C$code,15,逻辑值常量,布尔常量TRUE和FALSE在表达式中写为:TRUE,FALSE。,16,(三)表达式,ARM汇编语言中的表达式由符号、数值、单目操作符、双目操作符以及括号组成。运算的优先级次序与标准C一样。,17,字符串表达式,字符串由字符串常量、字符串变量、操作符以及括号组成。最大长度为512字节,最短0个字节。字符串表达式的组成元素有:字符串常量、字符串变量、操作符等。字符串常量由包含在双引号内的一系列字符组成。当在字符串中包含美元符号$或者引号”时,用$表示一个$,用”表示一个”
8、。字符串变量用指示符GBLS(全局字符串)或者LCLS(局部字符串)声明,用SETS赋值。取值范围与字符表达式相同。,18,ARM汇编语言中的字符串操作符,19,指令格式说明:LENX;返回X字符串长度STRM;将数字M转换成一个字符串XRIGHTN;返回X字符串右边长度为N的子串XLEFTN;返回X字符串左边长度为N的子串CHRM;返回数字M表示的单个字符XCCY;返回字符串X和Y连接的字符串,20,数字表达式,数字表达式由数字常量、数字变量、操作符和括号组成。数字表达式表示的是一个32位数的整数,其取值范围为0232-1;当作为有符号数时,其取值范围为-231231-1。汇编器对-n和23
9、2-n不做区别,汇编时对关系运算符采用无符号数方式处理,这就意味着 0-1是FALSE。,21,逻辑表达式,逻辑表达式由逻辑常量、逻辑操作符、关系操作符以及括号组成。取值范围为FALSE和TRUE。,22,(四)地址标号,当符号代表地址时称为标号(Label)。以数字开头的标号其作用范围是当前段(没有使用ROUT指示符时),这种标号又称为局部标号(Local Label)。,23,三种类型标号,(1)PC相关标号(2)寄存器相关标号(3)绝对地址,24,PC相关标号,PC相关标号表示程序计数器加减一个数值常数后得到的地址值。常用来指明一个分支指令的目标地址,或者访问嵌入在代码段中的一个数据项。
10、具体标记方法是:在汇编语言程序指令的前面写入标号,或者在一个数据指示符前面写入标号。通常用DCB或者DCD等指示符定义。,25,DCB,DCD指令格式:XDCBEXP1,EXP2 如定义一个字节为单位的标号XSTRDCB“HELLO WORLD!”,0DCB0 x32,0 x34,0 x35 XDCDEXP1,EXP2 定义一个字为单位的标号LDR PC,RESETADDRRESETADDR DCD RESET RESET,26,寄存器相关标号,寄存器标号表示指定寄存器的值加减一个数值常数后得到的地址值。常常用于访问位于数据段中的数据。通常用MAP或者FIELD等指示符定义。格式:MAPEXP
11、R,BASEREGLABLEFIELDEXPR如:MAP0 x00400000,R9 COUNT FIELD 4 X FIELD 8 Y FIELD 8,27,绝对地址,绝对地址是一个32位的无符号数字常量,可寻址范围是0231-1。使用它可以直接寻址整个地址空间。,28,(五)段内标号和段外标号,ARM处理器的地址标号分为段内标号和段外标号。段内标号的地址值在汇编时确定,段外标号的地址值在连接时确定。,29,程序相对寻址和寄存器相对寻址,在程序段中标号代表其所在位置与段首地址的偏移量,根据程序计数器和偏移量计算地址称为程序相对寻址。在映像文件中定义的标号代表标号到映像首地址的偏移量。映像的首
12、地址通常被赋予一个寄存器,根据该寄存器值与偏移量计算地址称为寄存器相对寻址。,30,(六)局部标号,ARM汇编语言的宏常常使用局部标号。局部标号提供分支指令在汇编程序的局部范围内进行跳转,主要用途是汇编子程序中的循环和条件编码。它是一个099之间的数字,后面可以有选择地附带一个符号名称。局部标号特别适用于宏。,31,局部标号(续1),使用ROUT指示符可以限制局部标号的范围。只能在该局部标号的范围引用局部标号。如果在该范围的上下两个方向都没有匹配的标号,汇编器将给出一个错误信号并停止汇编。局部标号语法格式如下:nroutname被引用的局部标号语法规则是:%F|B A|T n routname
13、,32,局部标号(续2),n是局部标号的数字号。routname是当前局部范围的名称。%表示引用操作。F指示汇编器只向前搜索B指示汇编器只向后搜索A指示汇编器搜索宏的所有嵌套层次T指示汇编器搜索宏的当前层次如果F和B都没有指定,则汇编器首先向前搜索,再向后搜索。如果A和T都没有指定,汇编器搜索从宏的当前层次到宏的最高层次,比当前层次低的宏不再搜索。,33,ARM汇编语言程序编写规范,ARM汇编语言程序源代码中允许有空行,可以在汇编程序中加上一个空白行,来增加程序的可阅读性。此外需要注意的是:指令,指示符,伪指令前必须加空格或者Tab制表符,这就是说指令,指示符,伪指令不可以从行的最左边开始书写
14、,即不能顶格书写。在ARM汇编语言程序中,所有标号必须在一行的最左边的位置开始书写,标号的后面不要加“:”。指令,指示符,寄存器名可以用小写字母也可以用大写字母来表示,但不能大小写字母相杂。,34,ARM汇编语言程序编写规范(续),当一行写不下时,可以用反斜线作为这一行最后的符号,然后另起一行接下去写,这样汇编器会将这两行代码看作一行代码。需要注意的是,如果在被引号括住的字符串中使用反斜线,则反斜线不能起到续行的作用。每行的长度限制一般在128255个字符串之间。分号;除非在字符串常量中出现,否则它的出现就表示着注释的开始,此注释直至行尾结束。可以将注释单独列为一行。所有注释被汇编器忽略。,3
15、5,汇编语句规则举例,AREA Startup,Code,READONLY STR1 SETS“This is an ARM processor”SENTB LDR R3,=BLKADDRESSANDS R2,R2,#0X40FIELD 4,AREAR RoutineA,Code,READONLYMOV R10,#0XFF00SUB1 MOV R6,#100SEC:MOV R8,#0X200Floop Mov R2,#3B Loop,36,5.1.4 ARM汇编语言指示符,ARM汇编语言程序指示符的英文原文是directive,ARM指示符相当于x86处理器汇编语言程序中的伪指令。ARM指示符
16、语句与ARM机器指令不存在一一对应的关系,它指示汇编器在汇编目标代码时进行变量定义、存储单元分配等操作。ARM指示符大致可以分成6种类型,分别是:符号定义、数据定义、汇编控制、框架控制、信息报告和杂项。,37,AREA指示符用于定义一个代码段或者数据段。语法格式AREA sectionname,attr,attr.其中:sectionname为所定义的代码段或者数据段的名称。如果该名称是以数字开头的,则该名称必须用“”括起来,如1_datasec。还有一些代码段具有约定的名称,如.text表示C语言编译器产生的代码段或者是与C语言库相关的代码段。Attr是该代码段(或者程序段)的属性。在ARE
17、A指示符中,各属性间用逗号隔开。,(一)AREA指示符,38,AREA的属性,下面列举主要的属性:ALIGN=expression。默认的情况下,ELF的代码段和数据段是4字节对齐的。Expression可以取031的数值,相应的对齐方式为(2expression)字节对齐。如expression=3时为8字节对齐。ASSOC=section。指定与本段相关的ELF段。任何时候连接section段也必须包括sectionname段。CODE 定义代码段。默认属性为READONLY。COMDEF 定义一个通用的段。该段可以包含代码或者数据。在个源文件中,同名的COMDEF段必须相同。,39,AR
18、EA的属性(续),COMMON 定义一个通用的段。该段不包含任何用户代码和数据,连接器将其初始化为0。各源文件中同名的COMMON 段公用同样的内存单元,连接器为其分配合适的尺寸。DATA 定义数据段。默认属性为READWRITE。NOINIT 指定本数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将个内存单元值初始化为0。READONLY 指定本段为只读,代码段的默认属性为READONLY。READWRITE 指定本段为可读可写,数据段的默认属性为READWRITE。,40,AREA指示符举例,举例下面的指示符定义了一个代码段,代码段的名称为Mainpro,属性为READONLY
19、。AREA Mainpro,CODE,READONLY;code segment,41,(二)ENTRY指示符,ENTRY指示符指定程序的入口点语法格式ENTRY使用说明一个程序(可以包含多个源文件)中至少要有一个ENTRY(可以有多个ENTRY),但一个源文件中最多只能有一个ENTRY(可以没有ENTRY)。示例AREA example,CODE,READONLYENTRY;应用程序的入口点,42,(三)CODE16和CODE32指示符,CODE16指示符告诉汇编编译器后面的指令序列为16位的Thumb指令。CODE32指示符告诉汇编编译器后面的指令序列为32位的ARM指令。语法格式 COD
20、E16/CODE32使用说明 当汇编源程序中同时包含ARM指令和Thumb指令时,使用CODE16指示符告诉汇编编译器后面的指令序列为16位的Thumb指令;使用CODE32指示符告诉汇编编译器后面的指令序列为32位的ARM指令。但是,CODE16指示符和CODE32指示符只是告诉编译器后面指令的类型,该指示符本身并不进行程序状态的切换。,43,CODE16/CODE32举例,在下面的例子中,程序先在ARM状态下执行,然后通过BX指令切换到Thumb状态,并跳转到相应的Thumb指令处执行。在Thumb程序入口处用CODE16指示符标识下面的指令为Thumb指令。参看下面的指令段:.AREA
21、ChangeState,CODE,READONLYCODE32;指示下面的指令为ARM指令LDR r0,=start+1BX r0;切换到Thumb,并跳转到start处执行CODE16;指示下面的指令为Thumb指令startMOV r1,#10,44,(四)EQU指示符,EQU指示符为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名称。*是EQU的同义词。语法格式name EQU expr,type其中:expr为基于寄存器的地址值、程序中的标号、32位的地址常量或者32位的常量。name为EQU指示符为expr定义的字符名称。type 当expr为32位常量时,可以使
22、用type指示expr表示的数据的类型。,45,EQU(续),type有下面3种取值:CODE16CODE32DATA使用说明EQU指示符的作用类似于C语言中的#define,用于为一个常量定义字符名称。示例abcd EQU 2;定义abcd符号的值为2abcd EQU label+16;定义abcd符号的值(label+16)addr1 EQU 0 xlC,CODE32;定义addr1符号值为;绝对地址值0 xlC,而且该处为ARM指令。,46,(五)ROUT指示符,ROUT指示符用于标记局部标号使用范围的边界。用法如下:NAME ROUT使用说明:NAME是指定作用范围的名称使用ROUT指
23、示符用于规定局部标号的使用范围。避免无意之中用错局部标号导致的越界。如:SUB1 ROUT SUB1 ROUT,47,ROUT(续),ROUTA ROUT;定义局部标号有效范围,名称为ROUTA3ROUTA;定义ROUTA中的局部标号3BEQ%4;若条件成立,则跳转到局部标号4的位置BEQ%3;若条件成立,则跳转到局部标号3的位置4ROUTA;定义ROUTA中的局部标号4OTHERPROG ROUT;定义新的局部标号有效范围,48,(六)END指示符,END指示符告诉编译器已经到了源程序结尾。语法格式:END使用说明:每一个汇编源程序都包含END指示符,以告诉本源程序的结束。示例:AREA e
24、xample CODE,READONLYEND,49,(七)ALIGN指示符,ALIGN指示符通过添加补丁字节使当前位置满足一定的对齐方式。语法格式ALIGN expr,offset其中,expr为数字表达式,用于指定对齐方式。可能的取值为2的次幂,如1、2、4、8等。如果指示符中没有指定expr,则当前位置对齐到下一个字边界处。offset为数字表达式。表示当前位置到下一个地址之间按照:offset+n*expr的方式进行对齐,50,ALIGN(续1),使用说明下面的情况中,需要特定的地址对齐方式:Thumb的宏指令ADR要求地址是字对齐的,而Thumb代码中地址标号可能不是字对齐的。这时就
25、要使用指示符ALIGN 4使Thumb代码中的地址标号字对齐。由于有些ARM处理器的CACHE采用了其他对齐方式,如16字节的对齐方式,这时使用ALIGN指示符指定合适的对齐方式可以充分发挥该CACHE的性能优势。LDRD及STRD指令要求内存单元是8字节对齐的。这样在为这两个指令分配的内存单元前要使用ALIGN 8实现8字节对齐方式。地址标号通常自身没有对齐要求。而在ARM代码中要求地址标号是字对齐的,在Thumb代码中要求字节对齐。这样需要使用合适的ALIGN指示符来调整对齐方式。,51,(八)DCB指示符,DCB用于在内存中分配一个字节单元或者一组字节单元,并用指定的EXPR对其进行初始
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 汇编语言 程序设计 习题
链接地址:https://www.31ppt.com/p-6501699.html