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

类型ARM汇编语言程序指示符与语句格式课件.ppt

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

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

    特殊限制:

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

    关 键  词:
    ARM 汇编语言 程序 指示 语句 格式 课件
    资源描述:

    1、2022-6-161第第5章章 ARM指令集指令集和汇编语言程序和汇编语言程序l本章主要介绍以下内容:lARM指令集的基本特点l与Thumb指令集的区别l与x86处理器的区别lARM指令格式lARM寻址方式lARM指令集分类详解lARM汇编语言的指示符lARM汇编语言语句格式lARM汇编语言程序格式lARM汇编语句格式和程序格式进阶lARM汇编语言程序举例2022-6-162本讲主要参考文献本讲主要参考文献lARM公司公司英文资料:英文资料:lADS_AssemblerGuide_B.pdflDDI0100E_ARM_ARM.pdfl中文图书中文图书lARM体系结构与编程,清华大学出版社l嵌入

    2、式系统基础教程,机械工业出版社2022-6-1635.4 ARM汇编语言程序的指示符汇编语言程序的指示符lARM汇编语言源程序中语句由指令、指示符和宏指令组成。l在ARM中将directive称做指示符lARM的指示符指令相当于x86的伪指令l在ARM中pseudo-instruction被称为伪指令lARM指令集中只有4条伪指令l而宏指令则是通过指示符定义的。l使用MACRO和 MEND指示符2022-6-1645.4.1 符号定义指示符符号定义指示符l符号定义(Symbol definition)指示符用于定义ARM汇编程序中的变量,对变量进行赋值以及定义寄存器名称。包括以下指示符:lGB

    3、LA,GBLL及GBLS 声明全局变量;lLCLA,LCLL及LCLS 声明局部变量;lSETA,SETL及SETS 给变量赋值;lRLIST 为通用寄存器列表定义名称;lCN 为协处理器的寄存器定义名称;lCP 为协处理器定义名称;lDN及SN 为VFP的寄存器定义名称;lFN 为FPA的浮点寄存器定义名称。2022-6-1655.4.2 数据定义指示符数据定义指示符l数据定义(Data definition)指示符包括以下的指示符:lLTORG 声明一个数据缓冲池(literal pool)的开始;lMAP 定义一个结构化的内存表(storage map)的首地址;lFIELD 定义结构化

    4、的内存表中的一个数据域(field);lSPACE 分配一块内存单元,并用0初始化;lDCB 分配一段字节的内存单元,并用指定的数据初始化;lDCD及DCDU 分配一段字的内存单元,并用指定的数据初始化;lDCDO 分配一段字的内存单元,并将单元的内容初始化成该单元相对于静态基值寄存器的偏移量。2022-6-166数据定义指示符(续)数据定义指示符(续)lDCFD及DCFDU 分配一段双字的内存单元,并用双精度的浮点数据初始化。lDCFS及DCFSU 分配一段字的内存单元,并用单精度的浮点数据初始化。lDCI 分配一段字节的内存单元,用指定的数据初始化,指定内存单元中存放的是代码,而不是数据。

    5、lDCQ及DCQU 分配一段双字的内存单元,并用64位的整数数据初始化。lDCW及DCWU 分配一段半字的内存单元,并用指定的数据初始化。lDATA 在代码段中使用数据。现已不再使用,仅用于保持向前兼容。2022-6-1675.4.3 汇编控制指示符汇编控制指示符l汇编控制(Assembly control)指示符包括下面的指示符:lIF,ELSE及ENDIFl汇编或者不汇编一段源代码lWHILE及WENDl条件重复汇编相同的一段源代码lMACRO及MENDl标识宏定义开始与结束lMEXITl用于从宏跳转出去2022-6-1685.4.4 信息报告指示符信息报告指示符l信息报告(Reporti

    6、ng)指示符包括下列指示符:lASSERTl在汇编编译器对汇编程序的第二趟扫描中,如果其中的ASSERTION中条件不成立,ASSERT伪操作将报告该错误信息。lINFOl支持第一二趟汇编扫描时报告诊断信息。lOPTlTTL及及SUBT2022-6-1695.4.5 其他指示符其他指示符l这些杂类的指示符包括:lALIGNlAREAlCODE16及CODE32lENDlENTRYlEQUlEXPORT或GLOBAL2022-6-1610其他的指示符(续)其他的指示符(续)lEXTERNlGET或INCLUDElIMPORTlINCBINlKEEPlNOFPlREQUIRElREQUIRE8及P

    7、RESERVE8lRNlROUT2022-6-16115.4.5.1 AREAlAREA指示符用于定义一个代码段或者数据段。l语法格式lAREA sectionname,attr,attr.l其中:lsectionname为所定义的代码段或者数据段的名称。如果该名称是以数字开头的,则该名称必须用“”括起来,如1_datasec。还有一些代码段具有约定的名称,如.text表示C语言编译器产生的代码段或者是与C语言库相关的代码段。lAttr是该代码段(或者程序段)的属性。l在AREA指示符中,各属性间用逗号隔开。2022-6-1612AREA的属性的属性l下面列举主要的属性:lALIGN=expr

    8、ession。默认的情况下,ELF的代码段和数据段是4字节对齐的。lExpression可以取031的数值,相应的对齐方式为(2expression)字节对齐。如expression=3时为8字节对齐。lASSOC=section。指定与本段相关的ELF段。任何时候连接section段也必须包括sectionname段。lCODE 定义代码段。默认属性为READONLY。lCOMDEF 定义一个通用的段。该段可以包含代码或者数据。在个源文件中,同名的COMDEF段必须相同。2022-6-1613AREA的属性(续)的属性(续)lCOMMON 定义一个通用的段。该段不包含任何用户代码和数据,连接

    9、器将其初始化为0。各源文件中同名的COMMON 段公用同样的内存单元,连接器为起分配合适的尺寸。lDATA 定义数据段。默认属性为READWRITE。lNOINIT 指定本数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将个内存单元值初始化为0。lREADONLY 指定本段为只读,代码段的默认属性为READONLY。lREADWRITE 指定本段为可读可写,数据段的默认属性为READWRITE。2022-6-1614AREA指示符举例指示符举例l举例举例l下面的指示符定义了一个代码段,代码段的名称为Mainpro ,属性为READONLY。AREA Mainpro, CODE, R

    10、EADONLY;code segment2022-6-16155.4.5.2 EQUlEQU指示符为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名称。l*是EQU的同义词。l语法格式lname EQU expr, typel其中:lexpr为基于寄存器的地址值、程序中的标号、32位的地址常量或者32位的常量。lname为EQU指示符为expr定义的字符名称。ltype 当expr为32位常量时,可以使用type指示expr表示的数据的类型。2022-6-1616EQU(续)(续)ltype有下面3种取值:lCODE16lCODE32lDATAl使用说明lEQU指示符的作用

    11、类似于C语言中的#define,用于为一个常量定义字符名称。l示例labcd EQU 2 ;定义abcd符号的值为2labcd EQU label+16;定义abcd符号的值(label+16)laddr1 EQU 0 xlC, CODE32 ;定义addr1符号值为;绝对地址值0 xlC,而且该处为ARM指令。2022-6-16175.4.5.3 ENTRYlENTRY指示符指定程序的入口点l语法格式lENTRYl使用说明l一个程序(可以包含多个源文件)中至少要有一个ENTRY(可以有多个ENTRY),但一个源文件中最多只能有一个ENTRY(可以没有ENTRY)。l示例AREA exampl

    12、e, CODE, READONLYENTRY ;应用程序的入口点2022-6-16185.4.5.4 CODE16和和CODE32lCODE16指示符告诉汇编编译器后面的指令序列为16位的Thumb指令。lCODE32指示符告诉汇编编译器后面的指令序列为32位的ARM指令。l语法格式lCODE16lCODE32l使用说明l当汇编源程序中同时包含ARM指令和Thumb指令时,使用CODE16指示符告诉汇编编译器后面的指令序列为16位的Thumb指令;使用CODE32指示符告诉汇编编译器后面的指令序列为32位的ARM指令。但是,CODE16指示符和CODE32指示符只是告诉编译器后面指令的类型,该

    13、指示符本身并不进行程序状态的切换。2022-6-1619CODE16/CODE32举例举例在下面的例子中,程序先在ARM状态下执行,然后通过BX指令切换到Thumb状态,并跳转到相应的Thumb指令处执行。在Thumb程序入口处用CODE16指示符标识下面的指令为Thumb指令。参看下面的指令段:.AREA ChangeState, CODE, READONLYCODE32 ;指示下面的指令为ARM指令LDR r0, =start+1BX r0 ;切换到Thumb,并跳转到start处执行CODE16 ;指示下面的指令为Thumb指令startMOV r1, #102022-6-16205.4

    14、.5.5 ENDlEND指示符告诉编译器已经到了源程序结尾。l语法格式:lENDl使用说明:l每一个汇编源程序都包含END指示符,以告诉本源程序的结束。l示例:AREA example CODE,READONLYEND2022-6-16215.4.5.6 ALIGNlALIGN指示符通过添加补丁字节使当前位置满足一定的对齐方式。l语法格式lALIGN expr,offsetl其中,expr为数字表达式,用于指定对齐方式。可能的取值为2的次幂,如1、2、4、8等。如果指示符中没有指定expr,则当前位置对齐到下一个字边界处。offset为数字表达式。当前位置对齐到下面形式的地址处:offset+

    15、n*expr。2022-6-1622ALIGN(续(续1)l使用说明l下面的情况中,需要特定的地址对齐方式:lThumb的宏指令ADR要求地址是字对齐的,而Thumb代码中地址标号可能不是字对齐的。这时就要使用指示符ALIGN 4使Thumb代码中的地址标号字对齐。l由于有些ARM处理器的CACHE采用了其他对齐方式,如16字节的对齐方式,这时使用ALIGN指示符指定合适的对齐方式可以充分发挥该CACHE的性能优势。lLDRD及STRD指令要求内存单元是8字节对齐的。这样在为这两个指令分配的内存单元前要使用ALIGN 8实现8字节对齐方式。l地址标号通常自身没有对齐要求。而在ARM代码中要求地

    16、址标号是字对齐的,在Thumb代码中要求字节对齐。这样需要使用合适的ALIGN指示符来调整对齐方式。 2022-6-16235.4.5.7 EXPORT及及GLOBALlEXPRORT声明一个符号可以被其他文件引用。相当于声明了一个全局变量。GLOBAL是EXPORT的同义词。l语法格式lEXPORT symbol WEAKl其中,symbol为声明的符号名称,大小写敏感。lWEAK选项声明其他的同名符号优先于本符号被引用。l使用说明l使用EXPORT指示符声明一个源文件中的符号,使得该符号可以被其他源文件引用。l示例lAREA Example,CODE,READONLYlEXPORT Do_

    17、Add ; 函数名称DoAdd可以被引用2022-6-16245.4.5.8 IMPORTlIMPORT指示符告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。l语法格式lIMPORT symbol WEAKl其中:lsymbol为声明的符号的名称。它是区分大小写的。lWEAK 指定这个选项后,如果symbol在所有的源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号。2022-6-1625IMPORT(续)

    18、(续)l使用说明l使用IMPORT指示符声明一个符号是在其他源文件中定义的。如果连接器在连接处理时不能解析该符号,而IMPORT指示符中没有指定WEAK选项,则连接器将会报告错误。如果连接器在连接处理时不能解析该符号,而IMPORT指示符中指定了WEAK选项,则连接器将不会报告错误,而是进行下面的操作:l如果该符号被B或者BL指令引用,则该符号被设置成下一条指令的地址,该B或者BL指令相当于一条NOP指令。l其他情况下该符号被设置为0。2022-6-16265.4.5.9 EXTERNlEXTERN指示符告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用

    19、该符号。如果本源文件没有实际引用该符号,该符号都将不会被加入到本源文件的符号表中。l语法格式lEXTERN symbol WEAKl其中,symbol为声明的符号的名称。它是区分大小写的。lWEAK 指定该选项后,如果symbol在所有的源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号。2022-6-1627EXTERN(续(续1)l使用说明l使用EXTERN指示符声明一个符号是在其他源文件中定义的。如果连接器在连接处理时不能解析该符号,而EXTERN指示符中没有指定WEAK选项,则连接器将会报告错误。如果连接器在连接处理时不

    20、能解析该符号,而EXTERN指示符中指定了WEAK选项,则连接器将不会报告错误,而是进行下面的操作:l如果该符号被B或者BL指令引用,则该符号被设置成下一条指令的地址,该B或者BL指令相当于一条NOP指令。l其他情况下该符号被设置为0。2022-6-1628EXTERN(续(续2)l示例l下面的代码测试是否连接了C+库,并根据结果执行不同的代码AREA Example, CODE,READONLYEXTERN _CPP_INITIALIZEWEAK ;如果连接了c+库则读取;函数_CPP_INITIALIZE地址LDR r0,_CPP_INITIALIZECMP r0,#0;Test if z

    21、ero.BEQ nocplusplus ;如果没有连接C+库,则跳转到nocplusplus2022-6-16295.4.5.10 GET及及INCLUDElGET指示符将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。lINCLUDE是GET的同义词。l语法格式lGET filenamel其中,filename为被包含的源文件的名称。这里可以使用路径信息。l使用说明(1)l通常可以在一个源文件中定义宏,用EQU定义常量的符号名称,用MAP和FIELD定义结构化的数据类型,这样的源文件类似于C语言中的.H文件。然后用GET指示符将这个源文件包含到它们的源文件中,类似于在

    22、C源程序的“include *.h”。2022-6-1630GET及及INCLUDE(续(续1)l使用说明(2)l编译器通常在当前目录中查找被包含的源文件。可以使用编译选项-I添加其他的查找目录。同时,被包含的源文件中也可以使用GET指示符,即GET指示符可以嵌套使用。如在源文件A中包含了源文件B,而在源文件B中包含了源文件C。编译器在查找C源文件时将把源文件B所在的目录作为当前目录。lGET指示符不能用来包含目标文件(二进制执行文件)。l包含目标文件需要使用INCBIN指示符。2022-6-1631GET及及INCLUDE(续(续2)l示例AREA Example,CODE,READONLY

    23、GET file1.s ;包含源文件file1.sGET c:projectfile2.s ;包含源文件file2.s,可以包含路径信息GET c:program filesfile3.s ;包含源文件file3.s,路径信息中可以包含空格2022-6-16325.4.5.11 INCBINlINCBIN指示符将一个文件包含到(INCLUDE)当前源文件中,被包含的文件不进行汇编处理。l语法格式lINCBIN filenamel其中,filename为被包含的文件的名称。这里可以使用路径信息。l使用说明l通常可以使用INCBIN将一个执行文件或者任意的数据包含到当前文件中。被包含的执行文件或数

    24、据将被原封不动地放到当前文件中。编译器从INCBIN指示符后面开始继续处理。2022-6-1633INCBIN(续)(续)l使用说明l编译器通常在当前目录中查找被包含的源文件。可以使用编译选项-I添加其他的查找目录。同时,被包含的源文件中也可以使用GET指示符,即GET指示符可以嵌套使用。如在源文件A中包含了源文件B,而在源文件B中包含了源文件C。编译器在查找C源文件时将把源文件B所在的目录作为当前目录。l这里所包含的文件名及路径信息中都不能有空格。l示例AREA Example,CODE,READONLYINCBIN file1.dat ;包含文件file1.datINCBIN c:proj

    25、ectfile2.txt ;包含文件file2.txt2022-6-16345.4.5.12 NOFPl使用NOFP指示符禁止源程序中包含浮点运算指令。l语法格式lNOFPl使用说明l当系统中没有硬件或软件仿真代码支持浮点运算指令时,使用NOFP指示符禁止在源程序中使用浮点运算指令。这时如果源程序中包含浮点运算指令,编译器将会报告错误。同样如果在浮点运算指令的后面使用NOFP指示符,编译器同样将会报告错误。2022-6-16355.4.5.13 REQUIRElREQUIRE指示符指定段之间的相互依赖关系。l语法格式lREQUIRE label l其中,label为所需要的标号的名称。l使用说

    26、明l当进行连接处理时包含了有REQUIRE label指示符的源文件,则定义label的源文件也将被包含。2022-6-16365.4.5.14 RNlRN指示符为一个特定的寄存器定义名称。l语法格式lname RN exprl其中:lexpr为某个寄存器的编码。lname为本指示符给寄存器expr定义的名称。l使用说明lRN指示符用于给一个寄存器定义名称。方便程序员记忆该寄存器的功能。2022-6-16375.5 ARM汇编语言语句格式汇编语言语句格式lARM汇编语言语句格式如下所示:symbolinstruction | directive | pseudo-instruction ;co

    27、mmentl其中:linstruction为指令。在ARM汇编语言中,指令不能从一行的行头开始。在一行语句中,指令的前面必须有空格或者符号。lDirective是指示符。lpseudo-instruction是伪指令。2022-6-1638ARM汇编语言语句格式(续)汇编语言语句格式(续)lsymbol为符号。在ARM汇编语言中,符号必须从一行的行头开始,并且符号中不能包含空格。在指令和伪指令中符号用作地址标号(label);在有些指示符中,符号用作变量或者常量。lcomment为语句的注释。在ARM汇编语言中注释以分号“;”开头。注释的结尾即为一行的结尾。注释也可以单独占用一行。2022-6

    28、-1639ARM汇编程序编写规范汇编程序编写规范l汇编语句格式lARM汇编中,所有标号必须在一行的顶格书写,其后面不要添加符号“:”。l而所有指令均不能顶格书写。lARM汇编器对标识符大小写敏感(即区分大小写字母),书写标号及指令时字母大小写要一致。l在ARM汇编程序中,ARM指令、伪指令、寄存器名可以全部为大写字母,也可以全部为小写字母,但不要大小写混合使用。l源程序中,语句之间可以插入空行,以使得源代码的可读性更好。 2022-6-1640ARM汇编程序编写规范(续)汇编程序编写规范(续)l格式如下:l标号标号 ;注释注释l源程序中允许有空行。适当地插入空行,可以提高源程序的可读性。l如果

    29、单行代码太长,可以使用字符“”将其分行。“”后不能有任何字符,包括空格和制表符等。l对于变量的设置、常量的定义,其标识符必须在一行的顶格书写。l下面给出了汇编指令正确和错误的例子2022-6-1641汇编指令正确的例子汇编指令正确的例子 Str1 SETS “My String1.” ;设置字符串变量Str1CountRN R0 ;定义寄存器名CountUSR_STACK EQU 64;定义常量 STARTLDR R0,=0 x12345678 ;1235678HMOV R1,#0LOOPMOV R2,#1 2022-6-1642汇编指令错误的例子汇编指令错误的例子 DOB MOV R0,#1

    30、 ;标号DOB没有顶格书写ABC: MOV R1,#2 ;标号不允许用符号“: ”修饰MOV R2,#3 ;命令不允许顶格书写loop Mov R2,#3 ;指令中大小写混合 B Loop ;无法跳转到loop标号,大小写;不一致2022-6-16435.6 ARM汇编语言程序格式汇编语言程序格式lARM汇编语言以段(section)为单位组织源文件。l段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。l段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。l一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。2022-6-1644A

    31、RM汇编源程序和映像文件汇编源程序和映像文件lARM汇编语言源程序经过汇编处理后生成一个可执行的映像文件(类似于Windows系统下的EXE文件)。该可执行的映像文件通常包括下面3部分:l一个或多个代码段。代码段通常是只读的。l零个或多个包含初始值的数据段。这些数据段通常是可读写的。l零个或多个不包含初始值的数据段。这些数据段被初始化为0,通常是可读写的。l连接器根据一定的规则将各个段安排到内存中的相应位置。源程序中段之间的相邻关系与执行的映像文件中段之间的相邻关系并不一定相同。2022-6-1645ARM汇编源程序基本结构举例汇编源程序基本结构举例源程序基本结构如下示出: AREA EXAM

    32、PLE1, CODE, READONLY ENTRYstartMOV r0, #10MOV r1, #3ADD r0, r0, r1END2022-6-1646案例案例ARM汇编源程序说明汇编源程序说明l在ARM汇编语言源程序中,指示符AREA定义一个段。lAREA指示符表示了一个段的开始,同时定义了这个段的名称及相关属性。在本例中定义了一个只读的代码段,其名称为EXAMPLE1。lENTRY指示符标识了程序执行的第一条指令。一个ARM程序中可以有多个ENTRY,至少要有一个ENTRY。初始化部分的代码以及异常中断处理程序中都包含了ENTRY。如果程序包含了C代码,C语言库文件的初始化部分也包

    33、含了ENTRY。l本程序的程序体部分实现了一个简单的加法运算。lEND指示符告诉汇编编译器源文件结束。每一个汇编模块必须包含一个END指示符,指示本模块结束。2022-6-1647汇编语言子程序调用汇编语言子程序调用l在ARM汇编语言中,子程序调用是通过BL指令完成的。BL指令的语法格式如下:lBL subnamel其中,subname是调用的子程序的名称。lBL指令完成两个操作:将子程序的返回地址放在LR寄存器中,同时将PC寄存器值设置成目标子程序的第一条指令地址。l在子程序返回时可以通过将LR寄存器的值传送到PC寄存器中来实现。l子程序调用时通常使用寄存器R0R3来传递参数和返回结果。20

    34、22-6-1648汇编子程序调用举例汇编子程序调用举例l子程序DOADD完成加法运算,操作数放在R0和R1寄存器中,结果放在R0中。AREA EXAMPLE2, CODE, READONLYENTRYstartMOV r0, #10 ; R0设置输入参数MOV r1, #3 ; R1设置输入参数BLdoadd;调用子程序doadddoaddADD r0, r0, r1 ;子程序MOV pc,lr ;从子程序中返回END2022-6-1649ARM汇编子程序的嵌套调用举例汇编子程序的嵌套调用举例-1l这里给出的ARM汇编程序嵌套调用范例程序做如下计算:l求自然数求自然数1到到9的阶乘的总和,半主

    35、机方式输出的阶乘的总和,半主机方式输出l运算结果如下图所示。第3行显示的是19的阶乘,第2行显示的是1!+2!+3!+4!+5!+6!+7!+8!+9!之总和。2022-6-1650ARM汇编子程序的嵌套调用举例汇编子程序的嵌套调用举例-2/* This program is semihosting output mode */* First the main function call assembly summing subprogram */* Then the summing subprogram call assembly factorial subprogram */ #inclu

    36、de extern int asmFac(int n);struct factorial_sumint cal_fn;int sum_fn;int fn9;extern struct factorial_sum * summing(struct factorial_sum * arg1);2022-6-1651ARM汇编子程序的嵌套调用举例汇编子程序的嵌套调用举例-3int main(void) int j;struct factorial_sum fac= 9, 0, 1,1,1,1,1,1,1,1,1; /设置参数struct factorial_sum * result;/申请变量作为返

    37、回值printf(Example of a multi Assembly program calling !n);result=summing(&fac); /调用求和函数 R0存放的是FAC变量的首地址printf(The total sum is %dn, result-sum_fn); /输出结果for(j=0; jfn)j);2022-6-1652ARM汇编子程序的嵌套调用举例汇编子程序的嵌套调用举例-4;the details of parameters transfer comes from ATPCS;if there are more than 4 args, stack wi

    38、ll be used EXPORT summing IMPORT asmFac;说明用到了其他文件中的子汇编程序 AREA SUMMING, CODE, READONLYsummingSTMFD SP!, R4-R5ldr r1, r0;r1=cal_fnmov r2, #1;将r2设置为当前需要计算的阶乘数,;它从1变化到cal_fnadd r3, r0, #8 ;将r3指向fn数组movr5, #0 ;r5为总和,初始值置为0loopcmpr1, r2;将cal_fn与当前所需计算的阶乘值比较bltback;如果小于,则返回2022-6-1653ARM汇编子程序的嵌套调用举例汇编子程序的嵌

    39、套调用举例-5STMFD SP!, R0-R3,lr ;保存ror3,lr ;因为调用了外部文件的汇编子程序movr0, r2;将r0设置为当前所需计算的阶乘值blasmFac;调用阶乘函数movr4, r0;将返回值(阶乘)存在r4中ldmfdSP!, R0-R3,lr ;恢复先前保存的寄存器值strr4, r3;将计算所得的阶乘值存入数组中addr3, r3, #4;将r3指向数组的下一个addr5, r5, r4;将阶乘值加入总和addr2, r2, #1;计算下一个阶乘b loop;循环backstrr5, r0, #4;将计算所得的总和存入结构体中ldnfd SP!, R4-R5;恢

    40、复寄存器值movpc, lr; summing子程序返回END;汇编代码结束2022-6-1654ARM汇编子程序的嵌套调用举例汇编子程序的嵌套调用举例-6;the details of parameters transfer comes from ATPCS;if there are more than 4 args, stack will be used;这个ARM汇编函数也可以被C函数调用,符合ATPCS规范;int asmFac(int n) EXPORT asmFac AREA ASMFILE, CODE, READONLYasmFacmovr1, r0;r1=nloopsubsr1

    41、,r1, #1;将r1减1mulgtr0,r1, r0;如果大于0,则乘上r1(相当与n*(n-1)bgtloop;如果大于0,继续mov pc, lr;asmFac子程序返回END;汇编代码结束2022-6-1655第第10讲重点讲重点lARM汇编语言代码中使用的指示符l符号定义指示符l数据定义指示符l汇编控制指示符l信息报告指示符lARM汇编语言语句格式lARM汇编语言程序格式2022-6-1656第第10讲复习题与思考题讲复习题与思考题1 何谓ARM汇编语言的指示符?2 ARM汇编语言的pseudo-instruction是什么指令?3 ARM汇编语言中的变量是如何定义的?4 全局变量和

    42、局部变量的作用范围各是什么?5 ARM汇编程序的变量是如何赋值的?6 数据缓冲池(literal pool,也译成文字池)是怎么一回事?7 MAP指示符的功能是什么?8 SPACE指示符的功能是什么?9 DCD指示符的功能是什么?2022-6-1657第第10讲复习题与思考题(续)讲复习题与思考题(续)10 请说明下列3条指令执行完毕后,分配了多少字节的内存空间。DISPTABDCB0 x30, 0 x43, 0 x76, 0 x20DCB-120, 255, 36, 42NullstringDCB“Welcome to Nanjing!”, 0;构造一个以NULL结尾的字符串11 ARM汇编程序中的宏是如何定义的?12 ARM汇编语言有哪些杂类的伪操作?13 如何告诉汇编编译器下面的指令序列是ARM指令还是Thumb指令?14 如何使用本源文件以外的符号?15 如何将本源文件的符号开放给外部源文件使用?16 EQU伪指令相当于C语言的什么语句?

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:ARM汇编语言程序指示符与语句格式课件.ppt
    链接地址:https://www.163wenku.com/p-2972600.html

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


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


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

    163文库