第7章 汇编语言程序设计_第1页
第7章 汇编语言程序设计_第2页
第7章 汇编语言程序设计_第3页
第7章 汇编语言程序设计_第4页
第7章 汇编语言程序设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、大连理工大学软件学院 邱铁 办公楼409 Tel:87571521 E_mail: 参考教材:ARM嵌入式系统结构与编程 清华大学出版社2009年3月出版,ARM嵌入式系统结构与编程,第7章汇编语言程序设计,本章主要介绍ARM汇编语言程序设计规范,以及在汇编语言程序设计中所要注意的问题,最后以大量的实例说明汇编语言程序设计方法。,内容提要,71 ARM编译环境下汇编语句 72 GNU环境下汇编语句与编译说明 73 ARM汇编语言程序设计规范 74 ARM汇编语言程序设计实例解析,71ARM编译环境下汇编语句,ARM编译环境下进行汇编语言程序设计的格式 汇编语句中的符号规则,ARM编译环境下汇编

2、语句格式,ADS环境下ARM汇编语句格式如下: symbol instruction;comment symbol directive;comment symbol pseudo-instruction;comment,ADS编译环境下汇编语句中符号规则 1.符号命名规则 (1)符号由大小写字母、数字、下划线组成,且符号是区分大小写的。 (2)局部标号可以用数字开头,其他的标号不能。 (3)符号在其作用范围内必须是唯一的。 (4)程序中的符号不要与指令助记符或者伪操作同名。,2.常量 (1)十进制数,如535、246。 (2)十六进制数,如0 x645、0 xff00。 (3)n_XXX, n

3、表示n进制数,从29,XXX是具体的数字。例如:8_3777 (4)字符常量用一对单引号括起来,包括一个单字符或者标准C中的转义字符。例如A、n。 (5)字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准C中的转义字符。 如果需要使用双引号”或字符$,则必须用”和$代替。,3.变量 (1)数字变量 (2)字符串变量 (3)逻辑变量 具体说明参考教材ARM嵌入式系统结构与编程第153页的说明,4.字符串表达式操作 (1)取符串的长度LEN 语法格式: :LEN: A 功能说明:返回字符串A的长度。,(2)CHR 语法格式: :CHR: A 功能说明:将A(A为某一字符的ASCII值)转

4、换为单个字符。,(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,5.地址标号 1)PC相关标号 2)寄存器相关标号 3)绝对地址,6.局部标号 局部标号的语法格式如下: n routname,被引用的局部标号语法规则是: %

5、 FB AT n routname 其中: n是局部标号的数字号。 routname是当前局部范围的名称。 %表示引用操作。 F指示汇编器只向前搜索。 B指示汇编器只向后搜索。 A指示汇编器搜索宏的所有嵌套层次。 T指示汇编器搜索宏的当前层次。,72GNU环境下汇编语句与编译说明,GNU环境下ARM汇编语言程序设计主要是面对在ARM平台上进行嵌入式LINUX的开发。 GNU标准中提供了支持ARM汇编语言的汇编器as(arm-elf-as)、交叉编译器gcc ld(arm-elf-gcc)和链接器ld(arm-elf-ld)。,721GNU环境下ARM汇编语句格式,GNU环境下ARM汇编语言语句

6、格式如下: label : instructioncomment label :directivecomment label : pseudo-instructioncomment,722GNU环境下ARM汇编程序编译,(1) 预处理 GNU汇编器as的内部预处理包括:移除多余的间隔符代码中的所有注释,并将字符常量转换为数字值。它不作宏处理和文件包含处理,但这些事情可以交由gcc编译器去做,文件包含可以用.include伪指令来实现。,(2) 注释 GNU ARM Assembly可识别的注释方式有: C风格多行注释符/* . */ GNU单行注释符“”或“#”。 (3) 符号 与C语言基本一

7、致,符号名由字母、数字以及_、和.组成,大小写敏感。,2段与重定位 链接器ld用于把多个目标文件合并为一个可执行文件。 汇编器as生成的目标文件都假定从地址0开始,ld为其指定最终的地址。 链接器ld把目标文件中的每个section都作为一个整体,为其分配运行的地址,3符号说明 (1)label lable后面要带冒号:,例如:_start: b reset_handler。,(2)给符号赋值 (3)符号名 具体说明请参阅教材ARM嵌入式系统结构与编程第158页,73ARM汇编语言程序设计规范,汇编器预定义的寄存器名称 ARM汇编语言程序设计规范,汇编器预定义的寄存器名称,ARM汇编语言程序设

8、计规范,要提高软件质量必须降低编码阶段的错误率,这需要制定详细的软件编程规范,并培训每一位程序员,最终的结果可以把编码阶段的错误降至10%左右,同时会大大的缩短测试时间。,1.符号命名规则 2注释 3程序设计的其它要求 这三方面的规范要求请参阅教材ARM嵌入式系统结构与编程 159页,74ARM汇编语言程序设计实例解,在嵌入式系统编程中,与硬件直接相关的最底层代码要用汇编语言来编写; 本节中所设计的实例,意在帮助读者对嵌入式汇编语言程序设计打下坚实的基础,同时也为嵌入式硬件底层编程做准备。,示例解析,求一个数的阶乘(64位结果) MOVR8 , #20低32位初始化为20 MOVR9 , #0

9、高位初始化为0 SUBR0,R8,#1初始化计数器 Loop: MOVR1 , R9暂存高位值 UMULLR8 , R9 , R0 , R8R9:R8=R0*R8 MLAR9 , R1 , R0 , R9R9=R1*R0+R9 SUBSR0 , R0 , #1计数器递减 BNELoop计数器不为0继续循环,先对内存地址0 x3000开始的100个字内存单元填入0 x100000010 x10000064字数据,然后将每个字单元进行64位累加结果保存于R9:R8。(R9中存放高32位),_start: MOVR0 , #0X3000初始化寄存器 MOVR1 , #0X10000001 MOVR2

10、 , #100 loop_1:第一次循环赋值 STRR1 , R0,#4 ADDR1 , R1,#1 SUBSR2 , R2,#1 BNEloop_1,MOVR0 , #0X3000 MOVR2 , #100 MOVR9 , #0 MOVR8 , #0 loop_2:第二次循环累加 LDRR1 , R0,#4 ADDSR8 , R1,R8R8=R8+R1,进位影响标志位 ADCR9 , R9 , #0R9=R9+C,C为进位 SUBSR2 , R2 , #1 BNEloop_2,在ARM集成开发环境下编程: AREA Fctrl, CODE, READONLY ; 声明代码Fctrl ENTRY ; 标识程序入口 CODE32 ; 声明32 位ARM 指令 Stop BStop END;文件结束,下面的代码段将寄存器R0中的数据存储方式转换成另一种存储方式。指令执行前,R0中的数据存储方式为:R0

温馨提示

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

评论

0/150

提交评论