370 likes | 472 Views
ARM 嵌入式系统结构与编程. 大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut.edu.cn 参考教材: 《ARM 嵌入式系统结构与编程 》 清华大学出版社 2009 年 3 月出版. 本章主要介绍 ARM 汇编语言程序设计规范,以及在汇编语言程序设计中所要注意的问题,最后以大量的实例说明汇编语言程序设计方法。. 第 7 章 汇编语言程序设计. 内容提要. 7 . 1 ARM 编译环境下汇编语句 7 . 2 GNU 环境下汇编语句与编译说明 7 . 3 ARM 汇编语言程序设计规范
E N D
ARM嵌入式系统结构与编程 • 大连理工大学软件学院 邱铁 办公楼409 Tel:87571521 E_mail: qiutie@dlut.edu.cn 参考教材:《ARM嵌入式系统结构与编程》 清华大学出版社2009年3月出版
本章主要介绍ARM汇编语言程序设计规范,以及在汇编语言程序设计中所要注意的问题,最后以大量的实例说明汇编语言程序设计方法。本章主要介绍ARM汇编语言程序设计规范,以及在汇编语言程序设计中所要注意的问题,最后以大量的实例说明汇编语言程序设计方法。 第7章 汇编语言程序设计
内容提要 • 7.1 ARM编译环境下汇编语句 • 7.2 GNU环境下汇编语句与编译说明 • 7.3 ARM汇编语言程序设计规范 • 7.4 ARM汇编语言程序设计实例解析
7.1 ARM编译环境下汇编语句 • ARM编译环境下进行汇编语言程序设计的格式 • 汇编语句中的符号规则
ARM编译环境下汇编语句格式 • ADS环境下ARM汇编语句格式如下: • {symbol} {instruction} {;comment} • {symbol} {directive} {;comment} • {symbol}{ pseudo-instruction} {;comment}
ARM编译环境下汇编语句中符号规则 • 1.符号命名规则 • (1)符号由大小写字母、数字、下划线组成,且符号是区分大小写的。 • (2)局部标号可以用数字开头,其他的标号不能。 • (3)符号在其作用范围内必须是唯一的。 • (4)程序中的符号不要与指令助记符或者伪操作同名。
2.常量 • (1)十进制数,如535、246。 • (2)十六进制数,如0x645、0xff00。 • (3)n_XXX, n表示n进制数,从2~9,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值)转换为单个字符。
(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}
被引用的局部标号语法规则是: • % {F∣B} {A∣T} n {routname} • 其中: • n是局部标号的数字号。 • routname是当前局部范围的名称。 • %表示引用操作。 • F指示汇编器只向前搜索。 • B指示汇编器只向后搜索。 • A指示汇编器搜索宏的所有嵌套层次。 • T指示汇编器搜索宏的当前层次。
7.2 GNU环境下汇编语句与编译说明 • GNU环境下ARM汇编语言程序设计主要是面对在ARM平台上进行嵌入式LINUX的开发。 • GNU标准中提供了支持ARM汇编语言的汇编器as(arm-elf-as)、交叉编译器gcc ld(arm-elf-gcc)和链接器ld(arm-elf-ld)。
7.2.1 GNU环境下ARM汇编语句格式 • GNU环境下ARM汇编语言语句格式如下: • {label :} {instruction} {@comment} • {label :} {directive} {@comment} • {label :} { pseudo-instruction} {@comment}
7.2.2 GNU环境下ARM汇编程序编译 • (1) 预处理 • GNU汇编器as的内部预处理包括:移除多余的间隔符代码中的所有注释,并将字符常量转换为数字值。它不作宏处理和文件包含处理,但这些事情可以交由gcc编译器去做,文件包含可以用.include伪指令来实现。
(2) 注释 • GNU ARM Assembly可识别的注释方式有:C风格多行注释符/* ... */或GNU单行注释符“@”或“#”。 • (3) 符号 • 与C语言基本一致,符号名由字母、数字以及'_'、和'.'组成,大小写敏感。
2.段与重定位 • 链接器ld用于把多个目标文件合并为一个可执行文件。汇编器as生成的目标文件都假定从地址0开始,ld为其指定最终的地址。链接器ld把目标文件中的每个section都作为一个整体,为其分配运行的地址
3.符号说明 • (1)label • lable后面要带冒号‘:’,例如:_start: b reset_handler。
(2)给符号赋值 • (3)符号名 • 具体说明请参阅教材《ARM嵌入式系统结构与编程》第158页
7.3 ARM汇编语言程序设计规范 • 汇编器预定义的寄存器名称 • ARM汇编语言程序设计规范
ARM汇编语言程序设计规范 • 要提高软件质量必须降低编码阶段的错误率,这需要制定详细的软件编程规范,并培训每一位程序员,最终的结果可以把编码阶段的错误降至10%左右,同时会大大的缩短测试时间。
1.符号命名规则 • 2.注释 • 3.程序设计的其它要求 • 这三方面的规范要求请参阅教材《ARM嵌入式系统结构与编程》159页
7.4 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=R1*R0+R9 • SUBS R0 , R0 , #1 @计数器递减 • BNE Loop @计数器不为0继续循环
先对内存地址0x3000开始的100个字内存单元填入0x10000001~0x10000064字数据,然后将每个字单元进行64位累加结果保存于[R9:R8]。(R9中存放高32位)先对内存地址0x3000开始的100个字内存单元填入0x10000001~0x10000064字数据,然后将每个字单元进行64位累加结果保存于[R9:R8]。(R9中存放高32位)
_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
在ARM集成开发环境下编程: • AREA Fctrl, CODE, READONLY ; 声明代码Fctrl • ENTRY ; 标识程序入口 • CODE32 ; 声明32 位ARM 指令 • …… • Stop • B Stop • END ;文件结束
其余实例分请参阅教材《ARM嵌入式系统结构与编程》7.4节其余实例分请参阅教材《ARM嵌入式系统结构与编程》7.4节
第7章 汇编语言程序设计 The End