书签 分享 收藏 举报 版权申诉 / 167
上传文档赚钱

类型《汇编语言程序设计 -基于ARM体系结构》课件第4章ARM汇编语言程序设计1.ppt

  • 上传人(卖家):momomo
  • 文档编号:5716757
  • 上传时间:2023-05-05
  • 格式:PPT
  • 页数:167
  • 大小:699.50KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《《汇编语言程序设计 -基于ARM体系结构》课件第4章ARM汇编语言程序设计1.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    汇编语言程序设计 基于ARM体系结构 汇编语言程序设计 基于ARM体系结构课件第4章ARM汇编语言程序设计1 汇编语言 程序设计 基于 ARM 体系结构 课件
    资源描述:

    1、教学目的掌握汇编语言程序的基本结构掌握汇编语言程序的上机过程 掌握ARM汇编器的伪操作掌握ARM汇编程序和C语言程序的交互教学内容 4.1汇编语言程序格式 4.2 ARM汇编器的伪操作 4.3汇编语言程序的上机过程 4.4汇编语言程序设计 4.5工作模式切换编程 4.6 ATPCS介绍 4.7 ARM和Thumb混合编程 4.8汇编语言和C语言交互编程4.1汇编语言程序格式 4.1.1汇编语言的基本概念 4.1.2汇编语言源程序的组成 4.1.3汇编语言程序中常用的符号 4.1.4汇编语言程序中的表达式和运算符4.1.1汇编语言的基本概念1机器语言与汇编语言 计算机程序由指令序列组成。计算机通

    2、过对每条指令的译 码和执行来完成相应的操作。指令必须以二进制代码的形 式存放在内存中,才能够被计算机所识别和理解,并加以 执行。由二进制代码表示的指令称为机器指令,相应的 程序称为机器语言程序。机器语言程序由0、1二进制代码组成,不便于编程和记 忆。由此产生了用指令助记符表示的汇编语言指令,对应 的程序称为汇编语言程序。例 4.1 以下指令序列完成两个128位二进制数的加法,第一个数由高到低存放在寄存器R7R4,第二个数由高到低存放在寄存器R11R8,运算结果由高到低存放在寄存器R3R0:ADDS R0,R4,R8 ;加低端的字 ADCS R1,R5,R9 ;加第二个字,带进位 ADCS R2

    3、,R6,R10 ;加第三个字,带进位 ADC R3,R7,R11 ;加第四个字,带进位 对例4.1程序进行汇编以后,得到ARM汇编指令对 应的机器代码(用十六进制数表示),如表4-1所示。在表中,第一列表示机器代码存放的内存地址,该地址与机器所处环境有关;第二列表示ARM机器代码,每条指令的机器代码由32位组成;第三列表示汇编指令,由指令助记符和操作数组成。指令前可能有标号,表示该指令第一个字节所在的地址。2汇编语言与高级语言 汇编语言是一种依赖于计算机微处理器的语言,每种机器 都有它专用的汇编语言(如ARM与8051单片机的汇编语言 是不相同的),故汇编语言一般不具有通用性和可移植性。由于进

    4、行汇编语言程序设计必须熟悉机器的硬件资源和软 件资源,因此具有较大的难度和复杂性。高级语言,如BASIC,FORTRAN,C语言等是面向过程的语 言,不依赖于机器,因而具有很好的通用性和可移植性,并且具有很高的程序设计效率,便于开发复杂庞大的软件 系统。4.1.2汇编语言源程序的组成1汇编语言源程序的结构 例 4.2 以下是一个汇编语言源程序的基本结构:AREA Init,CODE,READONLY ENTRY Start LDR R0,=0 x3FF5000 LDR R1,0 xFF STR R1,R0 LDR R0,=0 x3FF5008 LDR R1,0 x01 STRR1,R0 END

    5、 在ARM(Thumb)汇编语言程序中,以程序段为单位组织代码。段是相对独立的指令或数据序列,具有特定的名称。段可以分为代码段、数据段和通用段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。在汇编语言程序中,用AREA伪操作定义一个段,并说明 所定义段的相关属性。如:代码段的默认属性为 READONLY,数据段的默认属性为READWRITE。一个汇编程序至少应该有一个代码段 本例定义一个名为Init的代码段,属性为 READONLY。ENTRY伪操作标识程序的入口点,一个 ARM程序中可以有多个ENTRY,至少要有一个ENTRY。接 下来为指令序列,程序的末尾为END伪操作,该伪

    6、操作告 诉编译器源文件的结束,每一个汇编程序段都必须有一条 END伪操作,指示代码段的结束。当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译连接时最终形成一个可执行的映象文件。可执行映象文件通常由以下几部分构成:一个或多个代码段,代码段的属性为只读。零个或多个包含初始化数据的数据段,数据段的属性为可读写。零个或多个不包含初始化数据的数据段,数据段的属性为可读写。连接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。因此源程序中段之间的相对位置与可执行的映象文件中段的相对位置一般不会相同。一个典型的映象文件的结构如图4-1所示。图4-1 映象文件的结构2汇编语言的语句

    7、格式 ARM汇编语言程序的每行语句由14个部分组成。格式如下:LABEL OPERATION OPERAND ;COMMENT 标号域 操作助记符域 操作数域 注释域 (1)标号域(Label)标号域用来表示指令的地址、变量、过程名、数据的地址和常量。标号是一个自行设计的标识符或名称,语句标号可以是大小写字母混合,通常以字母开头,由字母、数字、下划线等组成。语句标号不能与寄存器名、指令助记符、伪指令(操作)助记符、变量名同名。语句标号必须在一行的开头书写,不能留空格。(2)操作助记符域(OPERATION)操作助记符域可以为指令、伪操作、宏指令或伪指令的助记符。ARM汇编器对大小写敏感,在汇编

    8、语言程序设计中,每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用。所有的指令都不能在行的开头书写,必须在指令的前面有空格,然后再书写指令。指令助记符和后面的操作数或操作寄存器之间必须有空格,不可以在这之间使用逗号。伪操作是ARM汇编语言程序里的一些特殊助记符,其作用 主要是为完成汇编程序做的各种准备工作,在源程序进行 汇编时由汇编程序处理,而不是程序运行期间由机器执行。宏指令是一段独立的程序代码,可插在源程序中,它通过 伪操作来定义。宏在使用之前必须提前定义好,宏之间可 互相调用,也可递归调用。通过直接书写宏名来使用宏,并根据宏指令的格式设置相 应的输入参数。宏

    9、定义本身不会产生代码,只是在调用它 时把宏体插入到源程序中。调用宏时通过实际的指令来代 替宏体实现相关的一段代码。伪指令是ARM汇编语言程序里的特殊指令助记符,也不在程序运行期间由机器执行。它们在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。(3)操作数域(OPERAND)操作数域表示操作的对象,操作数可以是常量、变量、标号、寄存器名或表达式,不同对象之间必须用逗号“,”分开。(4)注释域(COMMENT)注释域用来说明语句的功能,以“;”开始。汇编程序对“;”以后的部分不予汇编。例 4.3 指令和伪操作书写格式的举例 AREA EX4_3,CODE,READO

    10、NLY;前面必须有空格 GBLA DATA ;前面必须有空格 DATA SETA 0 x20 ;DATA变量名前面不能留空格 ADD R0,R1,R2 ;全部大写,正确 ADD R0,R1,r2 ;寄存器小写,正确 add R0,R1,r2 ;指令助记符小写,寄存器大写或小写,正确 Add R0,R1,r2 ;寄存器小写,正确;指令助记符大小写混合,不正确4.1.3汇编语言程序中常用的符号 在汇编语言程序设计中,经常使用各种符号表示变量、常量和地址等,以增加程序的可读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定:符号由大小写字母、数字以及下划线组成。符号区分大小写,同名的

    11、大、小写符号会被编译器认为是两个不同的符号。符号在其作用范围内必须唯一,即在其作用范围内不可有同名的符号。自定义的符号名不能与系统的保留字相同。符号名不应与指令或伪指令同名。1程序中的变量 程序中的变量是指其值在程序的运行过程中可以改变的量。通过定义变量可以简化程序的表达,增强程序的可读性,方便对程序进行修改,便于交流和记忆。同时编译程序会自动安排变量的存储空间,程序设计工程师可以不必去关心存储空间的安排,因此一个好的程序设计工程师应该要恰当地使用变量。ARM(Thumb)汇编程序所支持的变量有数值变量、逻辑变量和字符串变量。在ARM(Thumb)汇编语言程序设计中,可使用GBLA、GBLL、

    12、GBLS伪操作声明全局变量,使用LCLA、LCLL、LCLS伪操作声明局部变量,并可使用SETA、SETL和 SETS对其进行初始化。数值变量用于在程序的运行中保存数值值,但注意数值值 的大小不应超出一个32位数所能表示的范围。全局数值变 量使用伪操作GBLA定义,局部数值变量使用伪操作LCLA 定义。数值变量使用SETA赋值。逻辑变量用于在程序的运行中保存逻辑值,逻辑值只有两 种取值情况:真(TRUE)或假(FALSE)。全局逻辑变量 使用伪操作GBLL定义,局部逻辑变量使用伪操作LCLL定 义。逻辑变量使用SETL赋值 字符串变量用于在程序的运行中保存一个字符串,但注意 字符串的长度不应超

    13、出512字节,最小长度为0。全局字符 变量使用伪操作GBLS定义,局部字符变量使用伪操作 LCLS定义。字符变量使用SETS赋值。2程序中的常量 程序中的常量是指其值在程序的运行过程中不能被改变的量。ARM(Thumb)汇编程序所支持的常量有数值常量、逻辑常量和字符串常量。数值常量一般为32位的整数,当作为无符号数时,其取值范围为0232-1,当作为有符号数时,其取值范围 为-231231-1。在ARM汇编语言中,使用EQU来定义数 值常量。数值常量一经定义,其数值就不能再修改。数值常量有下列表示方式:十进制数:在表达式中可以直接表达。如1、2、345。十六进制数:有两种表达方法:使用前缀0

    14、x,如0 x003、0 x001C,或使用前缀&,如&10F、&134。这两种方法都 是等效的。n进制数:形如n_XXX,其中n的范围是2到9,XXX是具体数值。如:8_247表示一个八进制数。ASCII的表示:有些值可以使用ASCII表达,例如:A表达A的ASCII码。指令:MOV R1,#B 等同于 MOV R1,#0 x42。逻辑常量只有两种取值情况:TRUE和FALSE,注意带大括号。字符串常量为一个固定的字符串,一般用于程序运行时的信息提示。字符常量由单引号表示,包括C语言中的转义字符,如n。字符串常量用双引号表示,也包括C语言中的转义字符如“abcd0 xcr”。3汇编时变量代换

    15、如果在字符串变量前面有一个代换操作符“$”,编译器会将该字符串变量的值代换“$”后的字符串变量。例 4.4 字符串变量代换的例子:LCLS str1 ;定义局部字符串变量str1和str2 LCLS str2 str1 SETS“pen”;str1赋值 str2 SETS“It is a$str1”;str2赋值 则在汇编后,str2的值为“It is a pen”。如果在数值变量前面有一个代换操作符“$”,编译器 会将该数值变量的值转换为十六进制的字符串,并将该十 六进制的字符串代换“$”后的数值变量。例 4.5 数值变量代换的例子:a1 SETA 12 str1 SETS“The numb

    16、er is$a1”则汇编后str1的值为“The number is 0000000C”。如果在逻辑变量前面有一个代换操作符“$”,编译器 会将该逻辑变量代换为它的取值(真或假)。4.1.4汇编语言程序中的表达式和运算符 在汇编语言程序设计中,也经常使用各种表达式,表达式一般由 变量、常量、运算符和括号构成。常用的表达式有数值表达式、逻辑 表达式和字符串表达式。1数值表达式及运算符 数值表达式一般由数值常量、数值变量、数值运算符和括号构成。与数值表达式相关的运算符有:(1)算术运算符 算术运算符包括:“”、“”、“”、“/”及“MOD”等,他们分别 代表加、减、乘、除和取余数运算。例如,以X和

    17、Y表示两个数值表 达式,则:XY 表示X与Y的和。XY 表示X与Y的差。XY 表示X与Y的乘积。X/Y 表示X除以Y的商。X:MOD:Y 表示X除以Y的余数。(2)移位运算 移位运算包括:“ROL”、“ROR”、“SHL”及“SHR”等。移位运算符以X和Y表示两个数值表达式,以上的移 位运算符代表的运算如下:X:ROL:Y 表示将X循环左移Y位。X:ROR:Y 表示将X循环右移Y位。X:SHL:Y 表示将X左移Y位。X:SHR:Y 表示将X右移Y位。(3)位逻辑运算符 位逻辑运算符包括:“AND”、“OR”、“NOT”及“EOR”运算。按以X和Y表示两个数值表达式,按位逻辑运算符代表的运算如下

    18、:X:AND:Y 表示将X和Y按位作逻辑与操作。X:OR:Y 表示将X和Y按位作逻辑或操作。:NOT:Y 表示将Y按位作逻辑非操作。X:EOR:Y 表示将X和Y按位作逻辑异或操作。例 4.6 数值表达式应用举例,下列指令汇编的结果是什么?MOV R5,#0 x20:MOD:0 x04 ADD R4,R5,#0 x20+0 x20/4-8 MOV R4,#OxFF000000:AND:0 x55000000 分析:以上指令汇编后分别等价于如下指令:MOV R5,#0 ADD R4,R5,#0 x20 MOV R4,#0 x550000002逻辑表达式及运算符 逻辑表达式一般由逻辑量、逻辑操作符、

    19、关系操作符 和括号构成,其表达式的运算结果为真TRUE或假 FALSE。与逻辑表达式相关的运算符如下:(1)关系操作符 关系操作符用于表示两个同类表达式之间的关系。关 系操作符和它的两个操作数组成一个逻辑表达式,其取值为 TRUE或FALSE.关系操作符包括:“=”、“”、“=”、“=”、“/=”、“”运算符。以X和Y表示两个逻辑表达式,以上的运算符代表的运算如下:X=Y 表示X等于Y。X Y 表示X大于Y。X=Y 表示X大于等于Y。X=Y 表示X小于等于Y。X/=Y 表示X不等于Y。X Y 表示X不等于Y。(2)逻辑操作符 逻辑操作符进行两个逻辑表达式之间的基本逻辑操作。操作结果为TRUE或

    20、FALSE,逻辑操作符包括:“LAND”、“LOR”、“LNOT”及“LEOR”运算符。以X和Y表示两个逻辑表达式,以上的逻辑运算符代表的运算如下:X:LAND:Y 表示将X和Y 作逻辑与操作。X:LOR:Y 表示将X和Y作逻辑或操作。:LNOT:Y 表示将Y作逻辑非操作。X:LEOR:Y 表示将X和Y作逻辑异或操作。3.字符串表达式及运算符 字符串表达式一般由字符串常量、字符串变量、运算符 和括号构成。字符串最小长度为0,最大长度为512字节。与字符串表达式相关的运算符如下:(1)LEN运算符 LEN运算符返回字符串的长度(字符数),以X表示字符串表达式,其语法格式如下:LEN:X 其中,X

    21、为字符串变量。(2)CHR运算符 CHR运算符将0255之间的整数转换为一个含ASCII字符的字 符串。当有些ASCII字符不方便放在字符串中时,可以使用CHR将其放 在字符串表达式中。以M表示某一个整数,其语法格式如下:CHR:M 其中,M为某一字符的ASCII值。(3)STR运算符 STR运算符将一个数值表达式或逻辑表达式转换为一个字符串。对于数值表达式,STR运算符将其转换为一个以十六进制组成的字符串;对于逻辑表达式,STR运算符将其转换为字符串T或F,其语法格式如下:STR:X 其中,X为一个数值表达式或逻辑表达式。(4)LEFT运算符 LEFT运算符返回某个字符串左端的一个子串,其语

    22、法格式如下:X:LEFT:Y 其中:X为源字符串,Y为一个整数,表示要返回的字符个数。(5)RIGHT运算符 与LEFT运算符相对应,RIGHT运算符返回某个字符串右端的一个子串,其语法格式如下:X:RIGHT:Y 其中:X为源字符串,Y为一个整数,表示要返回的字符个数。(6)CC运算符 CC运算符用于将两个字符串连接成一个字符串,其语法格式如下:X:CC:Y 其中:X为源字符串1,Y为源字符串2,CC运算符将Y连接到X的后面。4.基于寄存器和程序计数器(PC)的表达式基于PC的表达 式表示了PC寄存器的值加上(或减去)一个数值表达式。基于PC的表达式通常由程序中的标号与一个数值表达 式组成。

    23、相关的操作符包括:(1)BASE运算符 BASE运算符返回基于寄存器的表达式中寄存器的编号,其语法格式如下:BASE:X 其中,X为与寄存器相关的表达式。(2)INDEX运算符 INDEX运算符返回基于寄存器的表达式中相对于其基址寄存器的偏移量,其语法格式如下:INDEX:X 其中,X为与寄存器相关的表达式。5.其它常用运算符 ARM汇编语言中的操作还有下面一些:(1)?运算符?运算符返回某代码行所生成的可执行代码的长度,例如:?X 返回定义符号X的代码行所生成的可执行代码的字节数。(2)DEF运算符 DEF运算符判断是否定义某个符号,例如:DEF:X 如果符号X已经定义,则结果为TRUE,否

    24、则为FALSE。6.表达式中各元素运算次序的优先级 表达式中各元素运算次序的优先级如下:括号运算符的优先级最高。相邻的单目运算符的运算顺序为从右到左,单目运算符的优先级高于其它运算符。优先级相同的双目运算符的运算顺序为从左到右。4.2 ARM汇编器的伪操作 4.2.1符号定义伪操作 4.2.2数据定义伪操作 4.2.3汇编控制伪操作 4.2.4信息报告伪操作 4.2.5其它常用的伪操作4.2 ARM汇编器的伪操作在ARM汇编语言程序里,有一些特殊指令助记符,这些 助记符与指令系统的助记符不同,没有相对应的操作 码,通常称这些特殊指令助记符为伪操作。伪操作不像机器指令那样在程序运行期间由机器执行

    25、,伪操作在源程序中的作用是为完成汇编程序作各种准备 工作的,这些伪操作仅在汇编过程中起作用,一旦汇编 结束,伪操作的使命就完成。在ARM的汇编程序中,有如下几种伪操作:符号定义(Symbol Definition)伪操作 数据定义(Data Definition)伪操作 汇编控制(Assembly Control)伪操作 框架描述(Frame Description)伪操作 信息报告(Reporting)伪操作 其它(Miscellaneous)伪操作。伪操作一般与编译程序有关,因此ARM汇编语言的伪操作在不同的编译环境下有不同的编写形式和规则。4.2.1符号定义伪操作 符号定义伪操作用于定义

    26、ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种:用于定义全局变量的GBLA、GBLL和GBLS。用于定义局部变量的LCLA、LCLL和LCLS。用于对变量赋值的SETA、SETL、SETS。为通用寄存器列表定义名称的RLIST。1.全局变量声明GBLA、GBLL和GBLS 格 式:GBLA(GBLL或GBLS)全局变量名 功 能:GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中的全局变量,并将其初始化。其中:GBLA伪操作用于定义一个全局的数值变量,并初始化为0;GBLL伪操作用于定义一个全局的逻辑变量,并初始化为F(假);GBLS伪操作

    27、用于定义一个全局的字符串变量,并初始化为空;由于以上三条伪操作用于定义全局变量,因此在整个程序范围内变量名必须唯一。例 4.7 使用示例:GBLA A1 ;定义一个全局的数值变量,变量名为A1 A1 SETA 0 x0F ;将该变量赋值为0 x0F GBLL A2 ;定义一个全局的逻辑变量,变量名为A2 A2 SETL TRUE ;将该变量赋值为真 GBLS A3 ;定义一个全局的字符串变量,变量名为A3 A3 SETS“Testing”;将该变量赋值为“Testing”2.LCLA、LCLL和LCLS 格 式:LCLA(LCLL或LCLS)局部变量名 功 能:LCLA、LCLL和LCLS伪操

    28、作用于定义一个ARM程序中的局部变量,并 将其初始化。其中:LCLA伪操作用于定义一个局部的数值变量,并初始化为0;LCLL伪操作用于定义一个局部的逻辑变量,并初始化为F(假);LCLS伪操作用于定义一个局部的字符串变量,并初始化为空;以上三条伪操作用于声明局部变量,在其作用范围内变量名必须唯一。例 4.8 使用示例:LCLA Test4 ;声明一个局部的数值变量,变量名为Test4 Test4 SETA 0 xaa ;将该变量赋值为0 xaa LCLL Test5 ;声明一个局部的逻辑变量,变量名为Test5 Test5 SETL TRUE ;将该变量赋值为真 LCLS Test6 ;定义一

    29、个局部的字符串变量,变量名为Test6 Test6 SETS “Testing”;将该变量赋值为“Testing”3.SETA、SETL和SETS 格 式:变量名SETA(SETL或SETS)表达式 功 能:伪操作SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值。SETA伪操作用于给一个数值变量赋值;SETL伪操作用于给一个逻辑变量赋值;SETS伪操作用于给一个字符串变量赋值;其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。例 4.9 使用示例:LCLA Test3 ;声明一个局部的数值变量,变量名为Test3 Test3 SETA 0 xaa ;

    30、将该变量赋值为0 xaa LCLL Test4 ;声明一个局部的逻辑变量,变量名为Test4 Test4 SETL TRUE ;将该变量赋值为真 4.RLIST 格 式:名称RLIST寄存器列表 功 能:RLIST伪操作可用于对一个通用寄存器列表定义名称,使用该伪操作定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。例 4.10 使用示例:RegList RLIST R0-R5,R8,R10;将寄存器列表名称定义为RegList,在程序中使用:STMFD SP!,RegList ;存储列表到堆

    31、栈 LDMIA R5,RegList ;加载列表4.2.2数据定义伪操作 数据定义伪操作用于为特定的数据分配存储单元,同时可完成已 分配存储单元的初始化。常见的数据定义伪操作有如下几种:DCB 分配一片连续的字节存储单元并初始化。DCW(DCWU)分配一片连续的半字存储单元并初始化。DCD(DCDU)分配一片连续的字存储单元并初始化。DCDO 分配一片按字对齐的字内存单元,并将每个字单元的内容初始化。DCI分配一片字对齐或半字对齐内存单元并初始化。DCQ(DCQU)分配一片以8字节为单位的连续的存储单元并初始化。DCFS(DCFSU)为单精度浮点数分配一片连续的字存储单元并初始化。DCFD(D

    32、CFDU)为双精度浮点数分配一片连续的字存储单元并初始化。SPACE 分配一片连续的存储单元。FIELD定义一个结构化的内存表的数据域。MAP定义一个结构化的内存表首地址。LTORG定义一个数据缓冲池(literal pool)的开始。1.DCB 格 式:标号DCB 表达式 功 能:DCB伪操作用于分配一片连续的字节存储单元并用伪操作中指定 的表达式初始化。其中,表达式可以为0255的数值或字符串。DCB也可用“=”代替。例 4.11 使用示例:Str DCB“This is a test!”;分配一片连续的字节存储单元并初始化。2.DCW(DCWU)格 式:标号DCW(或DCWU)表达式 功

    33、 能:DCW(或DCWU)伪操作用于分配一片连续的半字存储单元并用 伪操作中指定的表达式初始化。其中,表达式可以为程序标号或 数值表达式。用DCW分配的字存储单元是半字对齐的,而用 DCWU分配的字存储单元并不严格按照半字对齐。例 4.12 使用示例:DataTest DCW 1,2,3;分配一片连续的半字存储单元并初始化。3.DCD(或DCDU)格 式:标号DCD(或DCDU)表达式 功 能:DCD(或DCDU)伪操作用于分配一片连续的字存储单元并用伪操 作中指定的表达式初始化。其中,表达式可以为程序标号或数值表 达式。DCD也可用“&”代替。用DCD分配的字存储单元是字对齐 的,而用DCD

    34、U分配的字存储单元并不严格按照字对齐。例 4.13 使用示例:DataTest DCD 4,5,6;分配一片连续的字存储单元并初始化。4.DCDO 格 式:标号 DCDO表达式 功 能:用于分配一段字对齐的字内存单元,并将每个字单元的内容初始 化为该单元相对于静态基址寄存器R9内容的偏移量。例 4.14 使用示例 KEY1 DCDO START1 ;32位的字单元,其值为标号START1基于R9的偏移量 5.DCI 格 式:标号 DCI表达式 功 能:在ARM代码中,用于分配一段字对齐的字内存 单元,并用表达式将其初始化;在Thumb代码中,用于分配一段半字对齐的半字内存单元,并用表 达式将其

    35、初始化。DCI伪操作与DCD非常相似,不同之处在于,DCI分配的内存中数据被标识为指 令,可用于通过宏指令定义处理器指令系统不支 持的指令。例 4.15 使用示例 MACRO ;宏指令 NEWCMD$Rd,$Rm DCI 0 xe16f0f10:OR($Rd:SHL:12):OR:$Rm ;这里存放的是指令 MEND 6.DCQ(或DCQU)格 式:标号 DCQ(或DCQU)表达式 功 能:DCQ(或DCQU)伪操作用于分配一片以8个字节为单位的连续存储区域并用伪操作中指定的表达式初 始化。用DCQ分配的存储单元是字对齐的,而用DCQU分 配的存储单元并不严格按照字对齐。例 4.16 使用示例

    36、:DataTest DCQ 100;分配一片连续的存储单元并初始化为指定的值。7.DCFS(或DCFSU)格 式:标号DCFS(或DCFSU)表达式 功 能:DCFS(或DCFSU)伪操作用于为单精度浮点数 分配一片连续的字存储单元并用伪操作中指定的 表达式初始化。每个单精度浮点数占据一个字单 元。用DCFS分配的字存储单元是字对齐的,而用 DCFSU分配的字存储单元并不严格按照字对齐。例 4.17 使用示例:FdataTest DCFS 2E5,-5E7;分配一片连 续的字存储单元并初始化为指定的单精度数。8.DCFD(或DCFDU)格 式:标号 DCFD(或DCFDU)表达式 功 能:DC

    37、FD(或DCFDU)伪操作用于为双精度的浮 点数分配一片连续的字存储单元并用伪操作中指 定的表达式初始化。每个双精度的浮点数占据两 个字单元。用DCFD分配的字存储单元是字对齐 的,而用DCFDU分配的字存储单元并不严格按 照字对齐。例 4.18 使用示例:FdataTest DCFD 2E115,-5E7;分配一片连续 的字存储单元并初始化为指定的双精度数。9.SPACE 格 式:标号 SPACE 表达式 功 能:SPACE伪操作用于分配一片连续的存储区域并初始化为0。其中,表 达式为要分配的字节数。SPACE也可用“”代替。例 4.19 使用示例:DataSpace SPACE 100;分

    38、配连续100字节的存储单元并初始化为0。10.MAP 格 式:MAP表达式,基址寄存器 功 能:MAP伪操作用于定义一个结构化的内存表的首地址。MAP也可用“”代 替。表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选 项存在时,内存表的首地址为表达式的值与基址寄存器的和。MAP伪操 作通常与FIELD伪操作配合使用来定义结构化的内存表。例 4.20 使用示例:MAP 0 x100,R0;定义结构化内存表首地址的值为0 x100R0。11.FILED 格 式:标号 FIELD 表达式 功 能:FIELD伪操作用于定义一个结构

    39、化内存表中的 数据域。FILED也可用“#”代替。表达式的值为 当前数据域在内存表中所占的字节数。MAP伪操作定义内存表的首地址,FIELD伪操作定义内 存表中的各个数据域,并可以为每个数据域指定一个标 号供其它的指令引用。FIELD伪操作常与MAP伪操作配合使用来定义结构化的内 存表。由MAP伪操作和FIELD伪操作配合定义的内存表有3种:(1)表达式是一个基于绝对地址的内存表,例如:MAP 0 x100 ;定义结构化内存表首地址的值为0 x100。A FIELD 4 ;定义A的长度为4字节,位置为0 x100 B FIELD 4 ;定义B的长度为4字节,位置为0 x104 S FIELD

    40、16 ;定义S的长度为16字节,位置为0 x108 分析:上面的伪操作序列定义了一个内存表,其首地址为固定地址0 x100,该内存表中包含3个数据域:A长度为4字节,相对表首的相对地址为0;B的长度为4 字节,相对地址为4;S的长度为16字节,相对地址为8。在指令中可以这样引用内存表中的数据域:LDR R0,=A ;使用伪指令读取A的地址,地址是 0 x100 LDR R1,R0 ;将A地址处对应的内容加载到R1 (2)表达式是一个数值,是一个基于相对地址的内存表,例如:MAP 0 x04,R9 ;定义结构化内存表首地址的值为R9寄存器的值。DATA1 FIELD 4 ;定义A的长度为4字节,

    41、相对位置为0 DATA2 FIELD 8 ;定义B的长度为8字节,相对位置为4 STRING FIELD 96 ;定义S的长度为96字节,相对位置为12 可通过下面的指令访问地址范围超过4KB的数据。LDR R9,=0 x900 ;定义内存表的地址,首地址是0 x904 ADR R0,DATA1 ;在程序中,读取DATA1的地址0 x908 LDR R2,R0 ;读取DATA1数据 LDR R9,=0 x2000 ;同一个内存表,重新定义为0 x2004 ADR R1,DATA2 ;读取DATA2的地址,是 0 x2008 STR R9,R1 ;把R9的地址存储到DATA2 分析:上面的伪操作

    42、序列定义了一个内存表,其首地址是基于寄存器R9中 的内容,而不是一个固定地址,通过在LDR指令中指定不同的基址寄 存器值,定义的内存表结构可在程序中有多个实例。可多次使用LDR 指令,用以实现不同的程序实例。(3)表达式是一个标号,基于PC的内存表。例如 DATA SPACE 100 ;分配100字节的内存单元,并初始化为0。MAP DATA ;内存表的首地址为DATA内存单元 A FIELD 4 ;定义A的长度为4字节,相对位置为0 B FIELD 4 ;定义B的长度为4字节,相对位置为4 S FIELD 4 ;定义S的长度为4字节,相对位置为8 可通过下面的指令访问地址范围不超过4KB的数

    43、据。LDR R5,B ;相当于LDR R5,PC,#4 分析:这里内存表中各数据域的实际内存地址是基于PC寄存器的值,而不是 基于一个固定的地址。PC的值不是固定的,但分配的内存单元是固定 的,也就是说,PC的值加上一个偏移量的值才是内存单元的值,这样 偏移量的值便是不固定的。在使用LDR指令访问表中的数据域时,不 必使用基址寄存器。12.LTORG 格 式:LTORG 功 能:用于声明一个数据缓冲池(也称为文字池)的开始,当程序中使用LDR 之类的指令时,数据缓冲区的使用可能越界。为防止越界发生,可使 用LTORG伪操作定义数据缓冲池。ARM汇编编译器一般把数据缓冲 池放在代码段的最后面,即

    44、下一个代码段开始之前,或者END伪操作 之前。LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回 指令之后,这样处理器就不会错误地将数据缓冲池 中的数据当作指令 来执行.例如:AREA LTORG_EX,CODE,READONLY START BL FUNC1 FUNC1 LDR R1,=0 x8000 ;子程序 MOV PC,LR ;子程序结束 LTORG ;定义数据缓冲池 DATA SPACE 40 ;从当前位置开始分配40个字节并初始化为0 END4.2.3汇编控制伪操作 汇编控制伪操作用于控制汇编程序的执行流程,常用的汇编控制伪操作包括以下几条:IF、ELSE、ENDIF WH

    45、ILE、WEND MACRO、MEND、MEXIT 1.IF、ELSE、ENDIF 格 式:IF 逻辑表达式 指令序列1 ELSE 指令序列2 ENDIF 功 能:IF、ELSE、ENDIF伪操作能根据条件的成立与否决定是否执行某个 指令序列。当IF后面的逻辑表达式为真,则执行指令序列1,否则执行 指令序列2。其中,ELSE及指令序列2可以没有,此时,当IF后面的 逻辑表达式为真,则执行指令序列1,否则继续执行后面的指令。IF、ELSE、ENDIF伪操作可以嵌套使用。2.WHILE、WEND 格 式:WHILE 逻辑表达式 指令序列 WEND 功 能:WHILE、WEND伪操作能根据条件的成立

    46、与否决定是否循环执行某 个指令序列。当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执 行,一直到逻辑表达式的值为假。WHILE、WEND伪操作可以嵌套 使用。例 4.22 使用示例:GBLA Counter ;声明一个全局的数学变量,变量名为Counter Counter SETA 3 ;由变量Counter控制循环次数 WHILE Counter 10 ;指令序列 counter SETA counter+1 WEND 3.MACRO、MEND、MEXIT 格 式:MACRO$标号 宏名$参数1,$参数2,指令序列 MEXIT 指令

    47、序列 MEND功 能:MACRO、MEND伪操作可以将一段代码定义为一个整体,称为宏指 令,然后就可以在程序中通过宏指令多次调用该段代码。其中,$标号 在宏指令被展开时,标号会被替换为用户定义的符号,宏指令可以使 用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。宏指令的使用方式和功能与子程序有些相似,子程序可以提供模块化的程 序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现 场,从而增加了系统的开销,因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序。包含在MACRO和MEND之间的指令序列称为宏定义体,在宏定义体的第 一行应声明宏的原型(包含宏名、

    48、所需的参数),然后就可以在汇编程序中 通过宏名来调用该指令序列。MEXIT用于从宏定义中跳转出去。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数。MACRO、MEND伪操作可以嵌套使用。宏的标号使用方法:标号在定义宏语句段时是可以选用的。如果选用标号,应该在定义宏的名称前定义一个标号,这个标号是主标 号,在宏语句段内的其它标号都必须由这个主标号构 成。在宏语句段内,所有的标号前加“$”号。参数的使用方法:在宏名称后面,可以设置多个参数,每个参数使用“$”引 导,参数之间使用逗号隔开。这些参数都是形式参数,在 宏语句段内要使

    49、用这些参数,在程序中调用宏时,为这些 参数准备替换参数。替换参数可以是字符或表达式。调用 语句的替换参数和宏的形式参数要一一对应。宏的调用方法:宏的调用是通过宏的名称来实现的。例 4.23 宏应用举例 MACRO ;宏定义开始$label jump$p1,$p2 ;宏的名称为jump,有2个参数p1和p2$label.loop1 ;$label.loop1为宏体的内部标号 BGE$label1.loop1$label.loop2 ;$label.loop2为宏体的内部标号 BL$p1 ;参数p1为一个子程序的名称 BGT$label.loop2 ADR$p2 MED ;宏定义结束 在程序中调用

    50、该宏:exam jump sub,det ;调用jump,宏的标号为exam ;参数1为:sub,参数2为det 程序被汇编后,宏展开的结果:examploop1 ;用exam代替$label构成标号examloop1 BGE examploop1 examloop2 BL sub ;参数1的实际值为sub BGT examloop2 ADR det ;参数2的实际值为det4.2.4信息报告伪操作 信息报告(Reporting)伪操作用于汇编报告指示,常用的信息报告伪操作有:ASSERT INFO OPT TTL、SUBT 1.ASSERT 格 式:ASSERT 逻辑表达式 功 能:ASSE

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《汇编语言程序设计 -基于ARM体系结构》课件第4章ARM汇编语言程序设计1.ppt
    链接地址:https://www.163wenku.com/p-5716757.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库