您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 65第7章 汇编语言程序设计
1TM1大连理工大学软件学院邱铁办公楼409Tel:87571521E_mail:qiutie@dlut.edu.cn参考教材:《ARM嵌入式系统结构与编程》清华大学出版社2009年3月出版ARM嵌入式系统结构与编程2TM第7章汇编语言程序设计本章主要介绍ARM汇编语言程序设计规范,以及在汇编语言程序设计中所要注意的问题,最后以大量的实例说明汇编语言程序设计方法。3TM3内容提要7.1ARM编译环境下汇编语句7.2GNU环境下汇编语句与编译说明7.3ARM汇编语言程序设计规范7.4ARM汇编语言程序设计实例解析4TM47.1ARM编译环境下汇编语句ARM编译环境下进行汇编语言程序设计的格式汇编语句中的符号规则5TM5ARM编译环境下汇编语句格式ADS环境下ARM汇编语句格式如下:{symbol}{instruction}{;comment}{symbol}{directive}{;comment}{symbol}{pseudo-instruction}{;comment}6TM6ADS编译环境下汇编语句中符号规则1.符号命名规则(1)符号由大小写字母、数字、下划线组成,且符号是区分大小写的。(2)局部标号可以用数字开头,其他的标号不能。(3)符号在其作用范围内必须是唯一的。(4)程序中的符号不要与指令助记符或者伪操作同名。7TM72.常量(1)十进制数,如535、246。(2)十六进制数,如0x645、0xff00。(3)n_XXX,n表示n进制数,从2~9,XXX是具体的数字。例如:8_3777(4)字符常量用一对单引号括起来,包括一个单字符或者标准C中的转义字符。例如‘A’、‘\n’。(5)字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准C中的转义字符。如果需要使用双引号”或字符$,则必须用””和$$代替。8TM83.变量(1)数字变量(2)字符串变量(3)逻辑变量具体说明参考教材《ARM嵌入式系统结构与编程》第153页的说明9TM9`4.字符串表达式操作(1)取符串的长度LEN语法格式::LEN:A功能说明:返回字符串A的长度。10TM10(2)CHR语法格式::CHR:A功能说明:将A(A为某一字符的ASCII值)转换为单个字符。11TM11(3)STR语法格式::STR:A功能说明:将A(A为数字量或逻辑表达式)转换成字符串。12TM12(4)LEFT语法格式:A:LEFT:B功能说明:返回字符串A最左端B(B为返回长度)长度的字符串。13TM13(5)RIGHT返回一个字符串最右端一定长度的字符串:A:RIGHT:B功能说明:返回字符串A最右端B(B为返回长度)长度的字符串。14TM14(6)CC用于连接两个字符串,B串接到A串后面:A:CC:B15TM155.地址标号1)PC相关标号2)寄存器相关标号3)绝对地址16TM166.局部标号局部标号的语法格式如下:n{routname}17TM17被引用的局部标号语法规则是:%{F∣B}{A∣T}n{routname}其中:n是局部标号的数字号。routname是当前局部范围的名称。%表示引用操作。F指示汇编器只向前搜索。B指示汇编器只向后搜索。A指示汇编器搜索宏的所有嵌套层次。T指示汇编器搜索宏的当前层次。18TM187.2GNU环境下汇编语句与编译说明GNU环境下ARM汇编语言程序设计主要是面对在ARM平台上进行嵌入式LINUX的开发。GNU标准中提供了支持ARM汇编语言的汇编器as(arm-elf-as)、交叉编译器gccld(arm-elf-gcc)和链接器ld(arm-elf-ld)。19TM197.2.1GNU环境下ARM汇编语句格式GNU环境下ARM汇编语言语句格式如下:{label:}{instruction}{@comment}{label:}{directive}{@comment}{label:}{pseudo-instruction}{@comment}20TM207.2.2GNU环境下ARM汇编程序编译(1)预处理GNU汇编器as的内部预处理包括:移除多余的间隔符代码中的所有注释,并将字符常量转换为数字值。它不作宏处理和文件包含处理,但这些事情可以交由gcc编译器去做,文件包含可以用.include伪指令来实现。21TM21(2)注释GNUARMAssembly可识别的注释方式有:C风格多行注释符/*...*/GNU单行注释符“@”或“#”。(3)符号与C语言基本一致,符号名由字母、数字以及'_'、和'.'组成,大小写敏感。22TM222.段与重定位链接器ld用于把多个目标文件合并为一个可执行文件。汇编器as生成的目标文件都假定从地址0开始,ld为其指定最终的地址。链接器ld把目标文件中的每个section都作为一个整体,为其分配运行的地址23TM2324TM243.符号说明(1)labellable后面要带冒号‘:’,例如:_start:breset_handler。25TM25(2)给符号赋值(3)符号名具体说明请参阅教材《ARM嵌入式系统结构与编程》第158页26TM267.3ARM汇编语言程序设计规范汇编器预定义的寄存器名称ARM汇编语言程序设计规范27TM27汇编器预定义的寄存器名称R0~R15ARM处理器的通用寄存器A1~A4入口参数、处理结果、暂存寄存器;是R0~R3的同义词V1~V8变量寄存器,R4~R11SB静态基址寄存器,R9SL栈界限寄存器,R10FP帧指针寄存器,R11IP内部过程调用暂存寄存器,R12SP栈指针寄存器,R13LR链接寄存器,R14PC程序计数器,R15CPSR当前程序状态寄存器SPSR程序状态备份寄存器F0~F7浮点数运算加速寄存器S0~S31单精度向量浮点数运算寄存器D0~D15双精度向量浮点数运算寄存器P0~P15协处理器0~15C0~C15协处理器寄存器0~1528TM28ARM汇编语言程序设计规范要提高软件质量必须降低编码阶段的错误率,这需要制定详细的软件编程规范,并培训每一位程序员,最终的结果可以把编码阶段的错误降至10%左右,同时会大大的缩短测试时间。29TM291.符号命名规则2.注释3.程序设计的其它要求这三方面的规范要求请参阅教材《ARM嵌入式系统结构与编程》159页30TM307.4ARM汇编语言程序设计实例解在嵌入式系统编程中,与硬件直接相关的最底层代码要用汇编语言来编写;本节中所设计的实例,意在帮助读者对嵌入式汇编语言程序设计打下坚实的基础,同时也为嵌入式硬件底层编程做准备。31TM31示例解析求一个数的阶乘(64位结果)MOVR8,#20@低32位初始化为20MOVR9,#0@高位初始化为0SUBR0,R8,#1@初始化计数器Loop:MOVR1,R9@暂存高位值UMULLR8,R9,R0,R8@[R9:R8]=R0*R8MLAR9,R1,R0,R9@R9=R1*R0+R9SUBSR0,R0,#1@计数器递减BNELoop@计数器不为0继续循环32TM32先对内存地址0x3000开始的100个字内存单元填入0x10000001~0x10000064字数据,然后将每个字单元进行64位累加结果保存于[R9:R8]。(R9中存放高32位)33TM33_start:MOVR0,#0X3000@初始化寄存器MOVR1,#0X10000001MOVR2,#100loop_1:@第一次循环赋值STRR1,[R0],#4ADDR1,R1,#1SUBSR2,R2,#1BNEloop_134TM34MOVR0,#0X3000MOVR2,#100MOVR9,#0MOVR8,#0loop_2:@第二次循环累加LDRR1,[R0],#4ADDSR8,R1,R8@R8=R8+R1,进位影响标志位ADCR9,R9,#0@R9=R9+C,C为进位SUBSR2,R2,#1BNEloop_235TM35在ARM集成开发环境下编程:AREAFctrl,CODE,READONLY;声明代码FctrlENTRY;标识程序入口CODE32;声明32位ARM指令……StopBStopEND;文件结束36TM36下面的代码段将寄存器R0中的数据存储方式转换成另一种存储方式。指令执行前,R0中的数据存储方式为:R0=A,B,C,D;指令执行后为:R0=D,C,B,AEORR1,R0,R0,ROR#16;BICR1,R1,#0xFF0000;MOVR0,R0,ROR#8;EORR0,R0,R1,LSR#8;37TM37其余实例分请参阅教材《ARM嵌入式系统结构与编程》7.4节38TM第7章汇编语言程序设计TheEnd
本文标题:65第7章 汇编语言程序设计
链接地址:https://www.777doc.com/doc-3177171 .html