第7章 汇编语言程序设计.ppt

上传人:本田雅阁 文档编号:2257628 上传时间:2019-03-12 格式:PPT 页数:35 大小:474.01KB
返回 下载 相关 举报
第7章 汇编语言程序设计.ppt_第1页
第1页 / 共35页
第7章 汇编语言程序设计.ppt_第2页
第2页 / 共35页
第7章 汇编语言程序设计.ppt_第3页
第3页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

1、第7章 汇编语言程序设计,本章主要介绍ARM汇编语言程序设计规范,以及在汇编语言程序设计中所要注意的问题,最后以大量的实例说明汇编语言程序设计方法。,内容提要,7.1 ARM汇编语言源程序格式及规范 7.2 ARM汇编语言程序设计实例解析,常用ARM源程序文件类型,汇编语言程序的结构,CODE32 ;32位的ARM指令段 AREA codesec,CODE,READONLY ;代码段,名称为codesec,属性为只读 main PROC ;函数main STMFD SP!,LR ;保存必要的寄存器和返回地址 ADR R0,strhello ;取标签strhello代表的地址值 BL _prin

2、tf ;调用C运行时库的_printf函数 ;“Hello world!”字符串 BL welcomefun ;恢复子函数welcomefun LDMFD SP!,PC ; 恢复寄存器值 strhello ;strhello代表本地制服穿的地址 DCB “Hello world!n0” ;定义一段字节空间 ENDP ;函数main结束,welcomefun ;子函数welcomefun STMFD SP!,LR ;保存必要的寄存器和返回地址 ADR R0,adrstrarm ;取标签adrstrarm代表的地址值到R0中 LDR R0,R0,#0 ;将Strarm的值放到R0中 BL _pri

3、ntf ;调用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” ;存放“Welcome to ARM world!” ;字符串,EXPORT main ;导出main函数供外部调用 ;引入三个C运行时的库函数和

4、ARM库 IMPORT _main IMPORT _printf IMPORT |lib$request$armlib|,WEAK END ;程序结束,ARM的汇编语言程序一般由几个段组成,每个段都由AREA伪操作定义。 段可以分为多种,如代码段、数据段、通用段,每个段又有不同的属性,如代码段的默认属性为READONLY,数据段的默认属性为READWRITE。 本程序定义了两个段,第一个段为代码段codesec,在存储器中存放用于程序执行的代码以及main函数的本地字符串;第二个段为数据段constdatasec,存放了全局的字符串,由于本程序没有对数据进行写操作,该段定义的属性为READON

5、LY。,ARM汇编语言程序设计格式及规范,ARM编译环境下进行汇编语言程序设计的格式 汇编语句中的符号规则,ARM编译环境下汇编语句格式,ADS环境下ARM汇编语句格式如下: 标签 指令/伪操作/伪指令 操作数 ;语句的注释 所有的标签必须在一行的开头顶格写,前面不留空格。后面也不能跟C语言中的标签一样加“:”; ARM汇编器对标识符的大小写敏感,书写标号以及指令时字母的大小写要一致; 注释使用“;”符号,注释的内容从“;”开始到该行的结尾结束。,ARM编译环境下汇编语句中符号规则 1.符号命名规则 (1)符号由大小写字母、数字、下划线组成,且符号是区分大小写的。 (2)局部标号可以用数字开头

6、,其他的标号不能。 (3)符号在其作用范围内必须是唯一的。 (4)程序中的符号不要与指令助记符或者伪操作同名。,标签 标签是一个符号,可以代表指令的地址、数据的地址、变量。 一般以字母开头,由字母、数字、下划线组成。 当符号代表地址时又称标号,可以以数字开头,其作用范围为当前段或者在下一个ROUT伪操作之前。 指令/伪操作 指令/伪操作是指令的助记符,他告诉ARM的处理器应该执行什么样的操作或者告诉汇编程序伪指令语句的伪操作功能。,标号代表地址 标号分为段内标号和段外标号。段内标号的地址值在汇编时确定,段外标号的地址值在连接是确定。 在程序段中,标号代表其所在位置与段首地址的偏移量。根据程序计

7、数器(PC)和偏移量计算地址及程序相对寻址。 在影像中定义的标号代表标号到映像首地址的偏移量。映像的首地址通常被赋予一个寄存器,根据寄存器值域偏移量计算地址即寄存器相对寻址。 例如 loop SUBS R0,R0,#1 ;每次循环使R0=R0-1 BNE loop ;跳转到loop标号去执行,在宏中也可以使用局部标号。局部标号是0-99的十进制开始,可以重复定义 被引用的局部标号语法规则是: % FB AT n routname 其中: n是局部标号的数字号。 routname是当前局部范围的名称。 %表示引用操作。 F指示汇编器只向前搜索。 B指示汇编器只向后搜索。 A指示汇编器搜索宏的所有

8、嵌套层次。T指示汇编器搜索宏的当前层次。 例如 01 SUBS R0,R0,#1 ; 每次循环使R0=R0-1 BNE %B01 ;跳转到01标号去执行,2.常量:其值在程序运行过程种不能被改变的量 (1)十进制数,如535、246。 (2)十六进制数,如0x645、0xff00。 (3)n_XXX, n表示n进制数,从29,XXX是具体的数字。例如:8_3777 (4)字符常量用一对单引号括起来,包括一个单字符或者标准C中的转义字符。例如A、n。 (5)字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准C中的转义字符。如“abcdn”。 (6)逻辑常量TRUE,FALSE,注意带大

9、括号。 如果需要使用双引号”或字符$,则必须用”和$代替。,3.变量:这里所说的变量,是相对于汇编程序的变量,是用于汇编程序进行处理的,但一旦编译到程序中,则不会改变,成为常量。 (1)数字变量 (2)字符串变量 (3)逻辑变量,在字符串变量的前面有一个$字符,在汇编时编译器会将该字符串变量的内容代替该串字符。 在数字变量前面右一个代换操作符“$”,编译器会将该数字变量的值转换为十六进制的字符串,并用该十六进制的字符串代换“$”后的数字变量。 需要将“$”字符加入到字符串中,可以用“$”代替,此时编译器将不再进行变量代换,而是把“$”看做一个“$” 在两个“|”之间的“$”将不进行变量的代换,

10、但如果“|”在双引号内,则将进行变量代换。 使用“.”来表示字符串中变量名的结束。,例子: (1)GBLS string1 GBLS D GBLA num num SETA 0x11223344 D SETS “ARM9TDMI” string1 SETS “ABC$D$num” 汇编后得到什么?,例子 (2) GLBS string1 GLBS string2 string1 SETS ”AAA” string2 SETS “$string1.BBCC” 汇编后结果是什么?,4.字符串表达式操作 (1)取符串的长度LEN 语法格式: :LEN: A 功能说明:返回字符串A的长度。,(2)CH

11、R 语法格式: :CHR: A 功能说明:将A(A为某一字符的ASCII值)转换为单个字符。,(3)STR 语法格式: :STR: A 功能说明:将A(A为数字量或逻辑表达式)转换成字符串。,(4)LEFT 语法格式: A :LEFT: B 功能说明:返回字符串A最左端B(B为返回长度)长度的字符串。,(5)RIGHT 返回一个字符串最右端一定长度的字符串: A :RIGHT: B 功能说明:返回字符串A最右端B(B为返回长度)长度的字符串。,(6)CC 用于连接两个字符串,B串接到A串后面: A :CC: B,7.2 ARM汇编语言程序设计实例解析,链接器ld用于把多个目标文件合并为一个可执

12、行文件。汇编器as生成的目标文件都假定从地址0开始,ld为其指定最终的地址。 链接器ld把目标文件中的每个section都作为一个整体,为其分配运行的地址,7.3 ARM 汇编语言程序设计规范,汇编语言预定义的寄存器名称 ARM汇编语言程序设计规范,汇编器预定义的寄存器名称,求一个数的阶乘(64位结果),MOV R8 , #20 低32位初始化为20 MOV R9 , #0 高位初始化为0 SUB R0,R8,#1 初始化计数器 Loop MOV R1 , R9 暂存高位值 UMULL R8 , R9 , R0 , R8 R9:R8=R0*R8 MLA R9 , R1 , R0 , R9 R9

13、=R1*R0+R9 SUBS R0 , R0 , #1 计数器递减 BNE Loop 计数器不为0继续循环,在ARM集成开发环境下编程: AREA Fctrl, CODE, READONLY ; 声明代码Fctrl ENTRY ; 标识程序入口 CODE32 ; 声明32 位ARM 指令 Stop B Stop END ;文件结束,例子:先对内存地址0x3000开始的100个字内存单元填入0x100000010x10000064字数据,然后将每个字单元进行64位累加结果保存于R9:R8。(R9中存放高32位),AREA FCTRL, CODE, READONLY ; 声明代码FCTRL ENT

14、RY ; 标识程序入口 CODE32 ; 声明32 位ARM 指令 START MOV R0,#0X3000 ;初始化寄存器 MOV R1,#0X10000001 MOV R2,#100 loop_1 ;第一次循环赋值 STR R1,R0,#4 ADD R1,R1,#1 SUBS R2,R2,#1 BNE loop_1 MOV R0,#0X3000 MOV R2,#100 MOV R9,#0 MOV R8,#0,loop_2 ;第二次循环累加 LDR R1,R0,#4 ADDS R8,R1,R8 ;R8=R8+R1,进位影响标志位 ADC R9,R9,#0 ;R9=R9+C,C为进位 SUBS R2,R2,#1 BNE loop_2 Stop B Stop END ;文件结束,第7章 汇编语言程序设计,实验一:基于ARM的汇编语言程序设计简介 要求:利用汇编语言实现控制两个LED循环点亮,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1