第7章 汇编语言程序设计

上传人:无*** 文档编号:182198702 上传时间:2023-01-21 格式:PPT 页数:35 大小:474.02KB
收藏 版权申诉 举报 下载
第7章 汇编语言程序设计_第1页
第1页 / 共35页
第7章 汇编语言程序设计_第2页
第2页 / 共35页
第7章 汇编语言程序设计_第3页
第3页 / 共35页
资源描述:

《第7章 汇编语言程序设计》由会员分享,可在线阅读,更多相关《第7章 汇编语言程序设计(35页珍藏版)》请在装配图网上搜索。

1、1TM第第7章章汇编语言程序设计汇编语言程序设计本章主要介绍本章主要介绍ARM汇编语言程序设汇编语言程序设计规范,以及在汇编语言程序设计计规范,以及在汇编语言程序设计中所要注意的问题,最后以大量的中所要注意的问题,最后以大量的实例说明汇编语言程序设计方法。实例说明汇编语言程序设计方法。2TM2内容提要内容提要7.1 ARM汇编语言源程序格式及规范汇编语言源程序格式及规范7.2 ARM汇编语言程序设计实例解析汇编语言程序设计实例解析3TM3常用常用ARM源程序文件类型源程序文件类型文件类型文件类型扩展名扩展名汇编语言源文件汇编语言源文件.SC语言源文件语言源文件.CC+源文件源文件.cpp引入文

2、件引入文件.INC头文件头文件.h4TM4汇编语言程序的结构汇编语言程序的结构 CODE32 ;32位的位的ARM指令段指令段 AREA codesec,CODE,READONLY ;代码段,名称为;代码段,名称为codesec,属性为只读,属性为只读main PROC ;函数;函数main STMFD SP!,LR ;保存必要的寄存器和返回地址;保存必要的寄存器和返回地址 ADR R0,strhello ;取标签;取标签strhello代表的地址值代表的地址值 BL _printf ;调用;调用C运行时库的运行时库的_printf函数函数 ;“Hello world!”字符串字符串 BL w

3、elcomefun ;恢复子函数;恢复子函数welcomefun LDMFD SP!,PC ;恢复寄存器值恢复寄存器值strhello ;strhello代表本地制服穿的地址代表本地制服穿的地址 DCB “Hello world!n0”;定义一段字节空间;定义一段字节空间 ENDP ;函数;函数main结束结束5TM5welcomefun ;子函数;子函数welcomefun STMFD SP!,LR ;保存必要的寄存器和返回地址;保存必要的寄存器和返回地址 ADR R0,adrstrarm ;取标签;取标签adrstrarm代表的地址值到代表的地址值到R0中中 LDR R0,R0,#0 ;将

4、;将Strarm的值放到的值放到R0中中 BL _printf ;调用;调用C运行时库的运行时库的_printf函数打印函数打印 ;“Welcome to ARM world!”字符串字符串 LDMFD SP!,PC ;恢复寄存器值恢复寄存器值adrstrarm ;adrstrarm标签标签 DCD strarm ;保存;保存strarm的地址的地址 AREA constdatasec,DATA,READONLY,ALIGN=2 ;数据段,名称;数据段,名称constdatasec ;只读,字对齐;只读,字对齐Strarm DCB “Welcome to ARM world!n0”;存放;存放

5、“Welcome to ARM world!”;字符串;字符串6TM6 EXPORT main ;导出;导出main函数供外部调用函数供外部调用;引入三个;引入三个C运行时的库函数和运行时的库函数和ARM库库IMPORT _mainIMPORT _printfIMPORT|lib$request$armlib|,WEAKEND ;程序结束;程序结束7TM7nARM的汇编语言程序一般由几个段组成,每个段都由的汇编语言程序一般由几个段组成,每个段都由AREA伪操作定义。伪操作定义。n段可以分为多种,如代码段、数据段、通用段,每个段又有段可以分为多种,如代码段、数据段、通用段,每个段又有不同的属性,

6、如代码段的默认属性为不同的属性,如代码段的默认属性为READONLY,数据段,数据段的默认属性为的默认属性为READWRITE。n本程序定义了两个段,第一个段为代码段本程序定义了两个段,第一个段为代码段codesec,在存储,在存储器中存放用于程序执行的代码以及器中存放用于程序执行的代码以及main函数的本地字符串函数的本地字符串;第二个段为数据段;第二个段为数据段constdatasec,存放了全局的字符串,存放了全局的字符串,由于本程序没有对数据进行写操作,该段定义的属性为,由于本程序没有对数据进行写操作,该段定义的属性为READONLY。8TM8ARM汇编语言程序设计格式及规范汇编语言程

7、序设计格式及规范nARM编译环境下进行汇编语言程序设计的格编译环境下进行汇编语言程序设计的格式式n汇编语句中的符号规则汇编语句中的符号规则 9TM9 ARM编译环境下汇编语句格式编译环境下汇编语句格式nADS环境下环境下ARM汇编语句格式如下:汇编语句格式如下:标签标签 指令指令/伪操作伪操作/伪指令伪指令 操作数操作数;语句的注释;语句的注释n所有的标签必须在一行的开头顶格写,前面不留空格所有的标签必须在一行的开头顶格写,前面不留空格。后面也不能跟。后面也不能跟C语言中的标签一样加语言中的标签一样加“:”;nARM汇编器对标识符的大小写敏感,书写标号以及汇编器对标识符的大小写敏感,书写标号以

8、及指令时字母的大小写要一致;指令时字母的大小写要一致;n注释使用注释使用“;”符号,注释的内容从符号,注释的内容从“;”开始到该开始到该行的结尾结束。行的结尾结束。10TM10nARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则1.符号命名规则符号命名规则(1)符号由大小写字母、数字、下划线组成,且符号是区分)符号由大小写字母、数字、下划线组成,且符号是区分大小写的。大小写的。(2)局部标号可以用数字开头,其他的标号不能。)局部标号可以用数字开头,其他的标号不能。(3)符号在其作用范围内必须是唯一的。)符号在其作用范围内必须是唯一的。(4)程序中的符号不要与指令助记符或者伪操作同名

9、。)程序中的符号不要与指令助记符或者伪操作同名。11TM11n标签标签标签是一个符号,可以代表指令的地址、数据的地址、变标签是一个符号,可以代表指令的地址、数据的地址、变量。量。一般以字母开头,由字母、数字、下划线组成。一般以字母开头,由字母、数字、下划线组成。当符号代表地址时又称标号,可以以数字开头,其作用范当符号代表地址时又称标号,可以以数字开头,其作用范围为当前段或者在下一个围为当前段或者在下一个ROUT伪操作之前。伪操作之前。n指令指令/伪操作伪操作指令指令/伪操作是指令的助记符,他告诉伪操作是指令的助记符,他告诉ARM的处理器应该的处理器应该执行什么样的操作或者告诉汇编程序伪指令语句

10、的伪操作执行什么样的操作或者告诉汇编程序伪指令语句的伪操作功能。功能。12TM12n标号代表地址标号代表地址 标号分为段内标号和段外标号。段内标号的地址值在汇编时确定,段外标号分为段内标号和段外标号。段内标号的地址值在汇编时确定,段外标号的地址值在连接是确定。标号的地址值在连接是确定。在程序段中,标号代表其所在位置与段首地址的偏移量。根据程序计数在程序段中,标号代表其所在位置与段首地址的偏移量。根据程序计数器(器(PC)和偏移量计算地址及程序相对寻址。)和偏移量计算地址及程序相对寻址。在影像中定义的标号代表标号到映像首地址的偏移量。映像的首地址通在影像中定义的标号代表标号到映像首地址的偏移量。

11、映像的首地址通常被赋予一个寄存器,根据寄存器值域偏移量计算地址即寄存器相对寻常被赋予一个寄存器,根据寄存器值域偏移量计算地址即寄存器相对寻址。址。例如例如 loop SUBS R0,R0,#1 ;每次循环使每次循环使R0=R0-1 BNE loop ;跳转到;跳转到loop标号去执行标号去执行13TM13n在宏中也可以使用局部标号。局部标号是在宏中也可以使用局部标号。局部标号是0-99的十进制开始,可以重复定义的十进制开始,可以重复定义n被引用的局部标号语法规则是:被引用的局部标号语法规则是:%F B A T n routnamen其中:其中:n是局部标号的数字号。是局部标号的数字号。rout

12、name是当前局部范围的名称。是当前局部范围的名称。%表示引用操作。表示引用操作。F指示汇编器只向前搜索。指示汇编器只向前搜索。B指示汇编器只向后搜索。指示汇编器只向后搜索。A指示汇编器搜索宏的所有嵌套层次。指示汇编器搜索宏的所有嵌套层次。T指示汇编器搜索宏的当前层次。指示汇编器搜索宏的当前层次。n例如例如 01 SUBS R0,R0,#1 ;每次循环使每次循环使R0=R0-1 BNE%B01 ;跳转到;跳转到01标号去执行标号去执行14TM142.常量常量:其值在程序运行过程种不能被改变的量其值在程序运行过程种不能被改变的量(1)十进制数,如)十进制数,如535、246。(2)十六进制数,如

13、)十六进制数,如0 x645、0 xff00。(3)n_XXX,n表示表示n进制数,从进制数,从29,XXX是具体的数字。例如:是具体的数字。例如:8_3777(4)字符常量用一对单引号括起来,包括一个单字符或者标准)字符常量用一对单引号括起来,包括一个单字符或者标准C中的转义中的转义字符。例如字符。例如A、n。(5)字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准)字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准C中的转义字符。如中的转义字符。如“abcdn”。(6)逻辑常量)逻辑常量TRUE,FALSE,注意带大括号。注意带大括号。如果需要使用双引号如果需要使用双引

14、号”或字符或字符$,则必须用,则必须用”和和$代替。代替。15TM153.变量:变量:这里所说的变量,是相对于汇编程序的变量这里所说的变量,是相对于汇编程序的变量,是用于汇编程序进行处理的,但一旦编译到程,是用于汇编程序进行处理的,但一旦编译到程序中,则不会改变,成为常量。序中,则不会改变,成为常量。(1)数字变量)数字变量(2)字符串变量)字符串变量(3)逻辑变量)逻辑变量16TM16n在字符串变量的前面有一个在字符串变量的前面有一个$字符,在汇编时编译器会将该字符,在汇编时编译器会将该字符串变量的内容代替该串字符。字符串变量的内容代替该串字符。n在数字变量前面右一个代换操作符在数字变量前面

15、右一个代换操作符“$”,编译器会将该数字,编译器会将该数字变量的值转换为十六进制的字符串,并用该十六进制的字符变量的值转换为十六进制的字符串,并用该十六进制的字符串代换串代换“$”后的数字变量。后的数字变量。n需要将需要将“$”字符加入到字符串中,可以用字符加入到字符串中,可以用“$”代替,此时代替,此时编译器将不再进行变量代换,而是把编译器将不再进行变量代换,而是把“$”看做一个看做一个“$”n在两个在两个“|”之间的之间的“$”将不进行变量的代换,但如果将不进行变量的代换,但如果“|”在在双引号内,则将进行变量代换。双引号内,则将进行变量代换。n使用使用“.”来表示字符串中变量名的结束。来

16、表示字符串中变量名的结束。17TM17例子:例子:(1)GBLS string1 GBLS D GBLA num num SETA 0 x11223344 D SETS “ARM9TDMI”string1 SETS“ABC$D$num”汇编后得到什么?汇编后得到什么?18TM18例子例子(2)GLBS string1 GLBS string2 string1 SETS”AAA”string2 SETS“$string1.BBCC”汇编后结果是什么?汇编后结果是什么?19TM1920TM20n4.字符串表达式操作字符串表达式操作n(1)取符串的长度)取符串的长度LENn语法格式:语法格式:n:L

17、EN:An功能说明:返回字符串功能说明:返回字符串A的长度。的长度。21TM21n(2)CHRn语法格式:语法格式:n:CHR:A n功能说明:将功能说明:将A(A为某一字符的为某一字符的ASCII值)值)转换为单个字符。转换为单个字符。22TM22n(3)STRn语法格式:语法格式:n:STR:A n功能说明:将功能说明:将A(A为数字量或逻辑表达式)为数字量或逻辑表达式)转换成字符串。转换成字符串。23TM23n(4)LEFTn语法格式:语法格式:nA:LEFT:B n功能说明:返回字符串功能说明:返回字符串A最左端最左端B(B为返回为返回长度)长度的字符串。长度)长度的字符串。24TM2

18、4n(5)RIGHTn返回一个字符串最右端一定长度的字符串:返回一个字符串最右端一定长度的字符串:nA:RIGHT:Bn功能说明:返回字符串功能说明:返回字符串A最右端最右端B(B为返回为返回长度)长度的字符串。长度)长度的字符串。25TM25n(6)CCn用于连接两个字符串,用于连接两个字符串,B串接到串接到A串后面:串后面:nA:CC:B 26TM267.2 ARM汇编语言程序设计实例解析汇编语言程序设计实例解析27TM27n链接器链接器ld用于把多个目标文件合并为一个可用于把多个目标文件合并为一个可执行文件。汇编器执行文件。汇编器as生成的目标文件都假定生成的目标文件都假定从地址从地址0

19、开始,开始,ld为其指定最终的地址。为其指定最终的地址。n链接器链接器ld把目标文件中的每个把目标文件中的每个section都作为都作为一个整体,为其分配运行的地址一个整体,为其分配运行的地址 28TM287.3 ARM 汇编语言程序设计规范汇编语言程序设计规范n汇编语言预定义的寄存器名称汇编语言预定义的寄存器名称nARM汇编语言程序设计规范汇编语言程序设计规范29TM29汇编器预定义的寄存器名称汇编器预定义的寄存器名称 30TM30求一个数的阶乘(求一个数的阶乘(64位结果)位结果)nMOVR8,#20低低32位初始化为位初始化为20nMOVR9,#0 高位初始化为高位初始化为0nSUBR0

20、,R8,#1初始化计数器初始化计数器nLoopnMOVR1,R9暂存高位值暂存高位值nUMULLR8,R9,R0,R8R9:R8=R0*R8nMLAR9,R1,R0,R9R9=R1*R0+R9nSUBSR0,R0,#1计数器递减计数器递减nBNELoop计数器不为计数器不为0继续循环继续循环31TM31在在ARM集成开发环境下编程:集成开发环境下编程:nAREA Fctrl,CODE,READONLY;声明代码声明代码FctrlnENTRY;标识程序入口标识程序入口nCODE32;声明声明32 位位ARM 指令指令nnStopnBStopnEND;文件结束文件结束32TM32n例子:先对内存地

21、址例子:先对内存地址0 x3000开始的开始的100个字个字内存单元填入内存单元填入0 x100000010 x10000064字字数据,然后将每个字单元进行数据,然后将每个字单元进行64位累加结果位累加结果保存于保存于R9:R8。(。(R9中存放高中存放高32位)位)33TM33nAREA FCTRL,CODE,READONLY;声明代码声明代码FCTRLnENTRY;标识程序入口标识程序入口nCODE32;声明声明32 位位ARM 指令指令nSTARTnMOVR0,#0X3000;初始化寄存器初始化寄存器nMOVR1,#0X10000001nMOVR2,#100nloop_1;第一次循环赋

22、值第一次循环赋值nSTRR1,R0,#4nADDR1,R1,#1nSUBSR2,R2,#1nBNEloop_1nnMOVR0,#0X3000nMOVR2,#100nMOVR9,#0nMOVR8,#034TM34nloop_2;第二次循环累加第二次循环累加nLDRR1,R0,#4nADDSR8,R1,R8 ;R8=R8+R1,进位影响标志位进位影响标志位nADCR9,R9,#0;R9=R9+C,C为进位为进位nSUBSR2,R2,#1nBNEloop_2nStopnBStopnEND;文件结束文件结束35TM第第7章章汇编语言程序设计汇编语言程序设计实验一:基于实验一:基于ARM的汇编语言程序设计简介的汇编语言程序设计简介要求:利用汇编语言实现控制两个要求:利用汇编语言实现控制两个LED循环点亮循环点亮

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!