arm嵌入式原理技术及应用ch-4.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《arm嵌入式原理技术及应用ch-4.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- arm 嵌入式 原理 技术 应用 ch
- 资源描述:
-
1、arm嵌入式原理技术及应用ch-4第四章 ARM汇编程序设计2022-10-5 了解与熟悉了解与熟悉ADSADS下的伪操作和宏指令以及下的伪操作和宏指令以及它的应用它的应用 了解与熟悉了解与熟悉GNUGNU下的伪操作和宏指令以及下的伪操作和宏指令以及它的应用它的应用 熟悉熟悉ARM ATPCSARM ATPCS 能够利用汇编语言进行简单的程序设计能够利用汇编语言进行简单的程序设计 2022-10-51.1.伪指令、伪操作和宏指令概念伪指令、伪操作和宏指令概念 伪指令伪指令是汇编语言程序里的特殊指令助记符,是汇编语言程序里的特殊指令助记符,在汇编时被合适的机器指令替代。在汇编时被合适的机器指令替
2、代。伪操作伪操作为汇编程序所用,在源程序进行汇编为汇编程序所用,在源程序进行汇编时由汇编程序处理,只在汇编过程起作用,不参与时由汇编程序处理,只在汇编过程起作用,不参与程序运行。程序运行。4.1.4.1.汇编伪指令和宏指令汇编伪指令和宏指令2022-10-5 宏指令宏指令通过伪操作定义的一段独立的代码。在调用它通过伪操作定义的一段独立的代码。在调用它时将宏体插入到源程序中。时将宏体插入到源程序中。也就是常说的宏也就是常说的宏。说明:说明:所有的伪指令、伪操作和宏指令,均与具体的所有的伪指令、伪操作和宏指令,均与具体的开发工具中的编译器有关,当前主要采用开发工具中的编译器有关,当前主要采用ARM
3、公司的公司的“ADS/SDT IDE”开发工具,所以后面的讨论,均是基于开发工具,所以后面的讨论,均是基于ARM公司的开发工具。公司的开发工具。2022-10-52.ARM2.ARM汇编伪指令汇编伪指令 ARM伪指令不属于伪指令不属于ARM指令集中的指令,是为了指令集中的指令,是为了编程方便而定义的。伪指令可以像其它编程方便而定义的。伪指令可以像其它ARM指令一样使指令一样使用,但在编译时这些指令将被等效的用,但在编译时这些指令将被等效的ARM指令代替。指令代替。ARM伪指令有四条,分别是:伪指令有四条,分别是:ADR:小范围的地址读取伪指令。:小范围的地址读取伪指令。ADRL:中等范围的地址
4、读取伪指令。:中等范围的地址读取伪指令。LDR:大范围的地址读取伪指令。:大范围的地址读取伪指令。NOP:空操作伪指令。:空操作伪指令。2022-10-5(1)ADR小范围的地址读取小范围的地址读取 ADR伪指令功能:伪指令功能:将基于将基于PC相对偏移的地址值或基于寄相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。存器相对偏移的地址值读取到寄存器中。ADR伪指令功能的实现方法:伪指令功能的实现方法:在汇编编译器编译源程序在汇编编译器编译源程序时,时,ADR伪指令被编译器替换成一条合适的指令。通常,编伪指令被编译器替换成一条合适的指令。通常,编译器用一条译器用一条ADD指令或指令或
5、SUB指令来实现此指令来实现此ADR伪指令的功能,伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。若不能用一条指令实现,则产生错误,编译失败。语法格式:语法格式:ADRcond register,expr其中:其中:register:加载的目标寄存器。:加载的目标寄存器。expr:地址表达式。取值范围是参考:地址表达式。取值范围是参考P2122022-10-5 例例1:(0 x20)ADR R1,Delay Delay(0 x64)MOV R0,R14 使用使用ADR将程序标号将程序标号Delay所表示的地址存入所表示的地址存入R1。编译后的反汇编代码:编译后的反汇编代码:ADD R
6、1,PC,#0 x3C MOV R0,R14 PC+0 x3C=0 x20+0 x08+0 x3C=0 x642022-10-5例例2:查表:查表 ADR R0,D_TAB ;加载转换表地址加载转换表地址 LDRB R1,R0,R2 ;使用使用R2作为参数,进行查表作为参数,进行查表 D_TAB DCB 0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x922022-10-5(2)ADRL中等范围的地址读取中等范围的地址读取ADRL伪指令功能:伪指令功能:将基于将基于PC相对偏移的地址值或基于寄相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比存器相对偏移的地址值读
7、取到寄存器中,比ADR伪指令可以伪指令可以读取更大范围的地址。读取更大范围的地址。ADRL伪指令功能实现方法:伪指令功能实现方法:在汇编编译器编译源程序时,在汇编编译器编译源程序时,ADRL被编译器替换成两条合适的指令。若不能用两条指令实被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。现,则产生错误,编译失败。语法格式:语法格式:ADRLcond register,expr其中:其中:register:加载的目标寄存器。:加载的目标寄存器。expr:地址表达式。取值范围参考:地址表达式。取值范围参考P2122022-10-5例例3:(0 x20)ADRL R1,Del
8、ay Delay(0 x64)MOV R0,R14 使用使用ADRL将程序标号将程序标号Delay所表示的地址存入所表示的地址存入R1。编译后的反汇编代码:编译后的反汇编代码:ADD R1,PC,#0 x3CADD R1,R1,#0 MOV R0,R14 ADRL ADRL伪指令被汇编成两伪指令被汇编成两条指令,尽管第条指令,尽管第2 2条指令并条指令并没有意义。没有意义。2022-10-5(3)LDR 大范围的地址读取大范围的地址读取LDR伪指令功能:伪指令功能:用于加载用于加载32位立即数或一个位立即数或一个地址值到指定的寄存器。地址值到指定的寄存器。LDR伪指令功能实现方法:伪指令功能实
9、现方法:在汇编编译源程序在汇编编译源程序时,时,LDR伪指令被编译器替换成一条合适的指令。伪指令被编译器替换成一条合适的指令。若若加载的常数未超过加载的常数未超过MOV或或MVN的范围,则使的范围,则使用用MOV或或MVN指令代替该指令代替该LDR伪指令;伪指令;否则否则汇编器将常量放入文字池,并使用一条程汇编器将常量放入文字池,并使用一条程序相对偏移的序相对偏移的LDR指令从文字池读出常量。指令从文字池读出常量。2022-10-5 语法格式:语法格式:LDRcond register,=expr其中:其中:Register:加载的目标寄存器。:加载的目标寄存器。expr:32位常量或地址表达
10、式。位常量或地址表达式。2022-10-5 例例4:(0 x060)LDR R1,=Delay Delay(0 x102)MOV R0,R14 使用使用LDR将程序标号将程序标号Delay所表示的地址存入所表示的地址存入R1。编译后的反汇编代码:编译后的反汇编代码:LDR R1,stack Delay MOV R0,R14 LTORGstack DCD 0 x102 LDR伪指令被汇编成一条伪指令被汇编成一条LDR指令指令,并在文字池中定义一个常量并在文字池中定义一个常量,该常量为标号该常量为标号Delay的地址。的地址。2022-10-5注意:注意:从指令位置到文字池的偏移量必须小于从指令位
11、置到文字池的偏移量必须小于4KB。与与ARM指令的指令的LDR的区别:伪指令的区别:伪指令LDR的参数有的参数有“=”号。号。2022-10-5(4)NOP空操作伪指令空操作伪指令NOP伪指令功能实现方法:伪指令功能实现方法:在汇编时将被替代成在汇编时将被替代成ARM中的空操作,比如可能是中的空操作,比如可能是“MOV R0,R0”指令等。指令等。用途:用途:NOP可用于延时操作。可用于延时操作。语法格式:语法格式:NOP例:延时子程序例:延时子程序 Delay NOP ;空操作空操作 NOP NOP SUBS R1,R1,#1 ;循环次数减循环次数减1 BNE Delay MOV PC,LR
12、2022-10-53.ARM3.ARM汇编伪操作汇编伪操作ADS编译环境下的伪操作可分为以下几类:编译环境下的伪操作可分为以下几类:符号定义符号定义(Symbol Definition)伪操作)伪操作 数据定义数据定义(Data Definition)伪操作)伪操作 汇编控制汇编控制(Assembly Control)伪操作)伪操作 其它其它(Miscellaneous)伪操作)伪操作 2022-10-5(1)符号定义伪操作符号定义伪操作 vGBLA,GBLL,GBLS:声明全局变量。:声明全局变量。vLCLA,LCLL,LCLS:声明局部变量。:声明局部变量。vSETA,SETL,SETS:
13、给变量赋值。:给变量赋值。vRLIST:为通用寄存器列表定义名称。:为通用寄存器列表定义名称。2022-10-5(2)数据定义伪操作数据定义伪操作 LTORG:声明一个数据缓冲池的开始:声明一个数据缓冲池的开始 SPACE:分配一块字节内存单元,并用:分配一块字节内存单元,并用0初始化初始化 DCB:分配一段字节内存单元,并初始化:分配一段字节内存单元,并初始化 DCD、DCDU:分配一段字内存单元,并初始化:分配一段字内存单元,并初始化 MAP:定义一个结构化的内存表的首地址:定义一个结构化的内存表的首地址 FIELD:定义结构化内存表中的一个数据域:定义结构化内存表中的一个数据域 2022
14、-10-5 MAPMAP、FIELD FIELD、SPACEMAP 0 x100MAP 0 x100,R0 R0;定义结构化内存表首地址的值为;定义结构化内存表首地址的值为0 x1000 x100R0R0A FIELD 16 A FIELD 16;定义;定义A A的长度为的长度为1616字节,位置为字节,位置为0 x110+R0 0 x110+R0 LTORG ;定义数据缓冲池定义数据缓冲池&0 x8000Data SPACE 4200;从当前位置开始分配从当前位置开始分配4200字节的内存单字节的内存单元,并初始化为元,并初始化为0。2022-10-5LTORG用于声明一个数据缓冲池(文字池
15、)的开始。用于声明一个数据缓冲池(文字池)的开始。语法格式:语法格式:LTORG例:例:start BL func;func LDR R1,=0 x8000 ;子程序子程序 MOV PC,LR ;子程序返回子程序返回 LTORG ;定义数据缓冲池定义数据缓冲池&0 x8000Data SPACE 4200 ;从当前位置开始分配从当前位置开始分配4200字节的内字节的内 存单元,并初始化为存单元,并初始化为0。END 默认数据缓冲池为空默认数据缓冲池为空2022-10-5注意:注意:LTORG伪操作通常放在无条件跳转指令之后,伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器不
16、会错误地或者子程序返回指令之后,这样处理器不会错误地将数据缓冲池中的数据当作指令来执行。将数据缓冲池中的数据当作指令来执行。通常通常ARM汇编编译器把数据缓冲池放在代码段汇编编译器把数据缓冲池放在代码段的最后面,即下一个代码段开始之前,或者的最后面,即下一个代码段开始之前,或者END伪伪操作之前。操作之前。2022-10-5 DCB也可以用符号也可以用符号”=”表示表示用于定义并且初始化一个或者多个字节的内存区域。用于定义并且初始化一个或者多个字节的内存区域。语法格式:语法格式:label DCB expr,expr或或 label =expr,expr其中其中expr表示:表示:-128到到
17、255之间的一个数值常量或者表达式。之间的一个数值常量或者表达式。一个字符串。一个字符串。注意:注意:当当DCB后面紧跟一个指令时,可能需要使用后面紧跟一个指令时,可能需要使用ALIGN确保指令是字对齐的。确保指令是字对齐的。2022-10-5例:例:short DCB 1 ;为为short分配了一个字节分配了一个字节,并初始化为并初始化为1。string DCB “string”,0 ;构造一个以构造一个以0 结尾的字符串结尾的字符串 2022-10-5DCD、DCDU分配一段字内存单元分配一段字内存单元(1)DCD 分配一段字对齐的内存单元分配一段字对齐的内存单元用于分配一段字对齐的内存单
18、元,并初始化。用于分配一段字对齐的内存单元,并初始化。DCD也可以用符号也可以用符号”&”表示表示语法格式:语法格式:label DCD expr,expr或或 label&expr,expr 其中:其中:expr:数字表达式或程序中的标号。:数字表达式或程序中的标号。注意:注意:DCD伪操作可能在分配的第一个内存单元前插入填补字节以保伪操作可能在分配的第一个内存单元前插入填补字节以保证分配的内存是字对齐的。证分配的内存是字对齐的。2022-10-5例:例:data1 DCD 2,4,6 ;为为data1分配三个字分配三个字,内容初始化为内容初始化为2,4,6 data2 DCD label+
19、4 ;初始化初始化data2为为label+4对应的地址对应的地址 (2)DCDU 分配一段字非严格对齐的内存单元分配一段字非严格对齐的内存单元DCDU与与DCD的不同之处在于的不同之处在于DCDU分配的内存单元并分配的内存单元并不严格字对齐。不严格字对齐。2022-10-5(3)汇编控制伪操作)汇编控制伪操作 IF,ELSE及及ENDIF:有条件选择汇编:有条件选择汇编 WHILE及及WEND:有条件循环(重复)汇编:有条件循环(重复)汇编 MACRO,MEND及及MEXIT:宏定义汇编:宏定义汇编2022-10-5(4)其它伪操作)其它伪操作AREA:定义一个代码段或数据段定义一个代码段或
20、数据段 CODE16、CODE32:告诉编译器后面的指令序列位数告诉编译器后面的指令序列位数 ENTRY:指定程序的入口点指定程序的入口点 ALIGN:将当前的位置以某种形式对齐将当前的位置以某种形式对齐 END:源程序结尾源程序结尾 EQU:为数字常量、基于寄存器的值和程序中的标号定义一为数字常量、基于寄存器的值和程序中的标号定义一个字符名称。个字符名称。2022-10-5 EXPORT、GLOBAL:声明源文件中的符号可以被其他源文声明源文件中的符号可以被其他源文件引用件引用 IMPORT、EXTERN:声明某符号是在其他源文件中定义的声明某符号是在其他源文件中定义的 GET、INCLUD
21、E:将一个源文件包含到当前源文件中,并将将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。被包含的文件在其当前位置进行汇编处理。INCBIN:将一个文件包含到当前源文件中,而被包含的文件将一个文件包含到当前源文件中,而被包含的文件不进行汇编处理不进行汇编处理2022-10-51)AREA用于定义一个代码段或是数据段。用于定义一个代码段或是数据段。语法格式:语法格式:AREA sectionname,attr,attr 其中:其中:sectionname:为所定义的段的名称。:为所定义的段的名称。attr:该段的属性。具有的属性为:该段的属性。具有的属性为:CODE:定义
22、代码段。定义代码段。DATA:定义数据段。定义数据段。READONLY:指定本段为只读指定本段为只读,代码段的默认属性。代码段的默认属性。READWRITE:指定本段为可读可写指定本段为可读可写,数据段的默认数据段的默认属性。属性。2022-10-5 ALIGN:指定段的对齐方式为指定段的对齐方式为2expression。expression的取值为的取值为031。COMMON:指定一个通用段。该段不包含任指定一个通用段。该段不包含任何用户代码和数据。何用户代码和数据。NOINIT:指定此数据段仅仅保留了内存单元,指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个而没有将
23、各初始值写入内存单元,或者将各个内存单元值初始化为内存单元值初始化为0。注意:注意:一个大的程序可包含多个代码段和数据一个大的程序可包含多个代码段和数据段。一个汇编程序至少包含一个代码段。段。一个汇编程序至少包含一个代码段。2022-10-52)CODE16和和CODE32CODE16告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为16位的位的Thumb指令。指令。CODE32告诉汇编编译器后面的指令序列为告诉汇编编译器后面的指令序列为32位的位的ARM指令。指令。语法格式:语法格式:CODE16 CODE32 注意:注意:CODE16和和CODE32只是告诉编译器后面指令只是告诉
24、编译器后面指令的类型,该伪操作本身不进行程序状态的切换。的类型,该伪操作本身不进行程序状态的切换。2022-10-5例:例:AREA ChangeState,CODE,READONLY ENTRY CODE32 ;下面为下面为32位位ARM指令指令 LDR R0,=start+1 BX R0 CODE16 ;下面为下面为16位位Thumb指令指令start MOV R1,#10 .END;切换到切换到Thumb状态,并跳转到状态,并跳转到start处执行处执行2022-10-53)ENTRY指定程序的入口点。指定程序的入口点。语法格式:语法格式:ENTRY注意:注意:一个程序(可包含多个源文件
25、)中至少要有一个一个程序(可包含多个源文件)中至少要有一个ENTRY(可以有多个(可以有多个ENTRY),但一个源文件中最多只能有一个),但一个源文件中最多只能有一个ENTRY(可以没有(可以没有ENTRY)2022-10-54)ALIGNALIGN伪操作通过填充伪操作通过填充0将当前的位置以某种形式对齐。将当前的位置以某种形式对齐。语法格式:语法格式:ALIGN expr,offset其中:其中:expr:一个数字,表示对齐的单位。这个数字是:一个数字,表示对齐的单位。这个数字是2的整数的整数次幂,范围在次幂,范围在20231之间。之间。如果没有指定如果没有指定expr,则当前位置对齐到下一
展开阅读全文