ARM汇编语言程序设计课件.pptx
《ARM汇编语言程序设计课件.pptx》由会员分享,可在线阅读,更多相关《ARM汇编语言程序设计课件.pptx(114页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1 第1章嵌入式系统基础知识第2章ARM技术概述第3章ARM的指令系统第第4章章 ARM汇编语言程序设计汇编语言程序设计第5章ARMRealviewMDK集成开发环境第6章GPIO编程第7章ARM异常中断处理及编程第8章串行通信接口课程安排课程安排:2 第9章存储器接口第10章定时器第11章A/D转换器第12章LCD接口设计第13章温度监测仪开发实例课程安排课程安排:3 4.1ARM汇编器支持的伪操作4.2ARM汇编器支持的伪指令4.3ARM汇编语言的语句格式4.4ARM汇编语言的程序结构4.5汇编语言与C语言的混合编程4.6小结4.7思考与练习本章课程:本章课程:4 4.1.1伪操作概述在A
2、RM汇编语言程序中,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪操作标识符(directive)1,它们所完成的操作称为伪操作。伪操作在源程序中的作用是为了完成汇编程序做各种准备工作的,这些伪操作仅在汇编过程中起作用,一旦汇编结束,伪操作的使命就完成。在ARM的汇编程序中,伪操作主要有符号定义伪操作、数据定义伪操作、汇编控制伪操作及其杂项伪操作等。4.1ARM汇编器支持的伪操作5 4.1.2符号定义伪操作符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种。(1)用于定义全局
3、变量的GBLA、GBLL和GBLS。(2)用于定义局部变量的LCLA、LCLL和LCLS。(3)用于对变量赋值的SETA、SETL和SETS。(4)为通用寄存器列表定义名称的RLIST。4.1ARM汇编器支持的伪操作6 4.1.2符号定义伪操作1全局变量定义伪操作GBLA、GBLL和GBLS(1)语法格式GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中的全局变量并将其初始化。其中:GBLA伪操作用于定义一个全局的数字变量并初始化为0。GBLL伪操作用于定义一个全局的逻辑变量并初始化为F(假)。GBLS伪操作用于定义一个全局的字符串变量并初始化为空。由于以上3条伪指令用于定义全局变量,
4、因此在整个程序范围内变量名必须唯一。语法格式如下:取值为GBLA、GBLL、GBLS三者中的之一定义的全局变量名,在其作用范围内必须唯一。全局变量的作用范围为包含该变量的源程序4.1ARM汇编器支持的伪操作7 全局变量定义伪操作GBLA、GBLL和GBLS(2)使用说明,如果用这些伪操作重新声明已经声明过的变量,变量的值将被初始化成后一次声明语句中的值。(3)示例使用伪操作声明全局变量。GBLATest1;定义一个全局的数字变量,变量名为Test1Test1SETA0 xaa;将该变量赋值为0 xaaGBLLTest2;定义一个全局的逻辑变量,变量名为Test2Test2SETLTRUE;将该
5、变量赋值为真GBLSTest3;定义一个全局的字符串变量,变量名为Test3Test3SETSTesting;将该变量赋值为“Testing”声明变量Objectsize并设置其值为0 xff,为“SPACE”操作做准备。GBLAobjectsizeObjectsizeSETAoxffSPACEobjectsize下面的例子显示如何使用汇编命令设置变量的值。具体做法是使用“pd”选项ArmasmpdobjectsizeSETAoxffoobjectfilesourcefile4.1ARM汇编器支持的伪操作8 4.1.2符号定义伪操作2局部变量定义伪操作LCLA、LCLL和LCLS(1)语法格式
6、LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量并将其初始化。其中:LCLA伪操作用于定义一个局部的数字变量并初始化为0。LCLL伪操作用于定义一个局部的逻辑变量并初始化为F(假)LCLS伪操作用于定义一个局部的字符串变量并初始化为空。以上3条伪操作用于声明局部变量,在其作用范围内变量名必须唯一。语法格式如下:取值为LCLA、LCLL、LCLS三者中的之一。所定义的局部变量名,在其作用范围内必须唯一。局部变量作用范围为包含该局部变量的宏。4.1ARM汇编器支持的伪操作9 局部变量定义伪操作LCLA、LCLL和LCLS(2)使用说明,如果用这些伪操作重新声明已经声明过的变量,
7、则变量的值将被初始化成后一次声明语句中的值。(3)示例使用伪操作声明局部变量。LCLATest4;声明一个局部的数字变量,变量名为Test4Test3SETA0 xaa;将该变量赋值为0 xaaLCLLTest5;声明一个局部的逻辑变量,变量名为Test5Test4SETLTRUE;将该变量赋值为真LCLSTest6;定义一个局部的字符串变量,变量名为Test6Test6SETSTesting;将该变量赋值为“Testing”下面的例子定义一个宏,显示了局部变量的作用范围。MACRO;声明一个宏$labelmessage$a;宏原型LCLSerr;声明局部字符串变量$labelINFO0,er
8、r:CC:STR:$aMEND;宏结束,局部变量不再起作用4.1ARM汇编器支持的伪操作10 4.1.2符号定义伪操作3变量赋值伪操作SETA、SETL和SETS(1)语法格式伪指令SETA、SETL和SETS用于给一个已经定义的全局变量或局部变量赋值。SETA伪操作用于给一个数学变量赋值。SETL伪操作用于给一个逻辑变量赋值。SETS伪操作用于给一个字符串变量赋值。语法格式如下:VariableexprVariable变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。取值为SETA、SETL、SETS三者中的之一。expr数学、逻辑或字符串表达式,也就是将要赋予变量的值。4.
9、1ARM汇编器支持的伪操作11 变量赋值伪操作SETA、SETL和SETS(2)使用说明,在向变量赋值前必须先声明变量。也可以在汇编指令中预定义变量,如:Armasm-pdobjectsizeSETAoxff-oobjectfilesourcefile(3)示例为预先定义的变量赋值。LCLATest3;声明一个局部的数字变量,变量名为Test3Test3SETA0 xaa;将该变量赋值为0 xaaLCLLTest4;声明一个局部的逻辑变量,变量名为Test4Test4SETLTRUE;将该变量赋值为真LCLSTest6;定义一个局部的字符串变量,变量名为Test6Test6SETSTestin
10、g;将该变量赋值为“Testing”使用变量赋值伪操作,定义一些程序相关内容。GBLAversionNumberVersionNumberSETA21GBLLDebugDebugSETLTRUEGBLSversionStringVersionStringSETSversion1.04.1ARM汇编器支持的伪操作12 4.1.2符号定义伪操作4通用寄存器列表定义伪操作RLIST(1)语法格式RLIST伪操作可用于对一个通用寄存器列表定义名称,使用该伪操作定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序根据寄存器的编号由低到高,与列表中的寄存器排列次序无
11、关。语法格式如下:NameRLISTlist-of-registersName寄存器列表的名称。list-of-registers通用寄存器列表。列表中的寄存器用“,”隔开,如果是编号连续的通用寄存器可以用“”指定寄存器范围。具体用法参见程序示例。4.1ARM汇编器支持的伪操作13 通用寄存器列表定义伪操作RLIST(2)使用说明在使用ARM汇编编译器编译源文件时,可以使用“checkreg”选项来指定汇编器进行寄存器检查。如果汇编器检测到寄存器列表中的寄存器编号非升序排列,将给出编译警告。(3)示例将寄存器列表名称定义为RegList,可在ARM指令LDM/STM中通过该名称访问寄存器列表。
12、RegListRLISTR0-R5,R8,R10使用“”在寄存器列表中,指定寄存器范围。ContextRLISTR0-R6,R8,R10-R12,R154.1ARM汇编器支持的伪操作14 4.1.3数据定义(DataDefinition)伪操作数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪操作有如下几种。(1)DCB用于分配一片连续的字节存储单元并用指定的数据初始化(2)DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化(3)DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化(4)DCFD(DCFDU)用于为
13、双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化(5)DCFS(DCFSU)用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化(6)DCQ(DCQU)用于分配一片以8字节为单位的连续的存储单元并用指定的数据初始化(7)SPACE用于分配一片连续的存储单元(8)MAP用于定义一个结构化的内存表首地址(9)FIELD用于定义一个结构化的内存表的数据域4.1ARM汇编器支持的伪操作15 4.1.3数据定义(DataDefinition)伪操作1DCB(1)语法格式DCB伪操作用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为数字或字符串。DCB也
14、可用“=”代替。语法格式如下。labelDCBexpr,exprlabel,程序标号。expr,可以是128255的数字,也可以是字符串。(2)使用说明在使用DCB伪操作时,其后常跟ALIGN伪操作以保证内存地址对齐。(3)示例分配一片连续的字节存储单元并初始化为指定字符串。StrDCBThisisatest!与C中的字符串不同,ARM汇编中的字符串不以null结尾,下面指令以ARM汇编形成一个C语言风格的字符串。C_stringDCBC_string,04.1ARM汇编器支持的伪操作16 4.1.3数据定义(DataDefinition)伪操作2DCW(DCWU)(1)语法格式DCW(或DC
15、WU)伪操作用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格半字对齐。语法格式:labelDCWexpr,exprlabel,程序标号,可选。expr,数字表达式,取值范围为3276865525。(2)使用说明,DCW可能在分配的内存单元前加一个字节以保证内存半字对齐。当程序对内存对齐方式要求不严格时可以是DCWU伪操作。(3)示例分配一片连续的半字存储单元并初始化。DataTestDCW1,2,3在指定内存单元初始值时可以使用已定义的变量。DataDCW-255,2
16、*numberDCWUnumber+44.1ARM汇编器支持的伪操作17 4.1.3数据定义(DataDefinition)伪操作3DCD(DCWU)(1)语法格式,DCD(或DCDU)伪操作用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用“&”代替。用DCDU分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格字对齐。语法格式:labelDCDUexpr,exprlabel,程序标号,可选。expr,expr可以是数字表达式或程序相关表达式(program-relativeexpression)。(2)使用说明,DC
17、D可能在分配的内存单元前加13字节以保证内存字对齐。当程序对内存对齐方式要求不严格时可以是DCDU伪操作。(3)示例分配一片连续的字存储单元并初始化:DataTestDCD4,5,6用程序标号初始化内存单元:DataTestDCDmem06+4在内存单元不能字对齐的情况下,使用DCDU伪操作。AREAMydata,DATA,READWRITEDCB255;字节定义使内存单元不能字对齐Data3DCDU1,5,204.1ARM汇编器支持的伪操作18 4.1.3数据定义(DataDefinition)伪操作4DCFS(或DCFSU)(1)语法格式,DCFS(或DCFSU)伪指令用于为单精度的浮点数
18、分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据一个字单元。用DCFS分配的字存储单元是字对齐的,而用DCFSU分配的字存储单元并不严格字对齐。语法格式:labelDCFSUfpliteral,fpliterallabel,程序标号,可选。fpliteral,单精度浮点数(2)使用说明,DCFS可能在分配的内存单元前加13字节以保证内存字对齐。当程序对内存对齐方式要求不严格时可以是DCFSU伪操作。此伪操作使用的单精度浮点数的范围为:1.17549435e383.40282347e+38。(3)示例分配一片连续的字存储单元并初始化为指定的单精度浮点数。FDataT
19、estDCFS2E5,5E7分配一片连续的字存储单元并初始化为单精度浮点数,但不严格要求字对齐。DCFSU1.0,0.1,3.1e64.1ARM汇编器支持的伪操作19 4.1.3数据定义(DataDefinition)伪操作5DCFD(或DCFDU)(1)语法格式DCFD(或DCFDU)伪指令用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个双精度的浮点数占据两个字单元。用DCFD分配的字存储单元是字对齐的,而用DCFDU分配的字存储单元并不严格字对齐。语法格式:labelDCFDUfpliteral,fpliterallabel,程序标号,可选。fplitera
20、l,双精度浮点数。(2)使用说明DCFS可能在分配的内存单元前加13字节以保证内存字对齐。当程序对内存对齐方式要求不严格时可以是DCFSU伪操作。当程序中的浮点数要由ARM处理器进行操作时,用户选择的浮点处理器结构会自动完成字节顺序的转换。当编译时使用了编译选项fpunone,伪操作DCFS(DCFSU)不可使用。此伪操作使用的单精度浮点数的范围为:2.22507385850720138e3081.79769313486231571e+308。(3)示例分配一片连续的字存储单元并初始化为指定的双精度浮点数。FDataTestDCFD2E115,-5E7分配一片连续的字存储单元并初始化为双精度浮
21、点数,但不严格要求字对齐。DCFDU1.0,-0.1,3.1e64.1ARM汇编器支持的伪操作20 4.1.3数据定义(DataDefinition)伪操作6DCQ(或DCQU)(1)语法格式DCQ(或DCQU)伪指令用于分配一片以8个字节为单位的连续存储区域并用伪指令中指定的表达式初始化。用DCQ分配的存储单元是字对齐的,而用DCQU分配的存储单元并不严格字对齐。语法格式:labelDCQU-literal,-literallabel,程序标号,可选。literal,用于初始化内存的数字必须是可数的数字表达式,其取值范围为02641。可以在数字表达式前加负号来表示用负数初始化内存单元,但此时
22、数字表达式的取值范围为2631。(2)使用说明DCQ可能在分配的内存单元前加13字节以保证内存字对齐。当程序对内存对齐方式要求不严格时可以是DCQU伪操作。(3)示例分配一片连续的存储单元并初始化为指定的值。DataTestDCQ100使用标号定义内存单元:ECQUnumber+44.1ARM汇编器支持的伪操作21 4.1.3数据定义(DataDefinition)伪操作7SPACE(1)语法格式SPACE伪指令用于分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。SPACE也可用“%”代替。语法格式:labelSPACEexprlabel,程序标号,可选。expr,分配的字节
23、数。(2)使用说明SPACE伪操作常和ALIGN一起使用,详见ALIGN伪操作。(3)示例分配连续100字节的存储单元并初始化为0。DataSpaceSPACE100在Mydata段的开始可以是255个初始化为0的字节单元。AREAMydata,DATA,READWRITEdata1SPACE2554.1ARM汇编器支持的伪操作22 4.1.3数据定义(DataDefinition)伪操作8MAP(1)语法格式MAP伪操作用于定义一个结构化的内存表的首地址。MAP也可用“”代替。表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当
24、该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。MAP伪操作通常与FIELD伪操作配合使用来定义结构化的内存表。语法格式:MAPexpr,base-registerexpr,如果基地址寄存器(base-register)没有指定,expr表达式存储到结构化内存表首地址。如果表达式expr是“程序相关的(program-relative)”,则程序标号在使用前必须定义。base-register,指定一个寄存器。当指令中包含这一项时,结构化内存表的首地址为expr和base-register寄存器值的和。(2)使用说明MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。当基
25、地址寄存器(base-register)一旦被指定,下面所有的FIELD伪操作全部以基地址为基础增加偏移量。(3)示例定义结构化内存表首地址的值为0 x100+R0:MAP0 x100,R0不存在基地址寄存器,结构化内存表的首地址直接由表达式定义:MAP04.1ARM汇编器支持的伪操作23 4.1.3数据定义(DataDefinition)伪操作9FILED(1)语法格式FIELD伪操作用于定义一个结构化内存表中的数据域。FILED也可用“#”代替。表达式的值为当前数据域在内存表中所占的字节数。FIELD伪操作常与MAP伪操作配合使用来定义结构化的内存表。MAP伪操作定义内存表的首地址,FIE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 汇编语言 程序设计 课件
限制150内