版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、微处理器系统结构与嵌入式系统设计第九章第九章 ARM程序设计程序设计9.1 ARM程序程序开发环境开发环境9.2 ARM汇编语言程序设计技术汇编语言程序设计技术1. 汇编语言程序汇编语言程序开发特点开发特点2. 汇编伪指令汇编伪指令3. 汇编语句格式汇编语句格式4. 汇编语言汇编语言程序结构程序结构及及实例实例9.3 ARM“汇编汇编+C”混合编程技术混合编程技术1. ARM工程及程序框架工程及程序框架2. C/C+语言和汇编语言的语言和汇编语言的混合编程混合编程2022-4-20符号定义符号定义、数据定义数据定义、汇编控制汇编控制、宏指令宏指令、其他其他符号符号、表达式和运算符表达式和运算符
2、第九章第九章 习题习题思考:思考:2424、6 6、7 7、914914作业:作业:5 5、8 8、151915192022-4-20第 九 章 结 束ARM常用开发环境常用开发环境一一基于基于Windows平台平台 ADS ,目前已经基本被替代,目前已经基本被替代 RealView Developer Suite(RVDS) Embedded Workbench for ARM(EWARM) ,IAR System公司,入门简单,授权费用高公司,入门简单,授权费用高 RealView Microcontroller Development Kit(MDK) ,Keil公司,多用于低端公司,多
3、用于低端ARM处理器开发处理器开发二二基于基于Linux平台平台 ARM-Linux-GCC,GNU公司,使用繁琐但不需授权费用公司,使用繁琐但不需授权费用 CodeWarrior IDERV DebuggerCodeWarrior IDE的主窗口的主窗口 RVD调试器主窗口调试器主窗口 汇编语言程序设计特点汇编语言程序设计特点1.汇编语言依赖汇编语言依赖机器硬件机器硬件,不同,不同CPU提供的汇编指令可能提供的汇编指令可能有很大的不同,因此汇编源程序几乎不具移植性;但汇有很大的不同,因此汇编源程序几乎不具移植性;但汇编语言程序速度快、效率高,更能发挥机器硬件的长处;编语言程序速度快、效率高,
4、更能发挥机器硬件的长处;2.汇编程序需要用户将汇编过程中需要的一些汇编程序需要用户将汇编过程中需要的一些辅助信息辅助信息明明确地写入源程序,如:内存逻辑段的划分情况、数据在确地写入源程序,如:内存逻辑段的划分情况、数据在内存中的存放情况,等等。这些信息的说明由汇编程序内存中的存放情况,等等。这些信息的说明由汇编程序指定相应的伪指令来完成,并不由指定相应的伪指令来完成,并不由CPU定义;定义;3. 伪指令伪指令是在汇编过程中执行的,因而不会在机器语言是在汇编过程中执行的,因而不会在机器语言程序中产生目标代码;只有程序中产生目标代码;只有CPU定义的定义的(助记符)指令(助记符)指令才会生成目标代
5、码,并在程序运行过程中执行;才会生成目标代码,并在程序运行过程中执行;汇编语言源程序汇编语言源程序机器语言程序机器语言程序(目标代码)(目标代码)汇编(汇编程序)汇编(汇编程序)高级语言源程序高级语言源程序编译或解释(编译程序)编译或解释(编译程序)8/524.源程序经汇编得到的目标代码实际上也是不能运源程序经汇编得到的目标代码实际上也是不能运行行的,还要经过系统的链接定位后才能生成真正的,还要经过系统的链接定位后才能生成真正的的可执行文件。可执行文件。 即一般用汇编语言开发应用软即一般用汇编语言开发应用软件时应依次完成以下几个步骤:件时应依次完成以下几个步骤:(1 1)编辑编辑得到源程序得到
6、源程序(2 2)汇编汇编得到目标代码(解决语法错误)得到目标代码(解决语法错误)(3 3)链接链接得到可执行文件(解决定位错误)得到可执行文件(解决定位错误) (4 4)调试调试得到功能正确的应用软件(解决逻辑错误)得到功能正确的应用软件(解决逻辑错误)(以上第(以上第2 24 4步任何一步有错都应返回到第步任何一步有错都应返回到第1 1步重来)步重来)9/52汇编语言、汇编语言源程序、目标程序、可执行程序汇编语言、汇编语言源程序、目标程序、可执行程序助记符指令、助记符指令、伪指令伪指令汇编、汇编器(汇编软件、汇编程序)汇编、汇编器(汇编软件、汇编程序)符号定义伪指令符号定义伪指令 符号类型符
7、号类型指示符指示符功能功能符号定义符号定义伪指令伪指令GBLA声明和初始化一个声明和初始化一个全局全局算术变量,初始值为算术变量,初始值为0GBLL声明和初始化一个全局逻辑变量,初始值为声明和初始化一个全局逻辑变量,初始值为FALSEGBLS声明和初始化一个全局字符串变量,初始值为空声明和初始化一个全局字符串变量,初始值为空LCLA声明和初始化一个声明和初始化一个局部局部算术变量,初始值为算术变量,初始值为0。局部算术变量只。局部算术变量只能在宏中进行声明。能在宏中进行声明。LCLL声明和初始化一个局部逻辑变量,初始值为声明和初始化一个局部逻辑变量,初始值为FALSE。局部逻辑变。局部逻辑变量
8、只能在宏中进行声明。量只能在宏中进行声明。LCLS声明和初始化一个局部字符串变量,初始值为空。局部字符串变声明和初始化一个局部字符串变量,初始值为空。局部字符串变量只能在宏中进行声明。量只能在宏中进行声明。SETA给一个局部或全局算术变量给一个局部或全局算术变量置值置值SETL给一个局部或全局逻辑变量置值给一个局部或全局逻辑变量置值SETS给一个局部或全局字符串变量置值给一个局部或全局字符串变量置值RLIST给寄存器集给寄存器集命名命名CN给一个协处理器寄存器命名给一个协处理器寄存器命名CP给一个特定协处理器命名,协处理器号为给一个特定协处理器命名,协处理器号为015DN给一个双精度给一个双精
9、度VFP寄存器命名寄存器命名SN给一个单精度给一个单精度VFP寄存器命名寄存器命名FN给一个特定的浮点寄存器命名给一个特定的浮点寄存器命名yyyy-M-d10/52GBLA Test1;声明全局数字变量声明全局数字变量Test1,赋值为,赋值为0 xaa Test1 SETA 0 xaaGBLL Test2;声明全局逻辑变量声明全局逻辑变量Test2,赋值为,赋值为“真真” Test2 SETL TRUEGBLS Test3;声明全局字符串变量为声明全局字符串变量为Test3,赋值为,赋值为Testing“ Test3 SETS Testing“LCLA Test4; 声明局部数字变量声明局部
10、数字变量Test4,赋值为,赋值为0 xaa Test3 SETA 0 xaaLCLL Test5; 声明局部逻辑变量声明局部逻辑变量Test5 ,赋值为,赋值为“真真” Test4 SETL TRUELCLS Test6;声明局部字符串变量声明局部字符串变量Test6 ,赋值为,赋值为Testing“ Test6 SETS Testing“RegList RLIST R0-R5, R8, R10; 声明寄存器列表声明寄存器列表RegList,LDM/STM指令可通过该名称访问寄存器列表指令可通过该名称访问寄存器列表yyyy-M-d11/52数据定义伪指令数据定义伪指令 数据定义数据定义伪指令
11、伪指令LTORG指定指定一个文字池用以保存数据一个文字池用以保存数据 或或MAP指定一个内存表的首址指定一个内存表的首址# 或或FIELD指定内存表中的各数据域的长度(一般在指定内存表中的各数据域的长度(一般在MAP之后)之后)% 或或SPACE指定一块存储器的长度并将其中单元初始化为指定一块存储器的长度并将其中单元初始化为0= 或或DCB分配分配一片连续的字节单元并一片连续的字节单元并初始化初始化分配一片连续的字节单元并用于存放代码分配一片连续的字节单元并用于存放代码& 或或DCD分配一片连续的字单元并初始化(字边界对齐)分配一片连续的字单元并初始化(字边界对齐)DCDU分配一片连续的字单元
12、并初始化(任意边界)分配一片连续的字单元并初始化(任意边界)DCDO分配一片连续的分配一片连续的字单元字单元,并初始化为到静态基址寄存器,并初始化为到静态基址寄存器R9R9的偏移量的偏移量(字边界对齐)(字边界对齐)DCFD分配一片连续的字单元给双精度浮点数并初始化(字边界对齐)分配一片连续的字单元给双精度浮点数并初始化(字边界对齐)分配一片连续的字单元给单精度浮点数并初始化(字边界对齐)分配一片连续的字单元给单精度浮点数并初始化(字边界对齐)DCFDU分配一片连续的字单元给双精度浮点数并初始化(任意边界)分配一片连续的字单元给双精度浮点数并初始化(任意边界)分配一片连续的字单元给单精度浮点数
13、并初始化(任意边界)分配一片连续的字单元给单精度浮点数并初始化(任意边界)DCFSDCFSUDCIDCQ分配一片连续的分配一片连续的8字节单元并初始化(字边界对齐)字节单元并初始化(字边界对齐)DCQU分配一片连续的分配一片连续的8字节单元并初始化(任意边界)字节单元并初始化(任意边界)DCW分配一片连续的半字单元并初始化(半字边界对齐)分配一片连续的半字单元并初始化(半字边界对齐)DCWU分配分配一片连续的半字单元并初始化(任意边界)一片连续的半字单元并初始化(任意边界)DATA标识标识代码段中的数据标号,该符号后是代码段中的数据标号,该符号后是DCBDCB等等yyyy-M-dStr DCB
14、 “This is a test!”; ; 分配一片连续的分配一片连续的字节字节存储单元并初始化存储单元并初始化Test2Data DCW 1, 2, 3; ; 分配一片连续的分配一片连续的半字半字存储单元并初始化存储单元并初始化DataTest DCD 4, 5, 6; ; 分配一片连续的分配一片连续的字字存储单元并初始化存储单元并初始化FdataTest DCFD 2E115, -5E7; ; 分配一片连续的分配一片连续的字字存储单元并初始化存储单元并初始化FdataTest DCFS 2E5, -5E-7; ; 分配一片连续的分配一片连续的字字存储单元并初始化存储单元并初始化DataTe
15、st DCQ 100; ; 分配一片连续的分配一片连续的8 8字节字节存储单元并初始化存储单元并初始化DataSpace SPACE 100; ; 分配连续分配连续100100个字节个字节存储单元并初始化为存储单元并初始化为0 0 定义一个首址为定义一个首址为4096(0 x1000)4096(0 x1000)的内存表,该表中包含的内存表,该表中包含5 5个字段:个字段:A(4Bytes)A(4Bytes)、B(4Bytes)B(4Bytes)、X(8Bytes)X(8Bytes)、Y(8Bytes)Y(8Bytes)、String(256Bytes)String(256Bytes)。 MAP
16、 0 x1000; ; 内存表首地址的值为内存表首地址的值为0 x10000 x1000A FIELD 4; ; 定义定义A A的长度为的长度为4 4字节,位置为字节,位置为0 x10000 x1000B FIELD 4 4; ; 定义定义B B的长度为的长度为4 4字节,位置为字节,位置为0 x10040 x1004X FIELD 8; ; 定义定义X X的长度为的长度为8 8字节,位置为字节,位置为0 x10080 x1008Y FIELD 8; ; 定义定义Y Y的长度为的长度为8 8字节,位置为字节,位置为0 x10100 x1010String FIELD 256; ; 定义定义St
17、ringString为为256256字节,位置为字节,位置为0 x10180 x1018LDR R6, A R6, A 基于绝对地基于绝对地址的内存表址的内存表仅可访问指令前仅可访问指令前/ /后后4KB4KB地址范围的数据字段地址范围的数据字段双精度双精度单精度单精度定义一个内存表,其首址为固定地址与定义一个内存表,其首址为固定地址与R9R9和,表中包含同样字段。和,表中包含同样字段。MAP MAP 0, R9 0, R9 ; ; 内存表首地址为内存表首地址为0 0与与R9R9寄存器内容的和寄存器内容的和A A FIELD FIELD 4 4; ; 定义定义A A的长度为的长度为4 4字节,
18、相对位置为字节,相对位置为0 0B B FIELD FIELD 4 4; ; 定义定义B B的长度为的长度为4 4字节,相对位置为字节,相对位置为4 4X X FIELD FIELD 8 8; ; 定义定义X X的长度为的长度为8 8字节,相对位置为字节,相对位置为8 8Y YFIELD FIELD 8 8; ; 定义定义Y Y的长度为的长度为8 8字节,相对位置为字节,相对位置为1616String String FIELD FIELD 256256; ; 定义定义StringString为为256256字节,相对位置为字节,相对位置为2424ADR ADR R9, DATASTARTR9,
19、 DATASTART;伪指令;伪指令ADR ADR 初始化初始化R9 R9 LDR LDR R5, B R5, B ; ; 相当于相当于LDR R5, R9, #4LDR R5, R9, #4可访问地址范围可访问地址范围超过超过4 KB4 KB的数据的数据基于相对地基于相对地址的内存表址的内存表定义一个内存表,其首址为定义一个内存表,其首址为PCPC的值,表中包含同样字段。的值,表中包含同样字段。Dstruc Dstruc SPACE SPACE 280280; ; 分配分配280280个字节单元个字节单元MAP MAP Dstruc Dstruc ; ; 内存表首地址为内存表首地址为Dstr
20、ucDstrucA A FIELDFIELD4 4; ; 定义定义A A的长度为的长度为4 4字节,相对位置为字节,相对位置为0 0B B FIELDFIELD4 4; ; 定义定义B B的长度为的长度为4 4字节,相对位置为字节,相对位置为4 4X X FIELDFIELD8 8; ; 定义定义X X的长度为的长度为8 8字节,相对位置为字节,相对位置为8 8Y Y FIELDFIELD8 8; ; 定义定义Y Y的长度为的长度为8 8字节,相对位置为字节,相对位置为1616String String FIELDFIELD256256; ; 定义定义StringString为为256256字
21、节,相对位置为字节,相对位置为2424LDR LDR R5, B R5, B ; ; 相当于相当于LDR R5, PC, #4LDR R5, PC, #4基于基于PCPC的的内存表内存表可访问地址范围不可访问地址范围不超过超过4 KB4 KB的数据的数据汇编控制伪指令汇编控制伪指令 GBLA Counter ; 声明全局的数字变量声明全局的数字变量Counter Counter SETA 3; 由变量由变量Counter控制循环次数控制循环次数WHILE Counter 10指令序列指令序列修改修改Counter的值的值WENDyyyy-M-d15/52助助记记符符指令功能描述指令功能描述IF
22、、ELSE和和ENDIF根据条件成立与否决定是否编译某个指令序列根据条件成立与否决定是否编译某个指令序列WHILE和和WEND根据条件成立与否决定是否循环编译某个指令序列根据条件成立与否决定是否循环编译某个指令序列MACRO和和MEND将一段代码用一个标号替代,可在程序中多次调用该段代码将一段代码用一个标号替代,可在程序中多次调用该段代码MEXIT从宏定义中跳转出去从宏定义中跳转出去宏和宏定义指令宏和宏定义指令 MACRO $标号标号 宏名宏名 $参数参数1,$参数参数2, 宏体宏体MEND MACRO MACRO和和MENDMEND伪指令可以嵌套使用。伪指令可以嵌套使用。 宏宏的使用方式和功
23、能与的使用方式和功能与子程序子程序有些相似。子程序有些相似。子程序可以提供模块化的程序设计、节省存储空间并提高可以提供模块化的程序设计、节省存储空间并提高运行速度,但在使用子程序结构时需要保护现场,运行速度,但在使用子程序结构时需要保护现场,从而增加了系统的开销。因此,在代码较短且需要从而增加了系统的开销。因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序。传递的参数较多时,可以使用宏指令代替子程序。yyyy-M-d16/52定义一条宏指令,使其可以完成测试定义一条宏指令,使其可以完成测试- -跳转操作。跳转操作。 MICRO ; 宏定义开始宏定义开始 $lable TestAn
24、dBranch $dest, $reg, $cc $lable CMP $reg, #0 B$cc $destMEND ; 宏定义结束宏定义结束 宏名宏名宏参宏参目标地址目标地址测试寄存器测试寄存器条件条件用于构造宏义用于构造宏义体内的标号体内的标号test TestAndBranch NonZero, R0, NE ;程序中的程序中的宏调用宏调用NonZerotest CMP R0, #0;程序汇编时宏展开;程序汇编时宏展开BNE NonZero;其它;其它指令序列指令序列NonZero ;其它指令序列;其它指令序列yyyy-M-d17/52MICRO ; 宏定义宏定义开始开始$lable
25、xmac $p1, $p2 ; 宏的名称为宏的名称为xmac,有两个参数,有两个参数$p1和和$p2$lable.loop1 ; $lable.loop1为宏定义体的内部标号为宏定义体的内部标号 BGE $lable.loop1$lable.loop2 指令指令 ; $lable.loop2为宏定义体的内部标号为宏定义体的内部标号 BL $p1 ; 参数参数$p1为一个子程序的名称为一个子程序的名称 BGT $lable.loop2 ADR $p2MEND ; 宏定义结束宏定义结束 abc xmac subr1, de ;宏调用宏调用,其中宏标号为,其中宏标号为abc,参数为参数为subr1,
26、de ;宏展开宏展开abc.loop1 BGE abc.loop1abc.loop2 BL subr1 BGT abc.loop2 ADR de 类似宏的类似宏的伪指令伪指令ADR , ADR , 将相对于程序或相对于寄存器的地址载入寄存器中将相对于程序或相对于寄存器的地址载入寄存器中MOV R0, #0 x18 ; MOV R0, #0 x18 ; 给给R0R0赋值用于查表赋值用于查表ADRADR R3, R3, JumpTableJumpTable ; ; 装载装载跳转表的首跳转表的首地址地址LDR PC, R3,R0,LSL#2 ; LDR PC, R3,R0,LSL#2 ; 查表,将查
27、到的地址赋给查表,将查到的地址赋给PCPCJumpTableJumpTableADR R3 JumpTableLDR PC,R3,R0,LSL#2xxxJumpTablexxxxxxJumpTable+72xxxPCR3JumpTablexxxLDR LDR , , / 将将3232位常数或地址载入寄存器位常数或地址载入寄存器数值常数数值常数exprexpr取值位于规定范围内时汇编器取值位于规定范围内时汇编器将会生成一个将会生成一个MOVMOV或或MVNMVN指令指令否则汇编器会将常数放入否则汇编器会将常数放入文字池文字池中,并会生中,并会生成一个相对于程序的成一个相对于程序的LDRLDR指令
28、,该指令可从指令,该指令可从文字池中读取此常数文字池中读取此常数LDRLDR R3,R3,=0 xFF00 xFF0; ; 把把立即数立即数0 xFF00 xFF0赋值给赋值给R3R3LDR LDR R2, R2,=place place ; ; 把把标号标号placeplace对应的地址赋值给对应的地址赋值给R2 R2 其它常用伪指令其它常用伪指令 其他常用其他常用的伪指令的伪指令 AREAALIGN从一个字边界开始从一个字边界开始指示汇编器汇编一段新的代码或数据部分指示汇编器汇编一段新的代码或数据部分CODE16指示汇编器将随后的指令作为指示汇编器将随后的指令作为16位位Thumb指令指令
29、CODE32指示汇编器将随后的指令作为指示汇编器将随后的指令作为32位位ARM指令指令END表示源程序的结束表示源程序的结束ENTRY指向程序的入口,一个源文件中只能有一个指向程序的入口,一个源文件中只能有一个ENTRY* 或或EQU对一个常量赋予一个符号名对一个常量赋予一个符号名EXPORT或或GLOBAL说明了由链接器在目标和库文件中使用的符号说明了由链接器在目标和库文件中使用的符号IMPORT或或EXTERN提供汇编器在当前汇编中未曾定义的符号名提供汇编器在当前汇编中未曾定义的符号名GET或或INCLUDE包含一个文件,在包含一个文件,在GET处汇编包含的文件处汇编包含的文件INCBIN
30、包含一个未被汇编过的文件包含一个未被汇编过的文件KEEP指示汇编器保留符号表中的局部符号指示汇编器保留符号表中的局部符号NOFP在汇编语言程序中禁止浮点指令在汇编语言程序中禁止浮点指令REQUIRE指示两段之间的依赖关系指示两段之间的依赖关系REQUIRE8指示当前文件请求堆栈为指示当前文件请求堆栈为8字节对准字节对准PRESERVE8指示当前文件保持堆栈为指示当前文件保持堆栈为8字节对准字节对准RN给特定的寄存器命名给特定的寄存器命名ROUT标记局部标号使用范围的界面标记局部标号使用范围的界面yyyy-M-d21/52AREA、ENTRY、END伪指令伪指令 AREA 段名段名属性属性1,属
31、性,属性2,定义代码段或数据段定义代码段或数据段 1.段名若以数字开头,则该段名需用段名若以数字开头,则该段名需用“|”括起来,如括起来,如|1_test|。 2.属性字段表示该代码或数据的相关属性,多个属性关键字以逗号分隔:属性字段表示该代码或数据的相关属性,多个属性关键字以逗号分隔:lCODE:用于定义代码段。:用于定义代码段。lDATA:用于定义数据段。:用于定义数据段。lREADONLY:指定本段为只读属性,代码段默认为:指定本段为只读属性,代码段默认为READONLY。lREADWRITE:指定本段为可读写属性,数据段默认为:指定本段为可读写属性,数据段默认为READWRITE。l
32、lALIGN 表达式:表达式取值为表达式:表达式取值为031。ELF(可执行连接文件可执行连接文件)的段默认按字对齐。的段默认按字对齐。l lCOMMON:定义一个通用段,各源文件中同名:定义一个通用段,各源文件中同名的的COMMON段共享同一段存储单元。段共享同一段存储单元。 一个汇编源程序至少包含一个段,程序太长时可分为多个段并用一个汇编源程序至少包含一个段,程序太长时可分为多个段并用AREA标示;标示;一个汇编源程序最多只能有一个一个汇编源程序最多只能有一个 (可以没有可以没有)ENTRY标示程序入口;标示程序入口;一个完整的汇编源程序中至少应有一个用一个完整的汇编源程序中至少应有一个用
33、ENTRY标示的入口,如有多个则程序的标示的入口,如有多个则程序的真正入口点由连接器指定;真正入口点由连接器指定;一个汇编源程序用一个汇编源程序用END标示源文件结束;标示源文件结束;AREA Init, CODE, READONLY;代码段代码段Init属性为只读属性为只读 ENTRY;指定应用程序的入口点指定应用程序的入口点指令序列指令序列END ;通知编译器源程序结束通知编译器源程序结束22/52ALIGN伪指令伪指令 ALIGN 表达式表达式,偏移量,偏移量 ALIGN伪指令可通过添加填充字节的方式,使当前位置伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式。其中:满足一定
34、的对其方式。其中:表达式可能的取值为表达式可能的取值为2的幂(如的幂(如1,2,4,8和和16等)。若等)。若未指定表达式则将当前位置对齐到下一个字的位置。未指定表达式则将当前位置对齐到下一个字的位置。若使用偏移量字段,则当前位置的对齐方式为:表达式若使用偏移量字段,则当前位置的对齐方式为:表达式+偏偏移量。移量。AREA Init, CODE, READONLY, ALIEN = 3 ; 指定后面的指令指定后面的指令 ;为为8字节对齐字节对齐 指令序列指令序列ENDyyyy-M-d23/52CODE16、CODE32伪指令伪指令 在在ARM指令和指令和Thumb指令混合编程的代码里,该伪指令
35、指令混合编程的代码里,该伪指令用于通知编译器其后的指令序列为用于通知编译器其后的指令序列为16位还是位还是32位。位。 注意它们只能控制编译方式,并不能切换处理器状态。注意它们只能控制编译方式,并不能切换处理器状态。AREA Init, CODE, READONLYCODE32 ; 通知编译器其后为通知编译器其后为32位的位的ARM指令指令 LDR R0, = NEXT + 1 ; 将跳转地址放入寄存器将跳转地址放入寄存器R0 BX R0 ; 程序跳转,并将处理器切换到程序跳转,并将处理器切换到Thumb状态状态CODE16 ; 通知编译器其后为通知编译器其后为16位的位的Thumb指令指令N
36、EXT LDR R3, = 0 x3FFEND ; 程序结束程序结束24/52EQU伪指令伪指令 名称名称 EQU 表达式表达式,类型,类型 用于为程序中的用于为程序中的常量和标号常量和标号等定义一个等效的字符名称,等定义一个等效的字符名称,类似于类似于C语言中的语言中的define。其中。其中EQU可用可用“*”代替。代替。 当表达式为当表达式为32位的常量时,其数据类型可以为位的常量时,其数据类型可以为CODE16,CODE32或或DATA三种类型之一。三种类型之一。Test EQU 50; 定义常量定义常量Test的值为的值为50Addr EQU 0 x55, CODE32 ; 定义标号
37、定义标号Addr的值为的值为0 x55,且该处为且该处为32位的位的ARM指令指令yyyy-M-d25/52EXPORT(或或GLOBAL) 标号标号WEAKIMPORT(或或EXTERN) 标号标号WEAK EXPORT用于声明一个全局标号,该标号可在其他文件中引用。用于声明一个全局标号,该标号可在其他文件中引用。 WEAK选项声明其他同名标号优先于该标号被引用。选项声明其他同名标号优先于该标号被引用。IMPORT用于通知编译器当前源文件可能要引用其他源文件中定义的标号。用于通知编译器当前源文件可能要引用其他源文件中定义的标号。 WEAK选项表示所有源文件都没有定义这个标号时编译器不会给出选
38、项表示所有源文件都没有定义这个标号时编译器不会给出 错误错误信息,在多数情况下将该标号置为信息,在多数情况下将该标号置为0。若该标号被。若该标号被B或或BL指令引用,则将指令引用,则将B或或BL指令置为指令置为NOP操作。操作。 使用使用IMPORT则标号一定会被加入到当前源文件的符号表中。使用则标号一定会被加入到当前源文件的符号表中。使用EXTERN则标号未被引用时不会被加入到当前源文件的符号表中。则标号未被引用时不会被加入到当前源文件的符号表中。标号在程序中区分大小写。标号在程序中区分大小写。 AREA Init1, CODE, READONLYEXPORT Main; 源文件源文件1声明
39、一个可全局引用的标号声明一个可全局引用的标号Main END AREA Init2, CODE, READONLYIMPORT Main ;源文件源文件2需要引用在别处定义的标号需要引用在别处定义的标号Main END26/52INCLUDE(或或GET)、INCBIN伪指令伪指令 INCLUDE 文件名文件名INCBIN 文件名文件名INCLUDE(或或GET)伪指令用于将一个伪指令用于将一个源文件源文件包含到当前的源文件中。包含到当前的源文件中。 被包含的源文件在当前位置进行汇编处理。被包含的源文件在当前位置进行汇编处理。INCBIN伪指令用于将一个伪指令用于将一个目标文件或数据文件目标文
40、件或数据文件包含到当前的源文件中包含到当前的源文件中 被包含的文件不作任何变动,编译器从其后开始继续被包含的文件不作任何变动,编译器从其后开始继续处理。处理。 AREA Init, CODE, READONLY GET C:a2.s; 通知编译器此处插入源文件通知编译器此处插入源文件C:a2.s INCBIN a1.dat; 通知编译器此处插入数据文件通知编译器此处插入数据文件a1.dat INCBIN C:a2.o; 通知编译器此处插入目标文件通知编译器此处插入目标文件C:a2.o END 编写汇编源程序时,常将一个源文件专门用于定义编写汇编源程序时,常将一个源文件专门用于定义宏指令宏指令(
41、MICROMICRO)、)、符号常量符号常量(EQUEQU),),结构化数据类型结构化数据类型(MAPMAP和和FIELDFIELD),然后再用),然后再用GETGET伪指令将这个源文件包含到其他源文件中伪指令将这个源文件包含到其他源文件中。汇编语言中常用的符号汇编语言中常用的符号 在汇编语言程序设计中,经常使用各种符在汇编语言程序设计中,经常使用各种符号代替号代替地址、变量和常量地址、变量和常量等,以增加程序的可等,以增加程序的可读性。尽管符号的命名由编程者决定,但并不读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定:是任意的,必须遵循以下的约定:l l 符号区分符号区分
42、大小写大小写,同名的大小写字母符号会,同名的大小写字母符号会被编译器认为是两个不同的符号;被编译器认为是两个不同的符号;l l 局部标号可以以数字开头,其他标号均不得局部标号可以以数字开头,其他标号均不得以数字开头;以数字开头;l l 符号在其符号在其作用范围作用范围内必须唯一;内必须唯一;l l 自定义的符号名不能与系统的自定义的符号名不能与系统的保留字保留字相同相同, ,如如指令或伪指令;指令或伪指令;常常 量量指其值在程序的运行过程中不能被改变的量指其值在程序的运行过程中不能被改变的量ARM(Thumb)汇编程序所支持的常量有汇编程序所支持的常量有数字常量数字常量、逻辑常量和字符串常量、
43、逻辑常量和字符串常量。l数字常量一般为数字常量一般为32位的整数,用位的整数,用“#”标识。标识。 当作为无符号数时,其取值范围为当作为无符号数时,其取值范围为0232-1 当作为有符号数时,其取值范围为当作为有符号数时,其取值范围为-231231-1l逻辑常量只有两种取值情况:逻辑常量只有两种取值情况:真真TURE或假或假FAUSE 。l字符串常量为一个固定的字符串,一般用于程序运行时的字符串常量为一个固定的字符串,一般用于程序运行时的信息提示。信息提示。yyyy-M-d29/52变变 量量 ARM(Thumb)汇编程序支持数字、逻辑和字符串变量。汇编程序支持数字、逻辑和字符串变量。可用可用
44、GBLAGBLA,GBLLGBLL和和GBLSGBLS伪指令声明全局变量,用伪指令声明全局变量,用LCLALCLA,LCLLLCLL和和LCLSLCLS伪指令声明局部变量,并可使用伪指令声明局部变量,并可使用SETASETA,SETLSETL和和SETSSETS对其进行初始化。对其进行初始化。变量可通过代换操作(变量可通过代换操作(“$”$”)获得一个常量:)获得一个常量:l数字变量前加数字变量前加“$” $” ,编译器会将其值转换为十六进制的字,编译器会将其值转换为十六进制的字符串,并用该十六进制的字符串代换符串,并用该十六进制的字符串代换“$”$”后的数字变量。后的数字变量。l逻辑变量前加
45、逻辑变量前加“$”$”,编译器会将该逻辑变量代换为其值,编译器会将该逻辑变量代换为其值( (真或假真或假) )。l字符串变量前加字符串变量前加“$”$”,编译器会用其值代换,编译器会用其值代换 “$”$”后的后的 字字符串变量。符串变量。LCLSLCLS S1 S1; ; 定义局部字符串变量定义局部字符串变量S1S1和和S2S2LCLS LCLS S2S2S1 S1 SETS SETS Test!Test!S2S2SETS SETS This is a $S1This is a $S1; S2; S2的值为的值为This is a Test!”This is a Test!”30/52算术算术
46、/逻辑表达式及运算符逻辑表达式及运算符算术算术/逻辑表达式由逻辑表达式由数字数字/逻辑变量、数字逻辑变量、数字/逻辑常量、运算符和括号逻辑常量、运算符和括号构成。构成。 X+Y和X-Y差XY乘X/Y除X:MOD:Y余运算次序的规定:运算次序的规定:l l 优先级相同的双目运算符的运算顺序为从左到右;优先级相同的双目运算符的运算顺序为从左到右;l l 相邻的单目运算符的运算顺序为从右到左,且单目运算符相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运算符;的优先级高于其他运算符;l括号运算符的优先级最高。括号运算符的优先级最高。X:ROL:YX循环左移Y位X:ROR:YX循环右
47、移Y位X:SHL:YX左移Y位X:SHR:YX右移Y位X:AND:Y按位逻辑与X:OR:Y按位逻辑或:NOT:Y按位逻辑非X:EOR:Y按位逻辑异或X = YX等于YX YX大于YX = YX大于等于YX = YX小于等于YX /= YX不等于YX YX不等于YX:LAND:Y逻辑与X:LOR:Y逻辑或:LNOT:Y逻辑非X:LEOR:Y逻辑异或31/52注意:这些运算在汇注意:这些运算在汇编过程中计算,机器编过程中计算,机器码中出现的已经是表码中出现的已经是表达式的值了。达式的值了。字符串表达式及运算符字符串表达式及运算符 字符串表达式一般由字符串表达式一般由字符串常量、字符串变量、运算符和
48、括号字符串常量、字符串变量、运算符和括号构成。构成。编译器支持的字符串最大长度为编译器支持的字符串最大长度为512512字节字节。 LEN:XLEN:X 返回字符串返回字符串X X的长度的长度( (字符数字符数) )。 CHR:MCHR:M 将将02550255之间的整数之间的整数M M转换为一个字符。转换为一个字符。 STR:XSTR:X 将数字或逻辑表达式将数字或逻辑表达式X X转换为一个字符串。转换为一个字符串。对于数字表达式,对于数字表达式,STRSTR运算得到一个以十六进制字符组成的字符串;运算得到一个以十六进制字符组成的字符串;对于逻辑表达式,对于逻辑表达式,STRSTR运算得到字
49、符串运算得到字符串“T T”或或“F F”。 X:LEFT:Y X:LEFT:Y 返回字符串返回字符串X X左端的子串。整数左端的子串。整数Y Y表示要返回的字符个数表示要返回的字符个数。 X:RIGHT:YX:RIGHT:Y 返回字符串返回字符串X X右端的子串。整数右端的子串。整数Y Y表示要返回的字符个数表示要返回的字符个数 X:CC:YX:CC:Y 将字符串将字符串Y Y连接到字符串连接到字符串X X的后面形成一个新字符串。的后面形成一个新字符串。yyyy-M-d32/52其它常用运算符其它常用运算符 ?X?X返回定义符号返回定义符号X X的代码行所生成的可执行代码的长度的代码行所生成
50、的可执行代码的长度(字节数)(字节数) :DEF:X:DEF:X 判断是否定义了符号判断是否定义了符号X X:如果符号:如果符号X X已经定义则结果已经定义则结果为真,否则为假。为真,否则为假。 BASE:X BASE:X 返回基于寄存器的表达式返回基于寄存器的表达式X X中寄存器的编号。中寄存器的编号。 INDEX:XINDEX:X 返回基于寄存器的表达式返回基于寄存器的表达式X X中相对于其基址寄存器的偏移中相对于其基址寄存器的偏移量。量。 yyyy-M-d33/52ARM汇编语言程序结构汇编语言程序结构 ARM(Thumb)ARM(Thumb)汇编语言程序中,以汇编语言程序中,以程序段(
51、代码段和数据段)程序段(代码段和数据段)为单位组织代码。为单位组织代码。 一个汇编程序至少应该有一个代码段。当程序较长时,可一个汇编程序至少应该有一个代码段。当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译连接时最以分割为多个代码段和数据段,多个段在程序编译连接时最终形成一个可执行的映象文件。终形成一个可执行的映象文件。可执行映象文件可执行映象文件通常由以下几部分构成:通常由以下几部分构成: l l 一个一个或多个代码段,代码段的属性默认为或多个代码段,代码段的属性默认为READONLYREADONLY。 l l 零个或多个包含初始化数据的数据段,数据段的属性默认为零个或多个包含初
52、始化数据的数据段,数据段的属性默认为READWRITEREADWRITE。 l l 零个或多个不包含初始化数据的数据段,数据段的属性为默认零个或多个不包含初始化数据的数据段,数据段的属性为默认为为READWRITEREADWRITE。yyyy-M-d34/52ARM汇编语言程序汇编语言程序段结构段结构GET option.sGET addr.s AREA Init,CODE,READONLY ENTRY LDRR0,=0 x0FMULR1,R0,R0 ENDAREAData1,DATA,READWRITE numDCD10 END引用其它源文件引用其它源文件代码段代码段数据段数据段ARM(Th
53、umb)汇编语句格式汇编语句格式 标号标号 指令或伪指令指令或伪指令; 注释注释 助记符可以全部用大写字母或全部用小写字母,助记符可以全部用大写字母或全部用小写字母,但不允许在一条指令中大小写字母混用。但不允许在一条指令中大小写字母混用。 如果一条语句太长,可将该长语句分为若干行如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用来书写,在行的末尾用“”表示下一行与本行为表示下一行与本行为同一条语句。同一条语句。 指令中可以出现常量、变量及表达式。指令中可以出现常量、变量及表达式。 AREA Init, CODE, READONLY ENTRYSTART LDR R0, = 0 x3F
54、F5000 LDR R1, 0 xFF STR R1, R0 LDR R0, = 0 x3FF5008 LDR R1, 0 x01 STR R1, R0 ENDAREAAREA伪指令定义一个段,伪指令定义一个段,并说明段的相关属性并说明段的相关属性ENTRYENTRY伪指令标识程序的入口点伪指令标识程序的入口点每一个汇编源文件都必须有一条每一个汇编源文件都必须有一条ENDEND伪指令,指示汇编的结束伪指令,指示汇编的结束伪指令伪指令LDR对于不能被对于不能被MOV和和MVN指令所读指令所读取的立即数取的立即数,将其变成常量进行读取。将其变成常量进行读取。存储单存储单元地址元地址标号标号STAR
55、TSTART代表第一条指令的存放地址代表第一条指令的存放地址38/ 32 AREA Block, CODE, READONLYnum EQU 20 ; 设置将要复制的字数设置将要复制的字数 ENTRY Start LDR R0, =src ; R0指向源数据区指向源数据区src LDR R1, =dst ; R1指向目标数据区指向目标数据区dst MOV R2, #num ; R2保存将要复制的字数保存将要复制的字数 MOV SP, #0 x400 ; 设置堆栈指针设置堆栈指针(R13)Blockcopy MOVS R3, R2, LSR #3 ; 需要进行的以需要进行的以8个字为单位的复制次
56、数个字为单位的复制次数 BEQ Copywords ; 对于剩下不足对于剩下不足8个字的数据,跳转到个字的数据,跳转到Copywords STMFD SP!, R4-R11 ; 将工作寄存器将工作寄存器R4-R11压入堆栈保存压入堆栈保存Octcopy LDMIA R0!, R4-R11 ; 从源数据区读取从源数据区读取8个字的数据,放入个字的数据,放入8个寄存器中个寄存器中 STMIA R1!, R4-R11 ; 将将8个寄存器中的数据写入目标数据区中个寄存器中的数据写入目标数据区中 SUBS R3, R3, #1 ; 将块复制次数减将块复制次数减1 BNE Octcopy ; 循环操作,直
57、到完成以循环操作,直到完成以8个字为单位的块复制个字为单位的块复制 LDMFD SP!, R4-R11 ; 从堆栈弹出恢复工作寄存器从堆栈弹出恢复工作寄存器R4-R11Copywords ANDS R2, R2, #7 ; 剩下不足剩下不足8个字的数据的字数个字的数据的字数 BEQ Stop ; 如果剩下数据的字数为如果剩下数据的字数为0,则数据复制完成,则数据复制完成Wordcopy LDR R3, R0, #4 ; 从源数据区读取从源数据区读取1个字的数据,放到个字的数据,放到R3寄存器中寄存器中 STR R3, R1, #4 ; 将将R3寄存器中的数据写入目标数据区中寄存器中的数据写入目
58、标数据区中 SUBS R2, R2, #1 ; 将字数减将字数减1 BNE Wordcopy ; 循环操作,直到完成以字为单位的数据复制循环操作,直到完成以字为单位的数据复制Stop MOV R0,#0 x18 ; LDR R1, =0 x20026 ; SWI 0 x123456 ; 从应用程序中退出从应用程序中退出 AREA BlockData, DATA, READWRITE ; 定义数据区定义数据区BlockDatasrc DCD 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7 ; 定义源数据区定义源数据区srcdst DCD 0, 0,
59、0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 定义目标数据区定义目标数据区dst END ; 结束汇编结束汇编数据块复制数据块复制; ;文件名:文件名:TEST1.S TEST1.S ; ;功能:实现两个寄存器相加功能:实现两个寄存器相加 ; ;说明:使用说明:使用ARMulateARMulate软件仿真调试软件仿真调试 AREAAREA Example1,CODE,READONLY;Example1,CODE,READONLY;声明代码段声明代码段Example1 Example1 ENTRYENTRY ; ;标识程序入口标识程序入口 CODE32CO
60、DE32 ; ;声明声明3232位位ARMARM指令指令START MOVSTART MOVR0,#0R0,#0 ; ;设置参数设置参数 MOVMOVR1,#10R1,#10LOOPLOOP BL BLADD_SUBADD_SUB ; ;调用子程序调用子程序ADD_SUB ADD_SUB B BLOOPLOOP ; ;循环循环ADD_SUBADD_SUB ADDS ADDSR0,R0,R1R0,R0,R1 ;R0 = R0 + R1 ;R0 = R0 + R1 MOV MOVPC,LRPC,LR ; ;子程序返回子程序返回 ENDEND ; ;文件结束文件结束 使用使用“;”进行注释进行注释标
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年黑龙江省七台河市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2021年吉林省松原市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2021年吉林省白城市公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2024年贵州省黔西南自治州公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 《淘宝网店运营》课件
- 2024年旋挖钻机项目项目投资申请报告代可行性研究报告
- 2023-2024学年部编版八年级下册期末语文模拟试卷 (十)(含解析)
- 2024年高速公路建设施工履约协议
- 2024年贷款购房离婚分割条款协议
- 2024版代加工合同模板
- 华师大版八年级下册数学全册课件
- 慢性高血压并发重度子痫前期1
- 常用工具的正确使用
- 管材管件供货计划、运输方案及保障措施及售后服务
- (2024年)肠梗阻完整版课件
- 国际视野开拓全球
- T-CARM 002-2023 康复医院建设标准
- 工程机械租赁服务方案及保障措施范本
- 2024年不良资产处置相关项目投资计划书
- 肠道支架植入术培训课件
- 数字政府建设行业分析
评论
0/150
提交评论