page2019/8/1计算机学院1第4章ARM7TDMI汇编语言程序设计page计算机学院22019/8/1第4章汇编语言程序设计1.汇编语言的基本概念2.ARM汇编程序的组成与结构3.汇编语言程序设计的基本方法4.汇编语言和C语言交叉编程page计算机学院32019/8/14.1汇编语言的基本概念程序设计语言是专门为计算机编程所配置的语言。它们按照形式与功能的不同可分为三种,即机器语言、汇编语言和高级语言。1机器语言机器语言(MachineLanguage)是由0和1二进制代码书写和存储的指令与数据。它的特点是能被机器直接识别与执行;程序所占内存空间较少。其缺点是难认、难记、难编、易错。page计算机学院42019/8/12汇编语言汇编语言(AssemblyLanguage)是一种面向物理层操作的计算机语言,是一种采用助记符表示的程序设计语言,使用助记符来表示指令的操作码和操作数,用标号或符号代表地址、常量或变量。汇编语言源程序汇编程序目标程序从机器角度看:汇编语言是一种面向物理层操作的计算机语言。不同的处理器类型,具有不同的汇编语言。使用汇编语言编写程序能够直接利用硬件系统的特性(如寄存器、标志、中断系统等),可直接对位、字节、字寄存器或存储单元、I/O端口进行处理,同时也能直接使用CPU指令系统提供的各种寻址方式,编制出高质量的程序,这样的程序不但占用内存空间少,而且执行速度快。page计算机学院52019/8/13高级语言高级语言(HighLevelLanguage)是脱离具体机器(即独立于机器)的通用语言,不依赖于特定计算机的结构与指令系统。用高级语言编写的源程序编译或解释程序目标程序page计算机学院62019/8/1第4章汇编语言程序设计1.汇编语言的基本概念2.ARM汇编程序的组成与结构3.汇编语言程序设计的基本方法4.汇编语言和C语言交叉编程page计算机学院72019/8/14.2ARM汇编程序的组成与结构;文件名:TEST1.S;功能:实现字符串拷贝功能;说明:使用ARMulate软件仿真调试AREAExample1,CODE,READONLY;声明代码段Example1numEQU20;设置拷贝字的个数ENTRY;标识程序入口CODE32;声明32位ARM指令STARTLDRR0,=src;R0指向源数据块LDRR1,=dst;R1指向目的数据块MOVR2,#num;R2需要拷贝的数据个数wordcopyLDRR3,[R0],#4;从源数据块中取一个字,放入R3中,;R0=R0+4STRR3,[R1],#4;将R3中的数据存入R1指向的存储;单元中,R1=R1+4SUBSR2,R2,#1;R2计数器减1BNEwordcopy;如果R2不为0,则转向wordcopy处使用“;”进行注释标号顶格写程序代码段page计算机学院82019/8/1stopMOVR0,#0x18;程序运行结束返回编译器调试环境LDRR1,=0x20026SWI0x123456AREABlockData,DATA,READWRITE;数据段的名字BlockDataSrcDCD1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4DstDCD0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0AREA|.extra|,NOINIT,READWRITE;未初始数据段的名字.extradataSPACE1024END;文件结束声明文件结束page计算机学院92019/8/14.2.1汇编语言程序格式汇编语言形式汇编语言源程序的组成汇编语言程序中常用的符号汇编语言程序中的表达式和运算符page计算机学院102019/8/1汇编语言形式page计算机学院112019/8/1汇编语言程序中常用的符号在汇编语言程序设计中,经常使用各种符号表示变量、常量和地址组成:符号由大小写字母、数字以及下划线组成。大小写:符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。唯一性:符号在其作用范围内必须唯一,即在其作用范围内不可有同名的符号。自定义的符号名不能与系统的保留字相同。不能同名:符号名不应与指令或伪指令同名。page计算机学院122019/8/11.程序中的变量变量的类型:数值变量逻辑变量字符串变量作用范围:全局变量局部变量page计算机学院132019/8/12.程序中的常量ARM(Thumb)汇编程序所支持的常量有数值常量、逻辑常量和字符串常量。数值常量一般为32位的整数,当作为无符号数时,其取值范围为0~232-1;当作为有符号数时,其取值范围为-231~231-1。在ARM汇编语言中,使用EQU来定义数值常量。数值常量一经定义,其数值就不能再修改。page计算机学院142019/8/1数值常量有下列表示方式:十进制数:可以直接表达如:1、2、345。十六进制数:有两种表达方法,使用前缀0x,如0x003、0x001C,或使用前缀&,如&10F、&134。这两种方法都是等效的。n进制数:形如n_XXX,其中n的范围是2到9,XXX是具体数值。如:8_247表示一个八进制数。ASCII的表示:有些值可以使用ASCII表达,例如:‘A’表达A的ASCII码。指令:MOVR1,#’B’等同于MOVR1,#0x42。page计算机学院152019/8/1逻辑常量只有两种取值情况:{TRUE}和{FALSE},注意带大括号。字符串常量为一个固定的字符串,一般用于程序运行时的信息提示。字符常量由单引号表示,包括C语言中的转义字符,如’\n’。字符串常量用双引号表示,也包括C语言中的转义字符如“abcd\0xc\r”。page计算机学院162019/8/1汇编语言程序中的表达式和运算符数值表达式逻辑表达式字符串表达式表达式中各元素运算次序的优先级如下:括号运算符的优先级最高。相邻的单目运算符的运算顺序为从右到左,单目运算符的优先级高于其它运算符。优先级相同的双目运算符的运算顺序为从左到右。page计算机学院172019/8/1汇编语言的语句格式:[Label]Operation[Operand][;Comment]标号域操作助记符域操作数域注释域例:startMOVR0,#0x3F;将立即数传送到寄存器R0page计算机学院182019/8/1标号域(Label):作用:标号域用来表示指令的地址、变量、过程名、数据的地址和常量。开头:标号是一个自行设计的标识符或名称,语句标号可以是大小写字母混合,通常以字母开头,由字母、数字、下划线等组成。要求:语句标号不能与寄存器名、指令助记符、伪指令(操作)助记符、变量名同名。位置:语句标号必须在一行的开头书写,不能留空格。page计算机学院192019/8/1操作助记符域(Operation):操作助记符域可以为指令、伪操作、宏指令或伪指令的助记符。大小写要求:ARM汇编器对大小写敏感,在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用。位置:所有的指令都不能在行的开头书写,必须在指令的前面有空格,然后再书写指令。格式:指令助记符和后面的操作数或操作寄存器之间必须有空格,不可以在这之间使用逗号。page计算机学院202019/8/1操作数域(Operand):操作数域表示操作的对象,操作数可以是常量、变量、标号、寄存器名或表达式,不同对象之间必须用逗号“,”分开。page计算机学院212019/8/1课堂练习:判断指令格式正误AREAEX3,CODE,READONLYGBLADATADATASETA0x20ADDR0,R1,R2ADDR0,R1,r2addR0,R1,r2AddR0,R1,r2;前面必须有空格;前面必须有空格;DATA变量名前面不能留空格;全部大写,正确;寄存器小写,正确;指令助记符小写,寄存器大写或小写,正确;指令助记符大小写混合,不正确page计算机学院222019/8/14.2.2ARM汇编器的伪操作在汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,其没有相对应的操作码,通常称这些特助指令助记符为伪操作。伪操作仅在汇编过程中起各种准备工作的作用。ARM汇编中伪操作有:•符号定义伪操作•数据定义伪操作•汇编控制伪操作•信息报告伪操作•其它常用的伪操作page计算机学院232019/8/1符号定义伪操作符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种:(1)GBLA、GBLL、GBLS(2)LCLA、LCLL,LCLS(3)SETA、SETL、SETS(4)RLISTpage计算机学院242019/8/1各符号定义伪操作功能说明:GBLA:定义一个全局的数值变量,并初始化为0GBLL:定义一个全局的逻辑变量,并初始化为FGBLS:定义一个全局字符串变量,并初始化为空LCLA:定义一个局部的数值变量,并初始化为0LCLL:定义一个局部的逻辑变量,并初始化为FLCLS:定义一个局部字符串变量,并初始化为空SETA:给一个数值变量赋值;SETL:给一个逻辑变量赋值;SETS:给一个字符串变量赋值;page计算机学院252019/8/1使用示例:GBLAA1;定义一个全局的数值变量,变量名为A1A1SETA0x0F;将该变量赋值为0x0FGBLLA2;定义一个全局的逻辑变量,变量名为A2A2SETL{TRUE};将该变量赋值为真GBLSA3;定义一个全局字符串变量,变量名为A3A3SETS“Testing”;将该变量赋值为“Testing”LCLAT4;声明一个局部的数值变量,变量名为T4T4SETA0xaa;将该变量赋值为0xaapage计算机学院262019/8/1数据定义伪操作DCB:分配一片连续的字节存储单元并初始化DCW(DCWU):分配一片连续的半字存储单元并初始化DCD(DCDU):分配一片连续的字存储单元并初始化DCDO:分配一片按字对齐的字内存单元并初始化DCI:分配一片字或半字对齐内存单元并初始化DCQ(DCQU):分配一片以8字节为单位的连续存储单元并初始化DCFS(DCFSU):为单精度浮点数分配一片连续字存储单元并初始化DCFD(DCFDU):为双精度浮点数分配一片连续字存储单元并初始化SPACE:分配一片连续的存储单元FIELD:定义一个结构化的内存表的数据区MAP:定义一个结构化的内存表首地址LTORG:定义一个数据缓冲区池(literallypool)的开始page计算机学院272019/8/1使用示例:StrDCB“Thisisatest!”;分配一片连续的字节存储单元并初始化。DataTestDCW1,2,3;分配一片连续的半字存储单元并初始化。DataTestDCD4,5,6;分配一片连续的字存储单元并初始化。page计算机学院282019/8/1课堂练习:假设Str的地址为:8008,有如下伪操作,试画出内存中数据的分布示意图。page计算机学院292019/8/1page计算机学院302019/8/1内存中的数据分布图page计算机学院312019/8/14.2.3ARM汇编程序中的数据定义数据定义的目的是为目标系统数学模型的各种抽象数据类型分配存储单元,同时进行初始化。①DCB、DCW和DCD汇编器伪指令stringDCB“HelloWorld!”;分配一片连续的字节存储单元并初始化halfwordDCW1,2,3;分配一片连续的半字存储单元并初始化WordDCD1,2,3;分配一片连续的字存储单元并初始化②SPACE汇编器伪指令DataSPACE1024;分配一片连续的存储区域并初始化为0page计算机学院322019/8/1③LTORG汇编器伪指令LTORG用于声明一个文字池(literalpool),用于