资源预览内容
第1页 / 共115页
第2页 / 共115页
第3页 / 共115页
第4页 / 共115页
第5页 / 共115页
第6页 / 共115页
第7页 / 共115页
第8页 / 共115页
第9页 / 共115页
第10页 / 共115页
亲,该文档总共115页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
ARM嵌入式体系结构与接口技术 第4章 ARM汇编语言程序设计,2,第1章 嵌入式系统基础知识 第2章 ARM技术概述 第3章 ARM的指令系统 第4章 ARM汇编语言程序设计 第5章 ARM Realview MDK集成开发环境 第6章 GPIO编程 第7章 ARM异常中断处理及编程 第8章 串行通信接口,课程安排:,3,第9章 存储器接口 第10章 定时器 第11章 A/D转换器 第12章 LCD接口设计 第13章 温度监测仪开发实例,课程安排:,4,4.1 ARM汇编器支持的伪操作 4.2 ARM汇编器支持的伪指令 4.3 ARM 汇编语言的语句格式 4.4 ARM 汇编语言的程序结构 4.5 汇编语言与C语言的混合编程 4.6 小结 4.7 思考与练习,本章课程:,5,4.1.1 伪操作概述 在ARM汇编语言程序中,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪操作标识符(directive)1,它们所完成的操作称为伪操作。伪操作在源程序中的作用是为了完成汇编程序做各种准备工作的,这些伪操作仅在汇编过程中起作用,一旦汇编结束,伪操作的使命就完成。 在ARM的汇编程序中,伪操作主要有符号定义伪操作、数据定义伪操作、汇编控制伪操作及其杂项伪操作等。,4.1 ARM汇编器支持的伪操作,6,4.1.2 符号定义伪操作 符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种。 (1)用于定义全局变量的GBLA、GBLL和GBLS。 (2)用于定义局部变量的LCLA、LCLL和LCLS。 (3)用于对变量赋值的SETA、SETL和SETS。 (4)为通用寄存器列表定义名称的RLIST。,4.1 ARM汇编器支持的伪操作,7,4.1.2 符号定义伪操作 1全局变量定义伪操作GBLA、GBLL和GBLS (1)语法格式 GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中的全局变量并将其初始化。其中: GBLA伪操作用于定义一个全局的数字变量并初始化为0。 GBLL伪操作用于定义一个全局的逻辑变量并初始化为F(假)。 GBLS伪操作用于定义一个全局的字符串变量并初始化为空。 由于以上3条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。 语法格式如下: 取值为GBLA、GBLL、GBLS三者中的之一 定义的全局变量名,在其作用范围内必须唯一。全局变量的作用范围为包含该变量的源程序,4.1 ARM汇编器支持的伪操作,8,全局变量定义伪操作GBLA、GBLL和GBLS (2)使用说明,如果用这些伪操作重新声明已经声明过的变量,变量的值将被初始化成后一次声明语句中的值。 (3)示例 使用伪操作声明全局变量。GBLA Test1 ;定义一个全局的数字变量,变量名为Test1Test1 SETA 0xaa ;将该变量赋值为0xaaGBLL Test2 ;定义一个全局的逻辑变量,变量名为Test2Test2 SETL TRUE ;将该变量赋值为真GBLS Test3 ;定义一个全局的字符串变量,变量名为Test3Test3 SETS “Testing“ ;将该变量赋值为“Testing” 声明变量Objectsize并设置其值为0xff,为“SPACE”操作做准备。GBLA objectsize Objectsize SETA oxffSPACE objectsize 下面的例子显示如何使用汇编命令设置变量的值。具体做法是使用“pd”选项Armasm pd “objectsize SETA oxff“ o objectfile sourcefile,4.1 ARM汇编器支持的伪操作,9,4.1.2 符号定义伪操作 2局部变量定义伪操作LCLA、LCLL和LCLS (1)语法格式 LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量并将其初始化。其中: LCLA伪操作用于定义一个局部的数字变量并初始化为0。 LCLL伪操作用于定义一个局部的逻辑变量并初始化为F(假) LCLS伪操作用于定义一个局部的字符串变量并初始化为空。 以上3条伪操作用于声明局部变量,在其作用范围内变量名必须唯一。 语法格式如下: 取值为LCLA、LCLL、LCLS三者中的之一。 所定义的局部变量名,在其作用范围内必须唯一。局部变量作用范围为包含该局部变量的宏。,4.1 ARM汇编器支持的伪操作,10,局部变量定义伪操作LCLA、LCLL和LCLS (2)使用说明,如果用这些伪操作重新声明已经声明过的变量,则变量的值将被初始化成后一次声明语句中的值。 (3)示例 使用伪操作声明局部变量。LCLA Test4 ;声明一个局部的数字变量,变量名为Test4Test3 SETA 0xaa ;将该变量赋值为0xaaLCLL Test5 ;声明一个局部的逻辑变量,变量名为Test5Test4 SETL TRUE ;将该变量赋值为真LCLS Test6 ;定义一个局部的字符串变量,变量名为Test6Test6 SETS “Testing“ ;将该变量赋值为“Testing” 下面的例子定义一个宏,显示了局部变量的作用范围。MACRO ;声明一个宏 $label message $a ;宏原型LCLS err ;声明局部字符串变量 $labelINFO 0,“err“:CC:STR:$aMEND ;宏结束,局部变量不再起作用,4.1 ARM汇编器支持的伪操作,11,4.1.2 符号定义伪操作 3变量赋值伪操作SETA、SETL和SETS (1)语法格式 伪指令SETA、SETL和SETS用于给一个已经定义的全局变量或局部变量赋值。 SETA伪操作用于给一个数学变量赋值。 SETL伪操作用于给一个逻辑变量赋值。 SETS伪操作用于给一个字符串变量赋值。 语法格式如下: Variable expr Variable 变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。 取值为SETA、SETL、SETS三者中的之一。 expr 数学、逻辑或字符串表达式,也就是将要赋予变量的值。,4.1 ARM汇编器支持的伪操作,12,变量赋值伪操作SETA、SETL和SETS (2)使用说明,在向变量赋值前必须先声明变量。也可以在汇编指令中预定义变量,如:“Armasm -pd “objectsize SETA oxff“ -o objectfile sourcefile“ (3)示例 为预先定义的变量赋值。LCLA Test3 ;声明一个局部的数字变量,变量名为Test3Test3 SETA 0xaa ;将该变量赋值为0xaaLCLL Test4 ;声明一个局部的逻辑变量,变量名为Test4Test4 SETL TRUE ;将该变量赋值为真LCLS Test6 ;定义一个局部的字符串变量,变量名为Test6Test6 SETS “Testing“ ;将该变量赋值为“Testing” 使用变量赋值伪操作,定义一些程序相关内容。GBLA versionNumberVersionNumber SETA 21GBLL DebugDebug SETL TRUEGBLS versionStringVersionString SETS “version 1.0“,4.1 ARM汇编器支持的伪操作,13,4.1.2 符号定义伪操作 4通用寄存器列表定义伪操作RLIST (1)语法格式 RLIST伪操作可用于对一个通用寄存器列表定义名称,使用该伪操作定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序根据寄存器的编号由低到高,与列表中的寄存器排列次序无关。 语法格式如下: Name RLIST list-of-registers Name 寄存器列表的名称。 list-of-registers 通用寄存器列表。列表中的寄存器用“,”隔开,如果是编号连续的通用寄存器可以用“”指定寄存器范围。具体用法参见程序示例。,4.1 ARM汇编器支持的伪操作,14,通用寄存器列表定义伪操作RLIST (2)使用说明 在使用ARM汇编编译器编译源文件时,可以使用“checkreg”选项来指定汇编器进行寄存器检查。如果汇编器检测到寄存器列表中的寄存器编号非升序排列,将给出编译警告。 (3)示例 将寄存器列表名称定义为RegList,可在ARM指令LDM/STM中通过该名称访问寄存器列表。 RegList RLIST R0-R5,R8,R10 使用“”在寄存器列表中,指定寄存器范围。 Context RLIST R0-R6,R8,R10-R12,R15,4.1 ARM汇编器支持的伪操作,15,4.1.3 数据定义(Data Definition)伪操作 数据定义伪操作一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪操作有如下几种。 (1)DCB用于分配一片连续的字节存储单元并用指定的数据初始化 (2)DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化 (3)DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化 (4)DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化 (5)DCFS(DCFSU)用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化 (6)DCQ(DCQU)用于分配一片以8字节为单位的连续的存储单元并用指定的数据初始化 (7)SPACE用于分配一片连续的存储单元 (8)MAP用于定义一个结构化的内存表首地址 (9)FIELD用于定义一个结构化的内存表的数据域,4.1 ARM汇编器支持的伪操作,16,4.1.3 数据定义(Data Definition)伪操作 1DCB (1)语法格式 DCB伪操作用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为数字或字符串。DCB也可用“=”代替。 语法格式如下。 label DCB expr,expr label,程序标号。 expr,可以是128255的数字,也可以是字符串。 (2)使用说明 在使用DCB伪操作时,其后常跟ALIGN伪操作以保证内存地址对齐。 (3)示例 分配一片连续的字节存储单元并初始化为指定字符串。 Str DCB “This is a test!“ 与C中的字符串不同,ARM汇编中的字符串不以null结尾,下面指令以ARM汇编形成一个C语言风格的字符串。 C_string DCB “C_string“,0,4.1 ARM汇编器支持的伪操作,17,4.1.3 数据定义(Data Definition)伪操作 2DCW(DCWU) (1)语法格式 DCW(或DCWU)伪操作用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格半字对齐。 语法格式:label DCW expr,expr label,程序标号,可选。 expr,数字表达式,取值范围为3276865525。 (2)使用说明,DCW可能在分配的内存单元前加一个字节以保证内存半字对齐。当程序对内存对齐方式要求不严格时可以是DCWU伪操作。 (3)示例 分配一片连续的半字存储单元并初始化。 DataTest DCW 1,2,3 在指定内存单元初始值时可以使用已定义的变量。 Data DCW-255,2*numberDCWU number+4,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号