微处理器系统结构与嵌入式系统设计chap6

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

微处理器系统结构及嵌入式系统设计通信与信息工程学院无线通信与嵌入式系统实验室阎波2020/1/18第6章ARM程序设计一.汇编器和汇编程序二.ARM汇编器所支持的伪指令符号定义、数据定义、宏和宏指令、汇编控制、其他三.汇编语言的语句格式四.ARM汇编语言程序设计程序结构、子程序调用、程序实例五.ARM汇编语言与C/C++的混合编程1.ARM工程及程序框架2.C与汇编之间的函数调用3.C/C++语言和汇编语言的混合编程符号、表达式和运算符2/52第六章习题作业:3、4、6、8、12、14~19思考:1、2、10、132020-1-183/52第六章结束2020-1-184/52汇编语言程序设计特点1.汇编语言依赖于机器硬件,不同CPU提供的汇编指令可能有很大的不同,因此汇编源程序几乎不具有移植性;但汇编语言程序速度快、效率高,更能发挥机器硬件的长处;2.汇编程序需要用户将汇编过程中需要的一些信息明确地写入源程序,如:内存逻辑段的划分情况、数据在内存中的存放情况,等等。这些信息的说明由汇编程序指定相应的伪指令来完成,并不由CPU定义;3.伪指令是在汇编过程中执行的,因而不会在机器语言程序中产生目标代码;只有CPU定义的(助记符)指令才会生成目标代码,并在程序运行过程中执行;汇编语言源程序机器语言程序(目标代码)汇编(汇编程序)高级语言源程序编译或解释(编译程序)5/524.源程序经汇编得到的目标代码实际上也是不能运行的,还要经过系统的链接定位后才能生成真正的可执行文件(.EXE文件)。即一般用汇编语言开发应用软件时应依次完成以下几个步骤:(1)编辑得到源程序(2)汇编得到目标代码(解决语法错误)(3)链接得到可执行文件(解决定位错误)(4)调试得到功能正确的应用软件(解决逻辑错误)(以上第2~4步任何一步有错都应返回到第1步重来)汇编语言、汇编语言源程序、目标程序、可执行程序助记符指令、伪指令汇编、汇编器(汇编软件、汇编程序)2020-1-186/52符号定义伪指令符号类型指示符功能符号定义伪指令GBLA声明和初始化一个全局算术变量,初始值为0GBLL声明和初始化一个全局逻辑变量,初始值为{FALSE}GBLS声明和初始化一个全局字符串变量,初始值为空LCLA声明和初始化一个局部算术变量,初始值为0。局部算术变量只能在宏中进行声明。LCLL声明和初始化一个局部逻辑变量,初始值为{FALSE}。局部逻辑变量只能在宏中进行声明。LCLS声明和初始化一个局部字符串变量,初始值为空。局部字符串变量只能在宏中进行声明。SETA给一个局部或全局算术变量置值SETL给一个局部或全局逻辑变量置值SETS给一个局部或全局字符串变量置值RLIST给寄存器集命名CN给一个协处理器寄存器命名CP给一个特定协处理器命名,协处理器号为0~15DN给一个双精度VFP寄存器命名SN给一个单精度VFP寄存器命名FN给一个特定的浮点寄存器命名2020-1-187/52GBLATest1;声明全局数字变量Test1,赋值为0xaaTest1SETA0xaaGBLLTest2;声明全局逻辑变量Test2,赋值为“真”Test2SETL{TRUE}GBLSTest3;声明全局字符串变量为Test3,赋值为Testing“Test3SETSTesting“LCLATest4;声明局部数字变量Test4,赋值为0xaaTest3SETA0xaaLCLLTest5;声明局部逻辑变量Test5,赋值为“真”Test4SETL{TRUE}LCLSTest6;声明局部字符串变量Test6,赋值为Testing“Test6SETSTesting“RegListRLIST{R0-R5,R8,R10};声明寄存器列表RegList,LDM/STM指令可通过该名称访问寄存器列表2020-1-188/52数据定义伪指令数据定义伪指令LTORG指定一个文字池用以保存数据^或MAP指定一个内存表的首址#或FIELD指定内存表中的各数据域的长度(一般在MAP之后)%或SPACE指定一块存储器的长度并将其中单元初始化为0=或DCB分配一片连续的字节单元并初始化分配一片连续的字节单元并用于存放代码&或DCD分配一片连续的字单元并初始化(字边界对齐)DCDU分配一片连续的字单元并初始化(任意边界)DCDO分配一片连续的字单元,并初始化为到静态基址寄存器R9的偏移量(字边界对齐)DCFD分配一片连续的字单元给双精度浮点数并初始化(字边界对齐)分配一片连续的字单元给单精度浮点数并初始化(字边界对齐)DCFDU分配一片连续的字单元给双精度浮点数并初始化(任意边界)分配一片连续的字单元给单精度浮点数并初始化(任意边界)DCFSDCFSUDCIDCQ分配一片连续的8字节单元并初始化(字边界对齐)DCQU分配一片连续的8字节单元并初始化(任意边界)DCW分配一片连续的半字单元并初始化(半字边界对齐)DCWU分配一片连续的半字单元并初始化(任意边界)DATA标识代码段中的数据标号,该符号后是DCB等2020-1-18StrDCB“Thisisatest!”;分配一片连续的字节存储单元并初始化Test2DataDCW1,2,3;分配一片连续的半字存储单元并初始化DataTestDCD4,5,6;分配一片连续的字存储单元并初始化FdataTestDCFD2E115,-5E7;分配一片连续的字存储单元并初始化FdataTestDCFS2E5,-5E-7;分配一片连续的字存储单元并初始化DataTestDCQ100;分配一片连续的8字节存储单元并初始化DataSpaceSPACE100;分配连续100个字节存储单元并初始化为0定义一个首址为4096(0x1000)的内存表,该表中包含5个字段:A(4Bytes)、B(4Bytes)、X(8Bytes)、Y(8Bytes)、String(256Bytes)。MAP0x1000;内存表首地址的值为0x1000AFIELD4;定义A的长度为4字节,位置为0x1000BFIELD4;定义B的长度为4字节,位置为0x1004XFIELD8;定义X的长度为8字节,位置为0x1008YFIELD8;定义Y的长度为8字节,位置为0x1010StringFIELD256;定义String为256字节,位置为0x1018LDRR6,A基于绝对地址的内存表仅可访问指令前/后4KB地址范围的数据字段双精度单精度定义一个内存表,其首址为固定地址与R9和,表中包含同样字段。MAP0,R9;内存表首地址为0与R9寄存器内容的和AFIELD4;定义A的长度为4字节,相对位置为0BFIELD4;定义B的长度为4字节,相对位置为4XFIELD8;定义X的长度为8字节,相对位置为8YFIELD8;定义Y的长度为8字节,相对位置为16StringFIELD256;定义String为256字节,相对位置为24ADRR9,DATASTART;伪指令ADR初始化R9LDRR5,B;相当于LDRR5,[R9,#4]可访问地址范围超过4KB的数据基于相对地址的内存表定义一个内存表,其首址为PC的值,表中包含同样字段。DstrucSPACE280;分配280个字节单元MAPDstruc;内存表首地址为DstrucAFIELD4;定义A的长度为4字节,相对位置为0BFIELD4;定义B的长度为4字节,相对位置为4XFIELD8;定义X的长度为8字节,相对位置为8YFIELD8;定义Y的长度为8字节,相对位置为16StringFIELD256;定义String为256字节,相对位置为24LDRR5,B;相当于LDRR5,[PC,#4]基于PC的内存表可访问地址范围不超过4KB的数据宏和宏定义指令MACRO$标号宏名$参数1,$参数2,……宏体MENDMACRO和MEND伪指令可以嵌套使用。宏的使用方式和功能与子程序有些相似。子程序可以提供模块化的程序设计、节省存储空间并提高运行速度,但在使用子程序结构时需要保护现场,从而增加了系统的开销。因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序。2020-1-1812/52定义一条宏指令,使其可以完成测试-跳转操作。MICRO;宏定义开始$lableTestAndBranch$dest,$reg,$cc$lableCMP$reg,#0B$cc$destMEND;宏定义结束宏名宏参目标地址测试寄存器条件用于构造宏义体内的标号……testTestAndBranchNonZero,R0,NE;程序中的宏调用……NonZero……testCMPR0,#0;程序汇编时宏展开BNENonZero……;其它指令序列NonZero……;其它指令序列2020-1-1813/52MICRO;宏定义开始$lablexmac$p1,$p2;宏的名称为xmac,有两个参数$p1和$p2$lable.loop1;$lable.loop1为宏定义体的内部标号……BGE$lable.loop1$lable.loop2指令;$lable.loop2为宏定义体的内部标号BL$p1;参数$p1为一个子程序的名称BGT$lable.loop2……ADR$p2MEND;宏定义结束abcxmacsubr1,de;宏调用,其中宏标号为abc,参数为subr1,de……;宏展开abc.loop1……BGEabc.loop1abc.loop2BLsubr1BGTabc.loop2……ADRde14/52汇编控制伪指令汇编控制伪指令[或IF这三个符号连用,进行条件汇编IF逻辑表达式指令序列1ELSE指令序列2ENDIF|或ELSE]或ENDIFWHILE这二个符号连用,进行重复汇编WHILE逻辑表达式指令序列WENDWENDGBLACounter;声明全局的数字变量CounterCounterSETA3;由变量Counter控制循环次数……WHILECounter10指令序列修改Counter的值WEND2020-1-1815/52其它常用伪指令其他常用的伪指令AREAALIGN从一个字边界开始指示汇编器汇编一段新的代码或数据部分CODE16指示汇编器将随后的指令作为16位Thumb指令CODE32指示汇编器将随后的指令作为32位ARM指令END表示源程序的结束ENTRY指向程序的入口,一个源文件中只能有一个ENTRY*或EQU对一个常量赋予一个符号名EXPORT或GLOBAL说明了由链接器在目标和库文件中使用的符号IMPORT或EXTERN提供汇编器在当前汇编中未曾定义的符号名GET或INCLUDE包含一个文件,在GET处汇编包含的文件INCBIN包含一个未被汇编过的文件KEEP指示汇编器保留符号表中的局部符号NOFP在汇编语言程序中禁止浮点指令REQUIRE指示两段之间的依赖关系REQUIRE8指示当前文件请求堆栈为8字节对准PRESERVE8指示当前文件保持堆栈为8字节对准RN给特定的寄存器命名ROUT标记局部标号使用范围的界面2020-1-1816/52AREA、ENTRY、END伪指令AREA段名属性1,属性2,……定义代码段或数据段1.段名若以数字开头,则该段名需用“|”括起来,如|1_test|。2.属性字段表示该代码或数据的相关属性,多个属性关键字以逗号分隔:CODE:用于定义代码段。DATA:用于定义数据段。READONLY:指定本段为只读属性,代码段默认为READONLY。READWRITE:指定本段为可读写属性,数据段默认为READWRITE。ALIGN表达式:表达式取值为0~31。ELF(可执行连接文件)的段默认按字对齐。COMMON:定义一个通用段,各源文件中同名的COMMON段共享同一段存储单元。一个汇编源程序至少包含一个段,程序太长时可分为多个段并用AREA标示;一个汇编源程序最多只能有一个(可以没有)ENTRY标示程序入口;一个完整的汇编源程序中至少应有一个用ENTRY标示的入口,如有多个则程序的真正入口点由连接器指定;一个汇编源程序用END标示源文件结束

1 / 52
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功