收藏 分享(赏)

第6章 ARM汇编伪指令与伪操作(1).ppt

上传人:a****2 文档编号:3452430 上传时间:2024-05-08 格式:PPT 页数:64 大小:134KB
下载 相关 举报
第6章 ARM汇编伪指令与伪操作(1).ppt_第1页
第1页 / 共64页
第6章 ARM汇编伪指令与伪操作(1).ppt_第2页
第2页 / 共64页
第6章 ARM汇编伪指令与伪操作(1).ppt_第3页
第3页 / 共64页
第6章 ARM汇编伪指令与伪操作(1).ppt_第4页
第4页 / 共64页
第6章 ARM汇编伪指令与伪操作(1).ppt_第5页
第5页 / 共64页
第6章 ARM汇编伪指令与伪操作(1).ppt_第6页
第6页 / 共64页
亲,该文档总共64页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、第6章 ARM汇编伪指令与伪操作,本章将详细介绍进行汇编语言程序设计时所用的ARM/Thumb汇编语言伪指令、由ARM公司推出的开发工具所支持的伪操作以及GNU ARM开发工具所支持的伪操作。,内容提要,61 汇编语言伪指令62 ARM汇编语言伪操作63 ARM汇编伪操作64 GNU ARM汇编伪操作,61 汇编语言伪指令,伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。,6.1.1 ARM汇编语言伪指令,1大范围地址读取伪指令LDRLDR伪指令将一个32位的常数或者一个地

2、址值读取到寄存器中,可以看作是加载寄存器的内容。LDRcond register,=expression,6.1.1 ARM汇编语言伪指令,如果加载的常数符合MOV或MVN指令立即数的要求,则用MOV或MVN指令替代LDR伪指令。如果加载的常数不符合MOV或MVN指令立即数的要求,汇编器将常量放入内存文字池,并使用一条程序相对偏移的LDR指令从内存文字池读出常量。,6.1.1 ARM汇编语言伪指令,例:伪指令语句:LDRR0,=0 x0AA00;R00 x0AA00LDR R1,=0 xAABBCCDD汇编后分别为:MOV R0,#43520(#0 xAA00)LDR R1,PC,offset

3、_LpoolLpoolDCD 0 xAABBCCDD,6.1.1 ARM汇编语言伪指令,2中等范围地址读取伪指令ADRL它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。ADRLcond register,expression,6.1.1 ARM汇编语言伪指令,汇编器在处理源程序时,ADRL伪指令被两条具有ADRL等同功能的ARM指令(通常用ADD或SUB指令)替代。如果不能用两条指令实现ADRL伪指令的功能,则编译器报告错误,编译失败。,6.1.1 ARM汇编语言伪指令,以下指令存放在0 x8000起始的地址单元,分析汇编后的结果。startMOVR0,#0 x0FAD

4、RL R0,start解:汇编后的结果为:0 x00008000MOV R0,#0 x0F0 x00008004SUB R0,PC,#120 x00008008NOP(MOV R0,R0),6.1.1 ARM汇编语言伪指令,3小范围地址读取伪指令ADR它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。当地址是字节对齐时,取值范围为-255+255 ADRcond register,expression汇编器在处理源程序时,ADR伪指令被一条具有ADR等同功能的ARM指令(通常用ADD或SUB指令)替代。如果不能用一条指令实现ADR伪指令的功能,则编译器报告错误,编译失败。

5、,6.1.1 ARM汇编语言伪指令,下列指令存放在0 x8000起始的地址单元,分析汇编后的结果。.global _start.text_start:MOVR0,#0 x0FADRR0,_start.end解:汇编后的结果为:0 x00008000MOV R0,#0 x0F0 x00008004SUB R0,PC,#12,6.1.1 ARM汇编语言伪指令,ADR、ADRL、LDR 的区别取值范围不同ADR:255+255/-1020+1020ADRL:64KB+64KB/256KB+256KBLDR:LDR伪指令处的PC值到数据缓冲区的目标数据所在的地址之间的偏移量必须小于4KB。使用方法不同

6、ADR、ADRL只能取同一段中标号的地址;LDR还可以取不同段中的标号地址或一个指定的立即数ADR、ADRL与LDR书写标号时语法有区别,6.1.1 ARM汇编语言伪指令,4空操作伪指令NOPNOP是空操作伪指令,在汇编时将会被替代成ARM中的空操作.例如MOV R0,R0ADD R0,R0,#0SUB R0,R0,#0,62ARM汇编语言伪操作,伪操作(Directive)是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。伪操作只是汇编过程中起作用,一旦汇编结束,伪操作也就随之消失。,目前常用

7、的编译环境有2种:1.ADS/SDT、RealView MDK等ARM公司推出的开发工具2.GNU ARM开发工具,1.ADS/SDT、RealView MDK等ARM公司推出的开发工具ADS由ARM公司推出,使用了CodeWarrior公司的编译器。针对ARM资源配置为用户提供了在 CodeWarrior IDE 集成环境下配置各种ARM 开发工具的能力。以ARM为目标平台的工程创建向导,可以使用户以此为基础,快速创建ARM和Thumb工程。,ARM 将Keil 公司收购之后,正式推出了针对ARM 微控制器的开发工具RealView Microcont roller Development

8、Kit(简称Real View MDK 或者MDK),它将ARM 开发工具RealView Development Suite(简称RVDS)的编译器RVCT 与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM 微控制器开发工具。,2.GNU ARM开发工具GNU是“GNUs Not Unix”的递归缩写。在1983年9月27日由Richard Stallman公开发起GNU计划,它的目标是创建一套完全自由的操作系统。GNU格式ARM汇编语言程序主要是面对在ARM平台上移植嵌入式Linux操作系统,GNU组织开发的基于ARM平台的编译工具有主要由GNU的汇编器as,交叉汇编器

9、gcc和连接器ld组成。,6.3 ARM汇编伪操作,ARM公司推出的开发工具所支持的汇编伪操作包括符号定义伪操作、数据定义伪操作、汇编信息报告控制伪操作、汇编代码控制伪操作、文件包含伪操作、指令集类型标识伪操作以及其他功能伪操作。,6.3.1 符号定义伪操作,符号定义伪操作用于在ARM汇编程序中定义变量、给寄存器定义别名和对变量进行赋值等操作。1.局部变量定义LCLA、LCLL及LCLS语法格式:LCLAvariable LCLLvariable LCLSvariable 功能:定义局部变量并初始化。其中:variable所说明的局部变量名称。,6.3.1 符号定义伪操作,2.全局变量定义GB

10、LA、GBLL及GBLS语法格式GBLAvariable GBLLvariable GBLSvariable 功能:定义全局变量并初始化。其中:variable所说明的全局变量名称。在整个程序范围内必须唯一。,6.3.1 符号定义伪操作,3.变量赋值伪操作SETA、SETL及SETS语法格式variable_aSETAexpr_avariable_lSETL expr_lvariable_sSETS expr_s,6.3.1 符号定义伪操作,例6-10 定义全局变量并赋值GBLA a_varGBLL l_varGBLS s_vara_varSETA 0 xFFl_varSETL TRUEs_v

11、arSETS“AABCD”变量如何在ARM语句中使用?MOV R0,#a_var,6.3.1 符号定义伪操作,4.给通用寄存器列表定义名称RLIST语法格式nameRLISTregisters_list其中:name寄存器列表的名称;registers_list通用寄存器列表。例:ReglistRLIST R0-R2,R5,R7,R10-R12如何在ARM语句中使用?LDMFD R13!,Reglist,6.3.2 数据定义伪操作,数据定义伪操作一般用于为特定的数据分配存储单元,也可以完成已分配存储单元的初始化。,6.3.2 数据定义伪操作,1.分配字节存储单元DCB语法格式labelDCBe

12、xpr,expr 其中:label可选的程序标号;expr是-128255之间的数字或字符串。例:Str_buffer DCB“ARM7 and ARM9”,0 x0,0 x1,6.3.2 数据定义伪操作,2.分配半字存储单元DCW及DCWU语法格式labelDCWexpr,expr labelDCWUexpr,expr 其中:label可选的程序标号;expr是-3276865535之间的数字表达式。例:data_buffer1DCW 0 x1,0 x2,0 x3data_buffer2DCWU 0 x1,0 x2,0 x3,6.3.2 数据定义伪操作,3.分配字存储单元DCD及DCDU语法

13、格式labelDCDexpr,expr labelDCDUexpr,expr 其中:label可选的程序标号;expr表达式。例:data_buffer1DCD 0 x1,0 x2,0 x3data_buffer2DCDU 0 x1,0 x2,0 x3,6.3.2 数据定义伪操作,7.声明数据缓冲池LTORG 在使用LDR伪指令时,要在适当的位置加入LTORG声明数据缓冲池,这样就会把要加载的数据保存到缓存池中,再使用ARM加载指令读出,如果没有使用LTROG声明数据缓冲池,则汇编器会在程序末尾自动声明。语法格式:LTROG,6.3.2 数据定义伪操作,8.分配存储空间SPACE语法格式lab

14、elSPACEexpr其中:label可选的程序标号;expr分配的字节数。功能:分配一片连续的字节存储区域并将其初始化为0。,6.3.2 数据定义伪操作,9.定义结构化内存表首地址MAP语法格式MAPexpr,base_register其中:结构化内存表的首地址为expr与base_register之和。MAP通常与FIELD伪操作配合使用来定义结构化的内存表。,6.3.2 数据定义伪操作,10.定义结构化内存表数据域FIELD语法格式labelFIELDexpr其中:label可选的程序标号,当指定这一选项时,label的值为当前内存表的位置计数器的值;exprFIELD指定的域所占内存单

15、元字节数。注意:MAP与FIELD仅定义数据结构,不分配存储单元;MAP伪操作基地址寄存器被指定后,将被其后所有 FIELD伪操作定义的数据结构使用,直到遇到下一个 包含基地址寄存器的MAP指令。,6.3.2 数据定义伪操作,例6-25:(1)定义一个结构化内存表,首地址为0 x300,该结构化内存表包含4个域,Fdata1长度为4字节,Fdata2长度为8字节,Fdata3长度为100字节。(2)分析下面LDR指令实现的功能。MAP 4,R12FIELD 4Fdata FIELD 4LDR R0,Fdata,6.3.3 汇编代码控制伪操作,汇编器在对程序代码进行编译时,会根据汇编控制伪操作的

16、定义情况对程序进行编译,常用的有条件编译、重复汇编和宏定义,6.3.3 汇编代码控制伪操作,1.IF条件编译伪操作:根据条件来决定是否对一段程序代码进行编译语法格式:IFlogical_expression程序代码段AELSE程序代码段BENDIF,例:IFUART0=ONBL UART0_initELSEBL UART1_initENDIF,6.3.3 汇编代码控制伪操作,2.WHILE条件编译伪操作语法格式:WHILE logical_expression程序代码段WEND功能:重复编译程序代码段直到logical_expression不成立。,例:counter SETA 100WHIL

17、E counter0 counter SETA counter-1WEND,6.3.3 汇编代码控制伪操作,3.MACRO宏定义伪操作语法格式:MACRO$labelmacroname$parameter,$parameter程序代码段MEND其中:$label在宏指令被展开时,标号被替换成用户定义的符号$parameter为宏的参数列表,当宏被展开时被替换为相应的值。功能:将一段程序代码定义成一个宏。,6.3.3 汇编代码控制伪操作,3.MACRO宏定义伪操作宏在调用时被替换展开,没有其他的附加操作。宏多用于所定义的程序代码量较小,而需要传送参数比较多的场合。相对子程序调用而言,能有效提高处

18、理速度。如果变量在宏定义中被定义,则该变量只在该宏定义体中有效。,6.3.3 汇编代码控制伪操作,3.MACRO宏定义伪操作例6-30(验证)在ARM和Thumb代码中,测试并跳转操作需要执行两条ARM指令。可以定义一个与下面类似的宏来实现相应的操作:MACRO$label TestAndBranch$dest,$reg,$cc$label CMP$reg,#0B$cc$destMEND,6.3.3 汇编代码控制伪操作,3.MACRO宏定义伪操作例6-30(续)宏调用:test TestAndBranch NonZero,R0,NE.NonZero替换后将变成:testCMP R0,#0BNE

19、 NonZeroNonZero,6.3.4 汇编信息报告控制伪操作,信息报告伪操作用于程序汇编指示,主要是在程序调试阶段使用。这类伪操作分为错误信息报告伪操作、诊断信息报告伪操作、列表选项设置伪操作、插入文件标题伪操作,6.3.4 汇编信息报告控制伪操作,1、错误信息报告ASSERT 语法格式:ASSERT logical_expression其中:logical_expression用于表示的条件的逻辑表达式。功能:用于保证源程序被汇编时满足相关的条件。如果汇编时逻辑表达式logical_expression不成立,ASSERT将报告错误信息。,6.3.4 汇编信息报告控制伪操作,2、诊断信

20、息报告INFOINFO numeric_expression,string_expression其中:numeric_expression数字表达式。如果numeric_expression为0,则在第二遍扫描时,伪操作打印string_expression的内容;如果numeric_expression的值不为0,则在汇编处理中,第一遍扫描时,伪操作打印string-expression的内容,并终止汇编。,6.3.4 汇编信息报告控制伪操作,3、列表选项设置OPT OPT为编译列表选项设置伪操作,用于在源程序中设置汇编列表选项。语法格式:OPT n其中:n是OPT 指令设置选项编号。教材中

21、表6-5列出了有效的选项编号及其含义。,6.3.4 汇编信息报告控制伪操作,4、插入文件标题伪操作TTL与SUBT语法格式:TTL titleSUBT subtitle其中:title 为所插入的列表文件的标题;subtitle为所插入的列表文件的子标题。功能:TTL/SUBT在列表文件显示一个标题/子标题。如果要在列表文件的第一页显示标题/子标题,TTL/SUBT要放在源程序的第一行。,6.3.5 指令集类型标识伪操作,指令集类型标识伪操作用来告诉编译器所处理的是32位的ARM指令还是16的Thumb指令,实现这一操作的操作符有ARM、CODE32、THUMB、CODE16,指令集类型标识伪

22、操作,6.3.5 指令集类型标识伪操作,例:AREA ARMThumb,CODE,READONLYENTRYCODE32startADR R0,into_thumb+1BX R0,CODE16into_thumbMOVS R0,#10,6.3.6 文件包含伪操作,文件包含伪操作包括两类:一类是将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理;另一类是也将一个源文件包含到当前源文件中,但被包含文件不进行汇编处理。,6.3.6 文件包含伪操作,1.文件包含GET 或 INCLUDE语法格式:GET filenameINCLUDE filename其中:filename 是要

23、在汇编中包含的文件名称。汇编程序接受 UNIX 或 MS-DOS格式的路径名。功能:将一个源文件包含到当前源文件并进行汇编处理。例:AREA Example,CODE,READONLYGET include_s.sGET d:testinclude_s.s,6.3.6 文件包含伪操作,2、文件原样包含INCBIN 语法格式:INCBIN filename其中:filename 是要在汇编中包含的文件名称。汇编程序接受 UNIX 或 MS-DOS格式的路径名。功能:将一个文件包含到当前源文件中,该文件按原样包含,不进行汇编处理。通常用于将目标文件或数据文件包含到当前源文件中。例:INCBIN a

24、1.datINCBIN a2.o,6.3.7 其他类型伪操作,对齐方式设置ALIGN段属性定义伪操作AREA 源程序结尾标识END 声明程序的入口点ENTRY 定义常量或标号名称EQU 声明全局标号EXPORT或GLOBAL 将符号导出到目标文件EXPORTAS 外部符号声明IMPORT 和 EXTERN 保留局部符号KEEP 禁止使用浮点指令NOFP 指定段的相关性REQUIRE 堆栈八字节对齐REQUIRE8 和 PRESERVE8 局部变量范围定义ROUT,6.3.7 其他类型伪操作,1.对齐方式设置ALIGN 对齐方式设置ALIGN 伪操作通过用零或 NOP 指令进行填充来使当前位置与

25、指定的边界对齐。语法格式:ALIGN expr,offset,pad,padsize expr:用于指定对齐方式,值为2的n次幂,0n 31;offset:表示偏移量,可以是任何数值表达式;pad:数值表达式,用于对齐时填充的内容;padsize:可以为1、2、4,用于指定pad的类型(字节/半字/字),6.3.7 其他类型伪操作,1.对齐方式设置ALIGN 使用场景:ADR伪指令用于Thumb代码时只能加载字对齐的地址,但Thumb代码内的标签可能不是字对齐的,此时须使用ALIGN 4来保证代码内地址为4字节对齐;使用ALIGN可确保ARM处理器高速缓存的使用效率。例如使用ALIGN 16来

26、确保在16字节边界上对齐函数入口点;LDRD和STRD双字数据传送必须是8字节对齐的,此时就在内存分配指令(如DCQ)前使用ALIGN 8.,6.3.7 其他类型伪操作,2.段属性定义伪操作AREA 汇编程序采用分段设计,段属性定义伪操作AREA用于定义一个代码段或数据段,AREA 伪操作指示汇编器汇编新的代码段或数据段。段是不可分的已命名独立代码或数据块,它们由链接器处理。语法格式:AREA sectionname,attr,attr.,6.3.7 其他类型伪操作,2.段属性定义伪操作AREA sectionname:段名。如果以数字开始必须包含在“|”内;attr:段属性,常用的选项如下:

27、1)ALIGN=expr:规定段为2expr字节对齐,取值231;2)CODE:指定该段为代码段,此时READONLY为默认属性;3)DATA:定义数据段,默认属性为READWRITE;4)READONLY:指定该段只读;5)READWRITE:指定该段可读可写。,6.3.7 其他类型伪操作,2.段属性定义伪操作AREA 注意事项:一组汇编代码必须有一个AREA指令;可以在多个AREA指令中使用相同的名称,名称相同的所有区域都放在相同的ELF段中。通常对代码和数据使用不同的ELF段。,6.3.7 其他类型伪操作,3、源程序结尾标识ENDEND 伪操作通知汇编程序它已到达源文件的末尾。语法格式:

28、END,6.3.7 其他类型伪操作,4、声明程序的入口点ENTRY ENTRY 伪操作声明程序的入口点。语法格式:ENTRY注意:必须为一个程序指定至少一个ENTRY点;一个源文件内不能使用多个ENTRY指令;并非每个源文件都必须包含ENTRY指令。例:AREA ARMex,CODE,READONLYENTRYMOV R0,#1,6.3.7 其他类型伪操作,5、定义常量或标号名称EQU 功能:为数值常量、标号指定一个符号名称。语法格式:name EQU expr,type其中:name:是要为数值指定的符号名称。expr:可以是一个寄存器相对的地址、程序相对的地址、绝对地址或 32 位整型常数

29、。type:可选项,值为CODE32或CODE16,仅当expr为绝对地址时使用。,6.3.7 其他类型伪操作,5、定义常量或标号名称EQU 例:Sub1EQU 0 x100TestEQU label+8IRQ_vEQU 0 x18,CODE32,6.3.7 其他类型伪操作,6.声明全局标号EXPORT或GLOBAL EXPORT 指令声明一个全局的符号,可由链接器用于解析不同的对象和库文件中的符号引用。GLOBAL 是 EXPORT 的同义词。语法格式:EXPORT symbol WEAK,attrGLOBAL symbol WEAK,attrWEAK 用于声明其他的同名标号优先该标号被引用

30、。attr 规定当源代码链接到动态组件中时符号的可见性,取值为 DYNAMIC/PROTECTED/HIDDEN,6.3.7 其他类型伪操作,8、外部符号声明IMPORT 和 EXTERN 语法格式:IMPORT symbol attrIMPORT symbol WEAK,attrEXTERN symbol attrEXTERN symbol WEAK,attr功能:为汇编程序提供未在当前文件中定义的符号。IMPORT将导入符号,不管该名称在当前汇编中是否被引用;EXTERN仅导入在当前汇编中引用的名称。,6.3.7 其他类型伪操作,13.局部变量范围定义ROUT 标记局部变量的作用域范围。使用ROUT指令可限制局部标签的作用域。语法格式:name ROUT其中:name 是要分配给作用域的名称。,6.3.7 其他类型伪操作,13.局部变量范围定义ROUT 例:Rout_test ROUT1Rout_test2Rout_testB%1Rout_testB%2Rout_testother_rout ROUTB%1Rout_test,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 教案课件

copyright@ 2008-2023 wnwk.com网站版权所有

经营许可证编号:蜀ICP备2023000928号