第4章-ARM汇编程序设计-20151008_第1页
第4章-ARM汇编程序设计-20151008_第2页
第4章-ARM汇编程序设计-20151008_第3页
第4章-ARM汇编程序设计-20151008_第4页
第4章-ARM汇编程序设计-20151008_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

1、软件学院软件学院湖南大学湖南大学 Software School of Hunan University第第4章章 ARM汇编语汇编语言程序设计基础言程序设计基础软件学院软件学院湖南大学湖南大学 Software School of Hunan University ARM ARM处理器支持两种语言进行设计,一处理器支持两种语言进行设计,一种是汇编语言(种是汇编语言(ARM/ThumbARM/Thumb),另一种是),另一种是高级语言(如高级语言(如C/C+C/C+语言)。语言)。(1)(1)汇编语言的机器代码生成效率很高,但可汇编语言的机器代码生成效率很高,但可读性却不强,复杂的程序很难读懂

2、;读性却不强,复杂的程序很难读懂;(2)(2)而高级语言在大多数情况下其机器代码生而高级语言在大多数情况下其机器代码生成效率较差,但可读性和可移植性却比汇编成效率较差,但可读性和可移植性却比汇编语言强很多,而且还可以嵌入汇编来解决高语言强很多,而且还可以嵌入汇编来解决高效性的代码编写问题。效性的代码编写问题。编程语言软件学院软件学院湖南大学湖南大学 Software School of Hunan University 使用汇编语言编写程序,它的特点是程使用汇编语言编写程序,它的特点是程序执行速度快,程序代码生成量少,但汇编序执行速度快,程序代码生成量少,但汇编语言是一种不易学习的编程语言,并

3、且可读语言是一种不易学习的编程语言,并且可读性较差,这种语言属于低级语言。性较差,这种语言属于低级语言。每一种汇每一种汇编语言对应每一款芯片,使用这种语言需要编语言对应每一款芯片,使用这种语言需要对硬件有深刻的了解。对硬件有深刻的了解。在通常情况下,可以在通常情况下,可以使用汇编语言编写驱动程序、需要严格计算使用汇编语言编写驱动程序、需要严格计算执行时间的程序以及需要加速执行的程序。执行时间的程序以及需要加速执行的程序。 ARMARM汇编语言源程序中语句一般由汇编语言源程序中语句一般由指令指令、伪操作伪操作、宏指令宏指令和和伪指令伪指令组成。组成。 汇编语言软件学院软件学院湖南大学湖南大学 S

4、oftware School of Hunan University伪操作伪操作是是ARMARM汇编语言程序里的一些特殊指令助记汇编语言程序里的一些特殊指令助记符,主要是为符,主要是为完成汇编程序做各种准备工作完成汇编程序做各种准备工作,在,在源程序进行汇编时由汇编程序处理,而不是在处源程序进行汇编时由汇编程序处理,而不是在处理器运行期间由机器执行。理器运行期间由机器执行。宏指令宏指令是一段独立的程序代码,它通过伪操作来是一段独立的程序代码,它通过伪操作来定义。通过宏名来调用宏,并可以设置相应的参定义。通过宏名来调用宏,并可以设置相应的参数。数。宏定义本身不会产生代码,只是在调用它时宏定义本身

5、不会产生代码,只是在调用它时把宏体插入到源程序中把宏体插入到源程序中。伪指令伪指令也是也是ARMARM汇编语言程序里的特殊指令助记符,汇编语言程序里的特殊指令助记符,也不在处理器运行期间由机器执行,也不在处理器运行期间由机器执行,它们在汇编它们在汇编时将被合适的机器指令代替成时将被合适的机器指令代替成ARMARM或或ThumbThumb指令指令从从而实现真正指令操作。而实现真正指令操作。 软件学院软件学院湖南大学湖南大学 Software School of Hunan University一、伪操作一、伪操作符号定义(符号定义(Symbol defination)伪操作)伪操作数据定义(数据

6、定义(Data defination)伪操作)伪操作汇编控制(汇编控制(Assembly control)伪操作)伪操作信息报告(信息报告(Reporting)伪操作)伪操作其他伪操作其他伪操作软件学院软件学院湖南大学湖南大学 Software School of Hunan University定义变量、对变量赋值以及定义寄存器的别名等定义变量、对变量赋值以及定义寄存器的别名等1. 符号定义伪操作符号定义伪操作伪指令:伪指令: 定义局部变量的定义局部变量的LCLALCLA、LCLLLCLL和和LCLSLCLS 定义全局变量的定义全局变量的GBLAGBLA、GBLLGBLL和和GBLSGBLS

7、 对变量赋值的对变量赋值的SETASETA、SETLSETL和和SETSSETS 为通用寄存器列表定义名称的为通用寄存器列表定义名称的RLISTRLISTA:数字变量;:数字变量;L:逻辑变量;:逻辑变量;S:字符串变量:字符串变量软件学院软件学院湖南大学湖南大学 Software School of Hunan University符号定义伪操作 伪操作伪操作语法格式语法格式作作 用用GBLAGBLA Variable声明一个全局的算术变量,并将其初始化成声明一个全局的算术变量,并将其初始化成0。GBLLGBLL Variable声明一个全局的逻辑变量,并将其初始化成声明一个全局的逻辑变量,

8、并将其初始化成FALSE。GBLSGBLS Variable声明一个全局的字符串变量,并将其初始化成空串声明一个全局的字符串变量,并将其初始化成空串“”“”。LCLALCLA Variable声明一个局部的算术变量,并将其初始化成声明一个局部的算术变量,并将其初始化成0。LCLLLCLL Variable声明一个局部的逻辑变量,并将其初始化成声明一个局部的逻辑变量,并将其初始化成FALSE。LCLSLCLS Variable声明一个局部的串变量,并将其初始化成空串声明一个局部的串变量,并将其初始化成空串“”“”。SETASETA Variable expr给一个全局或局部算术变量赋值。给一个全

9、局或局部算术变量赋值。SETLSETL Variable expr给一个全局或局部逻辑变量赋值。给一个全局或局部逻辑变量赋值。SETSSETS Variable expr给一个全局或局部字符串变量赋值。给一个全局或局部字符串变量赋值。RLISTname LISTlist of registers为一个通用寄存器列表定义名称。为一个通用寄存器列表定义名称。CNname CN expr为一个协处理器的寄存器定义名称。为一个协处理器的寄存器定义名称。CPname CP expr为一个协处理器定义名称。为一个协处理器定义名称。DN/SNname DN/SN exprDN/SN为一个双精度为一个双精度/

10、单精度的单精度的VFP寄存器定义名称。寄存器定义名称。FNname FN expr为一个为一个FPA浮点寄存器定义名称。浮点寄存器定义名称。软件学院软件学院湖南大学湖南大学 Software School of Hunan University1)GBLA、GBLL、GBLS2) 作用:声明一个作用:声明一个ARM程序中的全局变量程序中的全局变量 语法格式:语法格式: Variable 例:例:GBLA arithmeticarithmetic SETA 0 xFFSPACE arithmeticGBLL logicallogical SETL TRUEGBLS string1string1

11、SETS “helloworld”1.符号定义伪操作软件学院软件学院湖南大学湖南大学 Software School of Hunan University 作用:声明一个作用:声明一个ARM程序中的局部变量程序中的局部变量 语法格式:语法格式: VariableMACRO$label message $aLCLS stringstring SETS “error”INFO 0,“string” : CC: :STR: $aMEND LCLA Mathmatic1.符号定义伪操作2) LCLA、LCLL、LCLS 软件学院软件学院湖南大学湖南大学 Software School of Huna

12、n University 3)SETA、SETL、SETS 作用;给一个作用;给一个ARM程序中的全局或局部变量赋值程序中的全局或局部变量赋值 语法格式:语法格式:Variable expr GBLA arithmetic arithmetic SETA 0 xEF SPACE arithmetic GBLL logical logical SETL TRUE LCLS string1 string1 SETS “helloworld”1.符号定义伪操作软件学院软件学院湖南大学湖南大学 Software School of Hunan University1.符号定义伪操作 4)RLIST 作

13、用:为一个通用寄存器列表定义名称作用:为一个通用寄存器列表定义名称 格式:格式:Name RLIST list of registers 例:例:List RLIST R0,R2-R7 STMFD SP!, List 5)CN-为一个协处理器的寄存器定义名称为一个协处理器的寄存器定义名称 CP-为一个协处理器定义名称。为一个协处理器定义名称。格式:格式:nameCP/CNexprpower CN6; dzx CP6;软件学院软件学院湖南大学湖南大学 Software School of Hunan University1.符号定义伪操作6)DN为一个双精度的为一个双精度的VFP寄存器定义名称。

14、寄存器定义名称。SN为一个单精度的为一个单精度的VFP (Vector Floating Points)寄存器定义名称。寄存器定义名称。FN为一个为一个FPA (Float Point Architecture)浮点寄浮点寄存器定义名称。存器定义名称。格式:格式:Name DN/SN/FN exprHeight DN 6 Width SN 20Length FN 6软件学院软件学院湖南大学湖南大学 Software School of Hunan University程序中的变量代换程序中的变量代换 程序中的变量可通过代换操作取得一个常量。程序中的变量可通过代换操作取得一个常量。代换操代换操作

15、符为作符为“$”“$”。 如果在数字变量前面有一个代换操作符如果在数字变量前面有一个代换操作符“$”“$”,编译,编译器会将该数字变量的值转换为十六进制的字符串,并器会将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换将该十六进制的字符串代换“$”“$”后的数字变量。后的数字变量。 如果在逻辑变量前面有一个代换操作符如果在逻辑变量前面有一个代换操作符“$”“$”,编译,编译器会将该逻辑变量代换为它的取值(真或假)。器会将该逻辑变量代换为它的取值(真或假)。 如果在字符串变量前面有一个代换操作符如果在字符串变量前面有一个代换操作符“$”“$”,编,编译器会将该字符串变量的值代换译

16、器会将该字符串变量的值代换“$”“$”后的字符串变后的字符串变量。量。 LCLS S1 ;定义局部字符串变量;定义局部字符串变量S1和和S2 LCLS S2 S1 SETS “Test!” S2 SETS “This is a $S1” ;字符串变量;字符串变量S2的值为的值为“This is a Test!” 软件学院软件学院湖南大学湖南大学 Software School of Hunan University为数据分配存储单元,完成已分配存储单元的初始化为数据分配存储单元,完成已分配存储单元的初始化2. 数据定义伪操作数据定义伪操作伪指令:伪指令: DCBDCB:分配连续的字节单元并初始

17、化:分配连续的字节单元并初始化 DCW/DCWUDCW/DCWU:分配连续的半字单元并初始化:分配连续的半字单元并初始化 DCD/DCDU DCD/DCDU:分配连续的字并初始化:分配连续的字并初始化 DCQ/DCQU DCQ/DCQU:分配连续的块:分配连续的块(8(8字节字节) )单元并初始化单元并初始化 DCFS/DCFSU DCFS/DCFSU:为单精度浮点数分配字单元并初始化:为单精度浮点数分配字单元并初始化 DCFD/DCFDU DCFD/DCFDU:为双精度浮点数分配字单元并初始化:为双精度浮点数分配字单元并初始化 SPACE SPACE:分配一块连续的:分配一块连续的( (字节

18、字节) )存储单元存储单元 FIELD FIELD:定义一个结构化的内存表的数据域:定义一个结构化的内存表的数据域 MAP MAP:定义一个结构化的内存表首地址:定义一个结构化的内存表首地址软件学院软件学院湖南大学湖南大学 Software School of Hunan University2. 数据定义伪操作 伪操作伪操作语法格式语法格式作作 用用LTORGLTORG声明一个数据缓冲池(也称为文字池)的开始。声明一个数据缓冲池(也称为文字池)的开始。MAPMAP expr,base-register定义一个结构化的内存表(定义一个结构化的内存表(Storage Map)的首地址。)的首地址

19、。FIELDlabel FIELD expr定义一个结构化内存表中的数据域。定义一个结构化内存表中的数据域。SPACElabel SPACE expr分配一块连续内存单元,并用分配一块连续内存单元,并用0初始化。初始化。DCBlabel DCB expr,expr分配一段字节内存单元,并用分配一段字节内存单元,并用expr初始化。初始化。D C D / DCDUlabel DCD expr ,expr分配一段字内存单元。分配一段字内存单元。DCDOlabel DCDO expr,expr 分配一段字对齐的字内存单元。分配一段字对齐的字内存单元。D C F D / DCFDUlabel DCFD

20、 Ufpliteral,fpliteral为双精度的浮点数分配字对齐的内存单元。为双精度的浮点数分配字对齐的内存单元。 D C F S / DCFSUlabel DCFS U fpliteral ,fpliteral为单精度的浮点数分配字对齐的内存单元。为单精度的浮点数分配字对齐的内存单元。DCIlabel DCI expr,expr在在ARM代码中分配一段字对齐的内存单元代码中分配一段字对齐的内存单元; 在在Thumb代代码中,分配一段半字对齐的半字内存单元。码中,分配一段半字对齐的半字内存单元。D C Q / DCQUlabel DCQUliteral,literal分配一段以双字(分配一

21、段以双字(8个字节)为单位的内存个字节)为单位的内存D C W / DCWUlabel DCWUexpr,exprDCW用于分配一段半字对齐的半字内存单元。用于分配一段半字对齐的半字内存单元。软件学院软件学院湖南大学湖南大学 Software School of Hunan University2. 数据定义伪操作数据定义伪操作1) LTORG语法格式:语法格式:LTORG用于声明一个数据缓冲池的开始用于声明一个数据缓冲池的开始当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界,为了防止越界发生,使用LTORG定义数据缓冲池。通常ARM汇编编译器把数据缓冲池放在代码段的最后面,即下一个代

22、码段开始之前,或者END伪操作之前。AREA Example,Code,READONLYstart BL funcl funcl LDR R1,=0 x8000 MOV PC,LR LTORG ;定义数据缓冲池定义数据缓冲池 Data SPACE 40END软件学院软件学院湖南大学湖南大学 Software School of Hunan University2) SPACE也可以用符号也可以用符号“%”表示表示用于分配一块连续的内存单元供程序使用,并且将这个内存单用于分配一块连续的内存单元供程序使用,并且将这个内存单元的内容初始化为元的内容初始化为0。语法格式:语法格式: label SPA

23、CE expr或或 label % expr其中:其中: label :是一个标号,可选项。:是一个标号,可选项。 expr:数值表达式,用来规定内存单元的字节数:数值表达式,用来规定内存单元的字节数。 n例:例:nAREA AREA DataSpace,Data,READWRITEDataSpace,Data,READWRITEndata SPACE 256 ;data SPACE 256 ;定义大小为定义大小为256256字节的数据区字节的数据区2. 数据定义伪操作数据定义伪操作软件学院软件学院湖南大学湖南大学 Software School of Hunan University2. 数

24、据定义伪操作数据定义伪操作 3) MAP, FIELD 语法格式:语法格式:MAP expr MAP expr ,base-registerbase-register 用于定义一个结构化的内存表的首地址用于定义一个结构化的内存表的首地址 语法格式:语法格式:label FIELD exprlabel FIELD expr 用于定义一个结构化的内存表的数据域用于定义一个结构化的内存表的数据域 MAP和和FIELD伪操作配合使用来定义结构化的内存伪操作配合使用来定义结构化的内存表结构,表结构,MAP可以用可以用符号来替代,符号来替代,FIELD可以用可以用#符号来替代。符号来替代。注:注:MAP和

25、和FIELD伪操作只是定义数据结构并不实际分配内伪操作只是定义数据结构并不实际分配内存单元。存单元。软件学院软件学院湖南大学湖南大学 Software School of Hunan University 4)DCB也可以用符号也可以用符号”=”表示表示 用于分配一段字节内存单元,并用伪操作中的expr初始化。 语法格式: label DCB expr,expr 或 label = expr,expr 其中: expr表示: -128到255之间的一个数值常量或者表达式。 一个字符串。2. 数据定义伪操作数据定义伪操作软件学院软件学院湖南大学湖南大学 Software School of Hu

26、nan University 例: short DCB 1 ;为short分配了一个字节,并初始 化为1。 string DCB “string”,0 ;构造一个以0结尾的字 符串 软件学院软件学院湖南大学湖南大学 Software School of Hunan University 5)DCD、DCDU (1)DCD 也可以用符号也可以用符号”&”表示表示 用于分配一段字内存单元(用于分配一段字内存单元(分配的内存单元分配的内存单元都是字对齐的都是字对齐的)并初始化。)并初始化。 语法格式:语法格式: label DCD expr,expr 或或 label & expr,

27、expr 其中:其中: expr:数字表达式或程序中的标号。:数字表达式或程序中的标号。注:注:DCD伪操作可能在分配的第一个内存单元前插入填伪操作可能在分配的第一个内存单元前插入填补字节以保证分配的内存是字对齐的。补字节以保证分配的内存是字对齐的。软件学院软件学院湖南大学湖南大学 Software School of Hunan University 例:例: data1 DCD 2,4,6 ;为为data1分配三个字分配三个字,内内容初始化为容初始化为2,4,6 data2 DCD label+4 ;初始化初始化data2为为label+4对应的地址对应的地址 (2)DCDU DCDU与与

28、DCD的不同之处在于的不同之处在于DCDU分配的分配的内存单元内存单元并不严格字对齐。并不严格字对齐。软件学院软件学院湖南大学湖南大学 Software School of Hunan University3. 汇编控制伪操作汇编控制伪操作 用于条件汇编、宏定义、重复汇编用于条件汇编、宏定义、重复汇编控制等。控制等。 IF,ELSE及及ENDIF WHILE及及WEND MACRO,MEND及及MEXIT软件学院软件学院湖南大学湖南大学 Software School of Hunan University 1、IF,ELSE及及ENDIF IF,ELSE及及ENDIF伪操作能够根据条件把一段

29、源伪操作能够根据条件把一段源代码包括在汇编语言程序内或者将其排除在程序代码包括在汇编语言程序内或者将其排除在程序之外。之外。 “是是IF伪操作的同义词伪操作的同义词 “|“是是ELSE伪操作的同义词伪操作的同义词 “”是是ENDIF伪操作的同义词伪操作的同义词 语法格式:语法格式: IF logic expression; logic expression控制选择逻辑表达控制选择逻辑表达式式 ;指令或伪指令代码段指令或伪指令代码段1 ELSE ;可选可选 ;指令或伪指令代码段指令或伪指令代码段2 ENDIFIF、ELSE及及ENDIF伪操作可以嵌套使用伪操作可以嵌套使用软件学院软件学院湖南大学

30、湖南大学 Software School of Hunan University 例:例: IF Variable=16 ;如果如果Variable=16成立成立,则编译则编译下面代码下面代码 BNE SUB1 LDR R0,=SUB0 BX R0 ELSE ;否则编译下面代码否则编译下面代码 BNE SUB0 LDR R0,=SUB0 BX R1 ENDIF 软件学院软件学院湖南大学湖南大学 Software School of Hunan University 2、WHILE及及WEND WHILE及及WEND伪操作能够根据条伪操作能够根据条件重复汇编相同的一段源代码。件重复汇编相同的一段

31、源代码。 语法格式:语法格式: WHILE logic expression instructions or derectives WENDWHILE和和WEND伪操作可以嵌套使用伪操作可以嵌套使用软件学院软件学院湖南大学湖南大学 Software School of Hunan University 例:例: count SETA 1 ;设置循环计数变量设置循环计数变量count初始值为初始值为1 WHILE count=4 ;由由count控制循环执行的次数控制循环执行的次数 count SETA count+1 ;将循环计数变量加将循环计数变量加1 ;代码代码 WEND ;结束结束软件学

32、院软件学院湖南大学湖南大学 Software School of Hunan University 3、MACRO、MEND及及MEXIT MACRO:标识宏定义的开始。:标识宏定义的开始。 MEND:标识宏定义的结束。:标识宏定义的结束。 MACRO和和MEND之间的代码称为宏定义体。之间的代码称为宏定义体。 MEXIT:用于从宏中跳转出去。:用于从宏中跳转出去。 宏体代表了一个预定义的汇编语言指令序列宏体代表了一个预定义的汇编语言指令序列。在汇编程序中通过宏的名称调用宏,编译。在汇编程序中通过宏的名称调用宏,编译时,宏语句被展开。时,宏语句被展开。 软件学院软件学院湖南大学湖南大学 Sof

33、tware School of Hunan University 语法格式:语法格式: MACRO $label macroname $parameter, $parameter. ;code ;code MEND 其中:其中: $label:在宏被展开时:在宏被展开时,label可被替换成相应的符号。可被替换成相应的符号。 macroname:所定义的宏的名称。:所定义的宏的名称。 $parameter:宏指令的参数。:宏指令的参数。 在子程序比较短而需要传递的参数比较多的情况下,在子程序比较短而需要传递的参数比较多的情况下,可使用宏汇编技术。可使用宏汇编技术。软件学院软件学院湖南大学湖南大

34、学 Software School of Hunan UniversityMACRO、MEND 语法格式:语法格式: MACRO$标号标号 宏名宏名 $参数参数1,$参数参数2, 指令序列指令序列 MEND软件学院软件学院湖南大学湖南大学 Software School of Hunan University示例:在示例:在ARM中完成测试跳转操作需要两条指令,定中完成测试跳转操作需要两条指令,定义一条宏指令完成测试跳转操作义一条宏指令完成测试跳转操作 MACRO$labelTestAndBranch $dest, $reg, $cc$labelCMP $reg,#0B$cc$dest MEN

35、D软件学院软件学院湖南大学湖南大学 Software School of Hunan University;在程序中调用该宏;在程序中调用该宏test TestAndBranch NonZero, r0, NE NonZero;程序被汇编后,宏展开的结果;程序被汇编后,宏展开的结果test CMP r0, #0 BNE NonZero NonZero软件学院软件学院湖南大学湖南大学 Software School of Hunan University4. 信息报告伪操作信息报告伪操作用于汇编报告指示用于汇编报告指示 1)ASSERT断言错误伪操作断言错误伪操作 用于保证源程序被汇编时满足相关

36、条件。如果条件不满足,则ASSERT伪操作报告错误类型,并终止汇编。 例子 ASSERT TopTemp; 软件学院软件学院湖南大学湖南大学 Software School of Hunan University4. 信息报告伪操作用于汇编报告指示 2)INFO汇编诊断信息显示汇编诊断信息显示 伪操作伪操作 用于显示用户自定义的错误信息。用于显示用户自定义的错误信息。 语法格式:语法格式: INFO numeric-expression, string-expression string-expression为一个字符串表达式,即诊断信息。为一个字符串表达式,即诊断信息。 numeric-ex

37、pression为一个数字表达式。为一个数字表达式。 例例 INFO 0, “Version 1.0” ;在第二遍扫描时,报告版本信息在第二遍扫描时,报告版本信息 IFlabel1 = label2 INFO 4, “Data overrun” ;如果成立,则在第一遍扫描时报告错如果成立,则在第一遍扫描时报告错 ;误信息,并终止汇编误信息,并终止汇编 ENDIF软件学院软件学院湖南大学湖南大学 Software School of Hunan University信息报告伪操作 伪操作伪操作语法格式语法格式作作 用用ASSERTASSERT logical expression对汇编程序的第二

38、遍扫描中,如果其中对汇编程序的第二遍扫描中,如果其中ASSERT中条件中条件不成立,不成立,ASSERT伪操作将报告该错误信息。伪操作将报告该错误信息。INFOINFO numeric-expression,string-expression在汇编处理过程的第一遍扫描或者第二遍扫描时在汇编处理过程的第一遍扫描或者第二遍扫描时INFO伪操作报告诊断信息。伪操作报告诊断信息。OPTOPT n通过通过OPT伪操作可以在源程序中设置列表选项。伪操作可以在源程序中设置列表选项。TTL TTL title在列表文件的每一页的开头插入一个标题。在列表文件的每一页的开头插入一个标题。SUBTSUBT subt

39、itle在列表文件的每一页的开头插入一个子标题。在列表文件的每一页的开头插入一个子标题。软件学院软件学院湖南大学湖南大学 Software School of Hunan University5. 其他伪操作 1) CODE16和和CODE32 CODE16告诉汇编编译器后面的指令序列为16位的Thumb指令。 CODE32告诉汇编编译器后面的指令序列为32位的ARM指令。 语法格式: CODE16 CODE32CODE16和和CODE32只是告诉编译器后面指令的只是告诉编译器后面指令的类型,该伪操作本身不进行程序状态的切换。类型,该伪操作本身不进行程序状态的切换。软件学院软件学院湖南大学湖南

40、大学 Software School of Hunan University 例: AREA ChangeState, CODE, READONLY ENTRY CODE32 ;下面为32位ARM指令 LDR R0,=start+1 BX R0 CODE16 ;下面为16位Thumb指令 start MOV R1,#10 . END;切换到切换到Thumb状态,并跳转到状态,并跳转到start处执行处执行软件学院软件学院湖南大学湖南大学 Software School of Hunan University 2)EQU 也可以用符号也可以用符号”*”表示表示 EQU伪操作为数字常量、基于寄存器

41、的值和程序中的标号定义一个字符名称。 语法格式: name EQU expr,type 其中: expr:基于寄存器的地址值、程序中的标号、32位的地址常量或者32位的常量。 name:为expr定义的字符名称。 type:当expr为32位常量时,可以使用type指示expr的数据的类型。取值为: CODE32 CODE16 DATA软件学院软件学院湖南大学湖南大学 Software School of Hunan University 例: abcd EQU 2 ;定义abcd符号的值为2 abcd EQU label+16 ;定义abcd符号的值为(label+16) abcd EQU

42、0 x1c,CODE32 ;定义abcd符号的值为绝对地址 ;值0 x1c,而且此处为ARM指令Reg EQU 0 xe01fc080 ;外设中的寄存器 软件学院软件学院湖南大学湖南大学 Software School of Hunan University 3) AREA 用于定义一个代码段或是数据段。 语法格式: AREA sectionname,attr ,attr 其中: sectionname:为所定义的段的名称。 attr:该段的属性。具有的属性为: CODE:定义代码段。 DATA:定义数据段。 READONLY:指定本段为只读,代码段的默认属性。 READWRITE:指定本段为

43、可读可写,数据段的默认属性。软件学院软件学院湖南大学湖南大学 Software School of Hunan University 4)ENTRY 指定程序的入口点。 语法格式: ENTRY 注意: 一个程序(可包含多个源文件)中至少要有一个ENTRY(可以有多个ENTRY),但一个源文件中最多只能有一个ENTRY(可以没有ENTRY) AREA example, CODE READONLY ENTRY CODE32 START MOV R1, #0 x53软件学院软件学院湖南大学湖南大学 Software School of Hunan University 5、END END伪操作告诉编

44、译器已经到了源程序结尾。 语法格式: END 注意: 每一个汇编源程序都必须包含END伪操作,以表明本源程序的结束。软件学院软件学院湖南大学湖南大学 Software School of Hunan University 6、EXPORT及GLOBAL声明一个源文件中的符号,使得此符号可以被其他源文件引用。相当于声明了一个全局变量。语法格式:EXPORT/GLOBAL symbol weak其中: symbol:声明的符号的名称。(区分大小写) weak:声明其他同名符号优先于本符号被引用。例: AREA example,CODE,READONLY EXPORT DoAdd DoAdd ADD

45、 R0,R0,R1 ; 函数名称可以被其他文件引用软件学院软件学院湖南大学湖南大学 Software School of Hunan University 7、IMPORT及EXTERN 告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的。 语法格式: IMPORT symbolweak EXTERN symbolweak 其中: symbol:声明的符号的名称。软件学院软件学院湖南大学湖南大学 Software School of Hunan University weak: 当没有指定此项时,如果symbol在所有的源文件中都没有被定义,则连接器会报告错误。 当指定此项时

46、,如果symbol在所有的源文件中都没有被定义,则连接器不会报告错误,而是进行下面的操作。 1、如果该符号被B或者BL指令引用,则该符号被设置成下一条指令的地址,该B或BL指令相当于一条NOP指令。 2、其他情况下此符号被设置成0。软件学院软件学院湖南大学湖南大学 Software School of Hunan University 例子: AREA Init , CODE , READONLY IMPORT Main ;通知编译器当前文件要引用标号 ;Main,但Main 在其他源文件中定义 END 软件学院软件学院湖南大学湖南大学 Software School of Hunan Uni

47、versity 8、GET及INCLUDE 将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。 指令格式: GET filename INCLUDE filename 其中: filename:包含的源文件名,可以使用路径信息(可包含空格)。 例:GET d:armfile.s软件学院软件学院湖南大学湖南大学 Software School of Hunan University 9、INCBIN 将一个文件包含到当前源文件中,而被包含的文件不进行汇编处理 指令格式: INCBIN filename 其中: filename:被包含的文件名称,可使用路径信息(不能有空格

48、)。 通常使用此伪操作将一个可执行文件或者任意数据包含到当前文件中。 例:INCBIN d:armfile.txt软件学院软件学院湖南大学湖南大学 Software School of Hunan University 10) ROUT 语法格式: 名称 ROUT ROUT 伪操作 用于给一个局部变量定义作用范围。 在程序中未使用该伪操作时,局部变量的作用范围为所在的 AREA , 而使用 ROUT 后,局部变量的作用范围为当前 ROUT 和下一个 ROUT 之间;若只有一个ROUT,则局部标号的作用范围在ROUT与段结束伪操作END之间。 软件学院软件学院湖南大学湖南大学 Software

49、School of Hunan University其他伪操作伪操作伪操作语法格式语法格式作作 用用CODE16CODE16告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为16位的位的Thumb指令指令CODE32CODE32告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为32位的位的ARM指令。指令。EQUname EQU expr,type为数字常量、基于寄存器的值和程序中的标号(基于为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符的值)定义一个字符名称。名称。AREAAREA sectionname,attr,attr定义一个代码段或者数据段。

50、定义一个代码段或者数据段。ENTRYENTRY指定程序的入口点。指定程序的入口点。ENDEND告诉编译器已经到了源程序结尾。告诉编译器已经到了源程序结尾。ALIGNALIGN expr,offset通过添加补丁字节使当前位置满足一定的对齐方式。通过添加补丁字节使当前位置满足一定的对齐方式。E X P O R T / GLOBALEXPORT symbol WEAK声明一个符号可以被其他文件引用,相当于声明了一个全局变量。声明一个符号可以被其他文件引用,相当于声明了一个全局变量。IMPORTIMPORT symbol WEAK告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,

51、告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。在本源文件中可能引用该符号。EXTERNEXTERN symbol WEAK告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。在本源文件中可能引用该符号。GET/ INCLUDEGET filename 将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。处理。INCBININCBIN fil

52、ename将一个文件包含到当前源文件中,被包含的文件不进行汇编处理。将一个文件包含到当前源文件中,被包含的文件不进行汇编处理。KEEPKEEPsymbol告诉编译器将局部符号包含在目标文件的符号表中。告诉编译器将局部符号包含在目标文件的符号表中。NOFPNOFP禁止源程序中包含浮点运算指令。禁止源程序中包含浮点运算指令。REQUIREREQUIRE lable指定段之间的相互依赖关系。指定段之间的相互依赖关系。RNname RN expr为一个特定的寄存器定义名称。为一个特定的寄存器定义名称。ROUTname ROUT定义局部变量的有效范围。定义局部变量的有效范围。软件学院软件学院湖南大学湖南

53、大学 Software School of Hunan University二、二、ARM汇编语言程序设计汇编语言程序设计 1 ARM汇编中的文件格式 2 ARM汇编语言语句格式 3 ARM汇编语言程序格式软件学院软件学院湖南大学湖南大学 Software School of Hunan University1.ARM汇编中的文件格汇编中的文件格式式 ARM源程序文件(可简称为源文件)可以由任意一种文本编辑器来编写程序代码,它一般为文本格式。在ARM程序设计中,常用的源文件可简单分为以下几种:源程序文件源程序文件文件名文件名说说 明明汇编程序文件汇编程序文件*.S用用ARM汇编语言编写的汇编语

54、言编写的ARM程序或程序或Thumb程序。程序。C程序文件程序文件*.C用用C语言编写的程序代码。语言编写的程序代码。头文件头文件*.H为了简化源程序,把程序中常用到的常为了简化源程序,把程序中常用到的常量命名、宏定义、数据结构定义等等单量命名、宏定义、数据结构定义等等单独放在一个文件中,一般称为头文件。独放在一个文件中,一般称为头文件。至少包含一个汇编源文件或至少包含一个汇编源文件或C源文件源文件软件学院软件学院湖南大学湖南大学 Software School of Hunan University软件学院软件学院湖南大学湖南大学 Software School of Hunan Unive

55、rsity2、ARM汇编语言语句格式汇编语言语句格式symbol instruction | directive | pseudo-instruction ; comment标签标签 指令指令/伪操作伪操作/伪指令伪指令 操作数操作数 ;语句的注释语句的注释例:例: labeladd add r0, r0, r1 ;加法指令,加法指令,labeladd为标签为标签注意:注意:1. 在在ARM汇编语言中,各个指令、伪指令及伪操作的助记符可以汇编语言中,各个指令、伪指令及伪操作的助记符可以全部用大写字母,也可全部用小写字母,全部用大写字母,也可全部用小写字母,不能在一个助记符中不能在一个助记符中即

56、有大写又有小写。即有大写又有小写。2. 如果一条语句很长,为了提高可读性,可使用如果一条语句很长,为了提高可读性,可使用“”将长语句分成将长语句分成若干行来写,在若干行来写,在后不能再有任何其他字符。后不能再有任何其他字符。3. 标号必须在一行的顶格书写,而所有指令均不能顶格书写。标号必须在一行的顶格书写,而所有指令均不能顶格书写。软件学院软件学院湖南大学湖南大学 Software School of Hunan University 在汇编语言程序设计中,经常使用各种符号代替地址、变量和常量等,以增加程序的可读性。 尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定: 符号区分大

57、小写,同名的大、小写符号会被编译器认为是两个不同的符号。 符号在其作用范围内必须唯一。 自定义的符号名不能与系统的保留字相同。 符号名不应与指令或伪指令同名。软件学院软件学院湖南大学湖南大学 Software School of Hunan University 3. ARM汇编语言程序格式 ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。 软件学院软件学院湖南大学湖南

58、大学 Software School of Hunan University ARM汇编语言源程序经过汇编处理后生成一个可执行的映像文件,通常包括3部分: (1)一个或多个代码段。 (2)0或多个包含初始值的数据段。 (3)0或多个不包含初始值的数据段。 链接器根据一定的规则将各个段安排到内存的相应位置。软件学院软件学院湖南大学湖南大学 Software School of Hunan University 代码段的例子:代码段的例子:AREA HAREA Hello,CODE,READONLYello,CODE,READONLY; ;声明代码段声明代码段HelloHelloENTRYENTR

59、Y; ;程序的入口点程序的入口点START MOV R7,#10START MOV R7,#10MOV R6,#5MOV R6,#5ADD R6,R6,R7ADD R6,R6,R7;R6=R6+R7;R6=R6+R7ENDEND; ;每一个汇编文件每一个汇编文件; ;都要以都要以ENDEND结束结束软件学院软件学院湖南大学湖南大学 Software School of Hunan University 数据的例子:数据的例子:AREA DateareaAREA Datearea,DATA,NOINIT,DATA,NOINIT; ;声明数据段声明数据段DateareaDatearea DATAS

60、PACE SPACE 100 DATASPACE SPACE 100; ;分配连续分配连续100100字节的存储单元字节的存储单元, ,并初始化为零并初始化为零软件学院软件学院湖南大学湖南大学 Software School of Hunan UniversityARM汇编语言编程的重点 ARM数据处理操作设置条件码汇编语言子程序调用及返回 软件学院软件学院湖南大学湖南大学 Software School of Hunan University1. ARM数据处理操作(1)简单的寄存器操作 ADDR0 , R1, R2 ; R1+R2送到送到R0(2)立即数操作 : 立即数由8位的立即数循环右移2n位(3)寄

温馨提示

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

评论

0/150

提交评论