嵌入式系统基础 第5章--ARM汇编_第1页
嵌入式系统基础 第5章--ARM汇编_第2页
嵌入式系统基础 第5章--ARM汇编_第3页
嵌入式系统基础 第5章--ARM汇编_第4页
嵌入式系统基础 第5章--ARM汇编_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

1、共96页1第第5 5章章 ARMARM汇编汇编本章主要内容本章主要内容1 1、汇编、汇编器和汇编语言程序的基本、汇编、汇编器和汇编语言程序的基本概念概念2 2、ARMARM汇编语言中的符号汇编语言中的符号 3 3、ARMARM的伪指令、宏的伪指令、宏4 4、汇编语句格式、汇编语句格式共96页25 5、ARMARM汇编语言中的表达式及运算符汇编语言中的表达式及运算符共96页35.1 5.1 汇编器与汇编语言汇编器与汇编语言 ARM ARM编译器支持汇编语言的程序设计编译器支持汇编语言的程序设计和和C/C+C/C+语言的程序设计,以及两者两者语言的程序设计,以及两者两者的混合编程。的混合编程。1

2、1、什么叫汇编语言、什么叫汇编语言 汇编语言汇编语言(Assembly Language)(Assembly Language)是面是面向机器的程序设计语言。向机器的程序设计语言。共96页4 在汇编语言中,用助记符在汇编语言中,用助记符(Memoni)(Memoni)代代替操作码,用地址符号替操作码,用地址符号(Symbol)(Symbol)或标号或标号(Label)(Label)代替地址码。这样用符号代替机代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。汇编语言。于是汇编语言亦称为符号语言。 2 2、汇

3、编语言的优点、汇编语言的优点共96页5 汇编语言比机器语言易于读写、易于汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不赖于具体的机型,不能通用,也不能在不同机型之间移植。同机型之间移植。 3 3、什么叫汇编器、什么叫汇编器共96页6 使用汇编语言编写的程序,机器不能直使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成接识别,要由一种程序将汇

4、编语言翻译成机器语言,这种起翻译作用的程序叫汇编机器语言,这种起翻译作用的程序叫汇编程序(也叫汇编器),汇编程序是系统软程序(也叫汇编器),汇编程序是系统软件中语言处理系统软件。件中语言处理系统软件。4 4、什么叫汇编、什么叫汇编 汇编程序把汇编语言翻译成机器语言汇编程序把汇编语言翻译成机器语言的过程称为汇编。的过程称为汇编。共96页75 5、汇编语言程序、汇编器和机器码程序、汇编语言程序、汇编器和机器码程序之间的关系之间的关系共96页86 6、什么是伪指令、什么是伪指令 人们设计了一些专门用于指导汇编器人们设计了一些专门用于指导汇编器进行汇编工作的指令,由于这些指令不形进行汇编工作的指令,由

5、于这些指令不形成机器码指令,它们只是在汇编器进行汇成机器码指令,它们只是在汇编器进行汇编工作的过程中起作用,所以被叫做伪指编工作的过程中起作用,所以被叫做伪指令。令。7 7、什么叫宏、什么叫宏共96页9 为了提高编程效率和增强程序的可读为了提高编程效率和增强程序的可读性,有设计了一些宏。性,有设计了一些宏。8 8、什么叫汇编语言程序、什么叫汇编语言程序 用汇编语言编写的程序叫做汇编语言用汇编语言编写的程序叫做汇编语言程序。程序。9 9、什么叫目标程序、什么叫目标程序 自源程序翻译成的机器码程序就叫做自源程序翻译成的机器码程序就叫做目标程序。目标程序。共96页105.2 ARM5.2 ARM伪指

6、令伪指令 在在ARMARM汇编程序语言中,有如下几种汇编程序语言中,有如下几种伪指令:伪指令: 段定义、符号定义、数据定义、数段定义、符号定义、数据定义、数据缓冲池定义、数据表定义、数据空间据缓冲池定义、数据表定义、数据空间分配、汇编控制伪指令以及其他伪指令。分配、汇编控制伪指令以及其他伪指令。5.2.1 5.2.1 段定义伪指令段定义伪指令共96页11 段定义伪指令的格式为:段定义伪指令的格式为:AREA ,AREA , SectionnameSectionname:段名,若段名以数字开头,:段名,若段名以数字开头,则必须用符号则必须用符号“| |”扩起来,如扩起来,如|1_test|1_t

7、est|。 attrattr:属性字段,多个属性字段用逗号分:属性字段,多个属性字段用逗号分隔。隔。共96页12属性属性含义含义备注备注CODECODE代码段代码段默认读默认读/ /写属性为写属性为READONLYREADONLYDATADATA数据段数据段默认属性为默认属性为READWRITEREADWRITEREADONLYREADONLY本段为只读本段为只读READWRITEREADWRITE本段为可读可写本段为可读可写ALIGNALIGN表达式表达式 多源文件共享段多源文件共享段ELFELF的代码段和数据段的代码段和数据段为字对齐为字对齐COMMONCOMMON多源文件共享段多源文件共

8、享段共96页13 AREA Init, CODE,READONLYAREA Init, CODE,READONLY ; 程序段程序段 该伪指令定义了一个代码段,段名为该伪指令定义了一个代码段,段名为InitInit,属性为只读。,属性为只读。 一个汇编语言程序至少要有一个段。一个汇编语言程序至少要有一个段。5.2.2 5.2.2 符号定义伪指令符号定义伪指令 符号的命名由编程者决定,但必须遵符号的命名由编程者决定,但必须遵循以下约定:循以下约定:共96页14(1 1)符号区分大小写,同名的大、小写符)符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。号会被编译器认为是两个不同的

9、符号。(2 2)符号在其作用范围内必须唯一。)符号在其作用范围内必须唯一。(3 3)自定义的符号不能与系统保留字相)自定义的符号不能与系统保留字相同。同。(4 4)符号不应与指令或伪指令同名)符号不应与指令或伪指令同名1 1、定义全局变量伪指令、定义全局变量伪指令GBLAGBLA、GBLLGBLL和和GBLSGBLS共96页15 GBLA GBLA、GBLLGBLL和和GBLSGBLS伪指令用于定义一伪指令用于定义一个个ARMARM程序中的全局变量,并将其初始化。程序中的全局变量,并将其初始化。GBLA(GBLLGBLA(GBLL和和GBLS) GBLS) variblevarible为变量名

10、称。为变量名称。GBLAGBLA定义一个全局数字变量,其默认初定义一个全局数字变量,其默认初值为值为0 0。共96页16GBLLGBLL定义一个全局逻辑变量,其默认初定义一个全局逻辑变量,其默认初值为值为F F(假)。(假)。GBLSGBLS定义一个全局字符串变量,其默认定义一个全局字符串变量,其默认初值为空。初值为空。GBLA Test1 GBLA Test1 ;定义一个全局数字变量,;定义一个全局数字变量,变量名为变量名为Test1Test1GBLL Test2 GBLL Test2 ;定义一个全局逻辑变量,;定义一个全局逻辑变量,变量名为变量名为Test2Test2共96页17GBLS

11、Test1 GBLS Test1 ;定义一个全局字符串变;定义一个全局字符串变量,变量名为量,变量名为Test3Test3 全局变量的变量名在整个程序范围内全局变量的变量名在整个程序范围内必须具有唯一性。必须具有唯一性。2 2、定义局部变量位指令、定义局部变量位指令LCLALCLA、LCLLLCLL和和LCLSLCLS LCLA LCLA、LCLLLCLL和和LCLSLCLS伪指令用于定义一伪指令用于定义一个个ARMARM程序中的局部变量,并将其初始化。程序中的局部变量,并将其初始化。共96页18LCLA(LCLLLCLA(LCLL和和LCLS) LCLS) variblevarible为变量

12、名称。为变量名称。LCLALCLA定义一个局部数字变量,其默认初定义一个局部数字变量,其默认初值为值为0 0。LCLLLCLL定义一个局部逻辑变量,其默认初定义一个局部逻辑变量,其默认初值为值为F F(假)。(假)。LCLSLCLS定义一个局部字符串变量,其默认定义一个局部字符串变量,其默认初值为空。初值为空。共96页19LCLA Test4 LCLA Test4 ;定义一个局部数字变量,;定义一个局部数字变量,变量名为变量名为Test4Test4LCLL Test5 LCLL Test5 ;定义一个局部逻辑变量,;定义一个局部逻辑变量,变量名为变量名为Test5Test5LCLS Test6

13、 LCLS Test6 ;定义一个局部字符串变;定义一个局部字符串变量,变量名为量,变量名为Test6Test6 局部变量的变量名在变量作用范围内局部变量的变量名在变量作用范围内必须具有唯一性。必须具有唯一性。共96页20 在默认情况下,局部变量只在定义该在默认情况下,局部变量只在定义该变量的程序段内有效。变量的程序段内有效。3 3、变量赋值伪指令、变量赋值伪指令SETASETA、SETLSETL和和SETSSETS 伪指令伪指令SETASETA、SETLSETL和和SETSSETS用于给一个用于给一个已经定义的全局变量或局部变量进行赋值。已经定义的全局变量或局部变量进行赋值。Test1 SE

14、TA 0 xAA ;Test1 SETA 0 xAA ;将将Test1Test1变量赋值变量赋值为为0 xAA0 xAA。共96页21Test2 SETL TRUE ;Test2 SETL TRUE ;将将Test2Test2变量赋变量赋值为真。值为真。Test3 SETS Test3 SETS “TestingTesting” ; ;将将Test3Test3变量赋变量赋值为值为“TestingTesting” 。Test4 SETA 0 xBB ;Test4 SETA 0 xBB ;将将Test4Test4变量赋值变量赋值为为0 xBB0 xBB。Test5 SETL TRUE ;Test5

15、 SETL TRUE ;将将Test5Test5变量赋值变量赋值为真。为真。共96页22Test6 SETS Test6 SETS “TestingTesting” ; ;将将Test6Test6变量变量赋值为赋值为“TestingTesting” 。4 4、定义寄存器列表伪指令、定义寄存器列表伪指令RLISTRLIST 指令指令LDM/STMLDM/STM需要使用一个比较长的需要使用一个比较长的寄存器列表,使用伪指令寄存器列表,使用伪指令RLISTRLIST可对一个可对一个列表定义一个统一的名称。列表定义一个统一的名称。 RLIST RLIST name name 为表名成;为表名成;lis

16、tlist为寄存器列表。为寄存器列表。共96页23 RegList RLIST R0-R5RegList RLIST R0-R5,R8R8,R10 R10 ;将;将寄存器列表名称定义为寄存器列表名称定义为RegListRegList。 列表中的寄存器访问次序根据寄存器列表中的寄存器访问次序根据寄存器的编号由低到高,而与列表中的寄存器陪的编号由低到高,而与列表中的寄存器陪列次序无关。列次序无关。5.2.3 5.2.3 程序中的标号程序中的标号 在汇编语言中用来表示地址的符号就在汇编语言中用来表示地址的符号就叫做标号。叫做标号。共96页24 LDR R0,#0 x3FF5000LDR R0,#0

17、x3FF5000 target1 LDR R1,0 xFF target1 LDR R1,0 xFF STR R1,R0 STR R1,R0 LDR R0,#0 x3FF5008 LDR R0,#0 x3FF5008 LDR R1,0 x01 LDR R1,0 x01 STR R1,R0 STR R1,R0 B target1 ; B target1 ;转移到转移到target1target1位置上运行位置上运行共96页25 这里的这里的target1target1就是标号。就是标号。 在在ARMARM汇编中,根据用途不同标号主汇编中,根据用途不同标号主要有以下要有以下2 2种:种:(1 1)

18、目标地址标号)目标地址标号 写在一条指令前面的标号。写在一条指令前面的标号。(2 2)数据或数据区首地址标号)数据或数据区首地址标号 写在数据或数据区定义伪指令前面的写在数据或数据区定义伪指令前面的标号。标号。共96页265.2.4 5.2.4 数据定义伪指令数据定义伪指令 该指令的功能就是为指定的数据分配该指令的功能就是为指定的数据分配存储单元,以及用该数据对已分配存储单存储单元,以及用该数据对已分配存储单元进行初始化。元进行初始化。1 1、DCBDCB DCB DCB伪指令用于分配一片连续的以字伪指令用于分配一片连续的以字节为单位的存储区域,并用指定的表达式节为单位的存储区域,并用指定的表

19、达式对其进行初始化。对其进行初始化。共96页27 DCB DCB labellabel为标号,为存储区域的首地址(可为标号,为存储区域的首地址(可选)。选)。exprexpr为表达式,为从标号开始存放的数据。为表达式,为从标号开始存放的数据。该表达式可以为该表达式可以为02550255的数字或字符串。的数字或字符串。 Dat1 DCB 0 x7EDat1 DCB 0 x7EDCBDCB也可用也可用“= =”代替,即代替,即 Dat1= 0 x7EDat1= 0 x7E共96页282 2、DCWDCW(或(或DCWUDCWU) DCW DCW(或(或DCWUDCWU)伪指令用于为数据分)伪指令用

20、于为数据分配一片连续的半字存储单元,并用表达式配一片连续的半字存储单元,并用表达式对其进行初始化。对其进行初始化。 DCW( DCW(或或DCWU) DCWU) 用用DCWDCW分配的字存储单元是严格按半分配的字存储单元是严格按半字对齐的,而用字对齐的,而用DCWUDCWU分配的字存储单元并分配的字存储单元并不严格按半字对齐。不严格按半字对齐。共96页293 3、DCDDCD(或(或DCDUDCDU) DCD DCD(或(或DCDUDCDU)伪指令用于分配一片连)伪指令用于分配一片连续的字存储单元,并用伪指令中指定的表续的字存储单元,并用伪指令中指定的表达式初始化。达式初始化。 DataTes

21、t DCW 1,2,3 ;DataTest DCW 1,2,3 ;分配一片连续的分配一片连续的半字存储单元并初始化半字存储单元并初始化 DCD( DCD(或或DCDU) DCDU) 共96页30 用用DCDDCD分配的字存储单元是字对齐的,分配的字存储单元是字对齐的,而用而用DCDUDCDU分配的字存储单元并不严格要求分配的字存储单元并不严格要求字对齐。字对齐。 DataTest DCD 4,5,6 ;DataTest DCD 4,5,6 ;分配一片连续的分配一片连续的存储单元并初始化存储单元并初始化 DCD DCD也可用也可用“& &”代替。代替。4 4、DCFDDCFD(或

22、(或DCFDUDCFDU)共96页31 DCFD DCFD(或(或DCFDUDCFDU)伪指令用于为双精)伪指令用于为双精度的浮点数分配一片连续的字存储单元,度的浮点数分配一片连续的字存储单元,并用伪指令中指定的表达式初始化。每个并用伪指令中指定的表达式初始化。每个双精度的浮点数占据两个字单元。双精度的浮点数占据两个字单元。 DCFD( DCFD(或或DCFDU) DCFDU) 用用DCFDDCFD分配的字存储单元是字对齐的分配的字存储单元是字对齐的而用而用DCFDUDCFDU分配的字存储单元并不严格字分配的字存储单元并不严格字对齐。对齐。共96页32 FDataTest DCFD 2E115

23、,-5E7 ;FDataTest DCFD 2E115,-5E7 ;分配一片分配一片连续的字存储单元,并初始化为指定的双连续的字存储单元,并初始化为指定的双精度数。精度数。5 5、DCFSDCFS(或(或DCFSUDCFSU) DCFS DCFS(或(或DCFSUDCFSU)伪指令用于为单精)伪指令用于为单精度的浮点数分配一片连续的字存储单元,度的浮点数分配一片连续的字存储单元,并用伪指令中指定的表达式初始化。每个并用伪指令中指定的表达式初始化。每个单精度浮点熟占据一个字单元。单精度浮点熟占据一个字单元。共96页33 DCFS( DCFS(或或DCFSU) DCFSU) 用用DCFSDCFS分

24、配的字存储单元是字对齐的分配的字存储单元是字对齐的而用而用DCFSUDCFSU分配的字存储单元并不严格字分配的字存储单元并不严格字对齐。对齐。 FDataTest DCFS 2E5,-5E-7 ;FDataTest DCFS 2E5,-5E-7 ;分配一片分配一片连续的字存储单元,并初始化为指定的单连续的字存储单元,并初始化为指定的单精度数。精度数。6 6、DCQDCQ(或(或DCQUDCQU)共96页34 DCQ DCQ(或(或DCQUDCQU)伪指令用于分配一片以)伪指令用于分配一片以8 8字节为单位的连续存储区域,并用伪指令字节为单位的连续存储区域,并用伪指令中指定的表达式初始化。中指定

25、的表达式初始化。 DCQ( DCQ(或或DCQU) DCQU) 用用DCQDCQ分配的存储单元是字对齐的,分配的存储单元是字对齐的,而用而用DCQUDCQU分配的字存储单元并不严格字对分配的字存储单元并不严格字对齐。齐。共96页35 DataTest DCQ 100 ;DataTest DCQ 100 ;分配一片连续的存分配一片连续的存储单元并初始化为指定的值。储单元并初始化为指定的值。7 7、SPACESPACE SPACE SPACE伪指令用于分配一片连续的存储伪指令用于分配一片连续的存储区域并初始化为区域并初始化为0 0。 SPACE SPACE 表达式为要分配的字节数,表达式为要分配的

26、字节数,SPACESPACE也也可用可用“% %”代替。代替。共96页36 DataSpace SPACE 100 ;DataSpace SPACE 100 ;分配连续的分配连续的100100字字节的存储单元并初始化为节的存储单元并初始化为0 0。8 8、LTORGLTORG 伪指令伪指令LTORGLTORG用来说明某个存储区域用来说明某个存储区域为一个用来暂存数据的数据缓冲区,也叫为一个用来暂存数据的数据缓冲区,也叫文字迟或数据缓冲池。大的代码段也可以文字迟或数据缓冲池。大的代码段也可以使用多个数据缓冲池。使用多个数据缓冲池。共96页37 AREA example, CODE, READON

27、LYAREA example, CODE, READONLY Start BL Func1 Start BL Func1 Func1 LDR R1,#0 x800 Func1 LDR R1,#0 x800 MOV PC,LR MOV PC,LR LTORG LTORG ;定义数据缓冲池的开始位置;定义数据缓冲池的开始位置 Date SPACE 40 Date SPACE 40 ;数据缓冲池有;数据缓冲池有4040个被初个被初 END END ;始化为;始化为0 0的字节的字节 9 9、MAPMAP和和FIELDFIELD共96页38 在应用程序中经常使用一种如图所示在应用程序中经常使用一种如图

28、所示的表:的表:共96页39 MAP MAP可以用可以用“ ”代替。代替。 MAP MAP用于定义一个结构化的内存表的用于定义一个结构化的内存表的首地址。语法格式如下:首地址。语法格式如下: MAP ,MAP , exprexpr为结构化表首地址。可以为标号或为结构化表首地址。可以为标号或数字表达式。数字表达式。 baseregisterbaseregister为基址寄存器(可选项)。为基址寄存器(可选项)。基址寄存器的值与基址寄存器的值与exprexpr的值之和就是表首的值之和就是表首地址。地址。共96页40MAP fun MAP fun ; funfun就是内存表的首地址就是内存表的首地址

29、 MAP 0 x100,R9 MAP 0 x100,R9 ;内存表的首地址为;内存表的首地址为R9+0X100R9+0X100 MAP MAP通常和通常和FIELDFIELD伪指令相配合来定义伪指令相配合来定义一个结构化的内存表。一个结构化的内存表。 FIELD FIELD伪指令用于定义一个结构化内存伪指令用于定义一个结构化内存表中的数据域。表中的数据域。 FIELD FIELD labellabel为标号。为标号。共96页41 exprexpr为表达式。它的值为数据域所占的字为表达式。它的值为数据域所占的字节数。节数。 FIELD FIELD伪指令与伪指令与MAPMAP伪指令配合使用伪指令配

30、合使用来定义结构化的内存表。来定义结构化的内存表。MAPMAP伪指令定义伪指令定义内存表的首地址;内存表的首地址;FIELDFIELD伪指令定义内存伪指令定义内存表中各个数据域,并可以为每个数据域表中各个数据域,并可以为每个数据域指定一个标号供其他指令引用。指定一个标号供其他指令引用。共96页42 MAP 0X 100 MAP 0X 100 ;定义结构化内存表首地址为定义结构化内存表首地址为0X1000X100 A FIELD 16 A FIELD 16 ;定义定义A A的长度为的长度为1616字节,位置为字节,位置为0X1000X100 B FIELD 32 B FIELD 32 ;定义定义

31、B B的长度为的长度为3232字节,位置为字节,位置为0X1100X110 S FIELD 256 S FIELD 256 ;定义定义S S的长度为的长度为256256字节,位置为字节,位置为0X1300X130 注意:注意:MAPMAP和和FIELDFIELD伪指令仅用于定义伪指令仅用于定义数据结构,并不实际分配存储单元。数据结构,并不实际分配存储单元。FIELDFIELD也可用也可用“# #”代替。代替。5.2.5 5.2.5 汇编控制伪指令汇编控制伪指令共96页431 1、IFIF、ELSEELSE和和EDNIFEDNIF IF IF、ELSEELSE和和ENDIFENDIF伪指令能根据

32、条件伪指令能根据条件的成立与否决定是否执行某个程序段。的成立与否决定是否执行某个程序段。IF IF 逻辑表达式逻辑表达式 程序段程序段1 1ELSEELSE 程序段程序段2 2ENDIFENDIF共96页44IFIF、ELSEELSE、ENDIFENDIF伪指令可以嵌套使用。伪指令可以嵌套使用。 GBLL Test GBLL Test ;声明一个全局逻辑变量;声明一个全局逻辑变量Test . . IF Test = TRUE IF Test = TRUE 程序段程序段1 1 ELSE ELSE 程序段程序段2 2 ENDIF ENDIF2 2、WHILEWHILE和和WENDWEND共96页4

33、5 WHILE WHILE和和WENDWEND伪指令根据条件的成立与伪指令根据条件的成立与否决定是否重复汇编一个程序段。否决定是否重复汇编一个程序段。WHILE WHILE 逻辑表达式逻辑表达式 程序段程序段WENDWEND 若若WHILEWHILE后面的逻辑表达式为真,则后面的逻辑表达式为真,则重复汇编该程序段,直到逻辑表达式为假。重复汇编该程序段,直到逻辑表达式为假。共96页46 WHILE WHILE和和WENDWEND伪指令可以嵌套使用。伪指令可以嵌套使用。GBLA CounterGBLA Counter;声明一个全局数字变量声明一个全局数字变量CounterCounter SETA

34、3Counter SETA 3;赋值;赋值 . WHILE Counter 10 WHILE Counter 10 程序段程序段 WENDWEND5.2.6 5.2.6 其它常用的伪指令其它常用的伪指令共96页471 1、定义对齐方式伪指令、定义对齐方式伪指令ALIGNALIGN 使用使用ALIGNALIGN伪指令可用添加填充字节的伪指令可用添加填充字节的方式,使当前位置实现某种对齐方式。方式,使当前位置实现某种对齐方式。 ALIGN ALIGN 表达式表达式 ,偏移量,偏移量 对齐方式为对齐方式为2 2表达式的值表达式的值。偏移量为一个。偏移量为一个数字表达式,若使用该字段,则当前位置数字表

35、达式,若使用该字段,则当前位置的对齐方式为的对齐方式为2 2表达式的值表达式的值+ +偏移量。偏移量。共96页48 ;指定后面的指令为;指定后面的指令为8 8字节对齐字节对齐 AREA Init, CODE, READONLY, ALIGN=3AREA Init, CODE, READONLY, ALIGN=3 代码段代码段 ENDEND2 2、CODE16CODE16和和CODE32CODE32 CODE16CODE16用来表明其后的指令均为用来表明其后的指令均为1616位位ThumbThumb指令;指令;CODE32CODE32伪指令则表明其后面的伪指令则表明其后面的指令均为指令均为323

36、2位位ARMARM指令。指令。共96页49 CODE16CODE16(或(或CODE32CODE32) AREA Init,CODE, READONLYAREA Init,CODE, READONLY . CODE32 CODE32 LDR R0,#NEXT+1 LDR R0,#NEXT+1 BX R0 BX R0 CODE16 CODE16 NEXT LDR R3,#0X3FF NEXT LDR R3,#0X3FF END END共96页503 3、定义程序入口点伪指令、定义程序入口点伪指令ENTRYENTRY ENTRY ENTRY伪指令用于指定汇编程序的入口伪指令用于指定汇编程序的入口点

37、。点。 ENTRYENTRY AREA Init, CODE, READONLYAREA Init, CODE, READONLY ENTRY; ENTRY; .共96页514 4、汇编结束伪指令、汇编结束伪指令ENDEND END END伪指令用于通知编译器汇编工作伪指令用于通知编译器汇编工作到此结束,不再往下汇编了。到此结束,不再往下汇编了。 ENDEND AREA Init, CODE, READONLYAREA Init, CODE, READONLY END END共96页525 5、等效伪指令、等效伪指令EQUEQU EQU EQU伪指令用于为程序中的常量、标伪指令用于为程序中的常

38、量、标号等定义一个等效的字符名字,其作用类号等定义一个等效的字符名字,其作用类似于似于C C语言中的语言中的#define#define。 名称名称 EQU EQU 表达式表达式 ,类型,类型 EQU EQU也可用也可用“* *”代替。代替。共96页53 由由EQUEQU伪指令定义的字符名称,当其表伪指令定义的字符名称,当其表达式为达式为3232位常量时,可以指定表达式的数位常量时,可以指定表达式的数据类型,有以下三种类型:据类型,有以下三种类型:CODE16CODE16、CODE32CODE32和和DATADATA。 Test EQU 50 Test EQU 50 ;定义标号;定义标号Tes

39、tTest的值为的值为5050Addr EQU 0 x55, CODE32 Addr EQU 0 x55, CODE32 ;定义;定义AddrAddr的值的值为为0 x550 x55,其该处为,其该处为3232位的位的ARMARM指令指令共96页546 6、外部可引用符号声明伪指令、外部可引用符号声明伪指令EXPORTEXPORT(或(或GLOBALGLOBAL) 用伪指令用伪指令EXPORTEXPORT可以声明一个其他源可以声明一个其他源文件可引用的符号,这种符号也叫做外部文件可引用的符号,这种符号也叫做外部可引用符号。可引用符号。 EXPORT EXPORT 符号符号 WEAKWEAK E

40、XPORT EXPORT可用可用GLOBALGLOBAL代替。代替。共96页55 标号在程序中区分大小写,标号在程序中区分大小写,WEAKWEAK选选项声明其他的同名标号优先于该标号被引项声明其他的同名标号优先于该标号被引用。用。 AREA Init, CODE, READONLYAREA Init, CODE, READONLY EXPORT Stest EXPORT Stest END END7 7、IMPORTIMPORT共96页56 当在一个源文件中需要使用另外一个当在一个源文件中需要使用另外一个源文件的外部可引用符号时,在被引用的源文件的外部可引用符号时,在被引用的符号前面必须使用伪

41、指令符号前面必须使用伪指令IMPORTIMPORT对其进行对其进行声明。声明。 IMPORT IMPORT 符号符号WEAKWEAK 如果源文件声明了一个引用符号,则如果源文件声明了一个引用符号,则无论当前源文件中程序是否真正地使用无论当前源文件中程序是否真正地使用了该符号,该符号均会被加入到当前源了该符号,该符号均会被加入到当前源文件的符号表中。文件的符号表中。共96页57 WEAK WEAK选项表示当前所有的源文件都选项表示当前所有的源文件都没有定义这样一个标号时,编译器也不报没有定义这样一个标号时,编译器也不报错,并在多数情况下将该标号置为错,并在多数情况下将该标号置为0 0。但该。但该

42、标号被标号被B B或或BLBL指令所引用时,则将指令所引用时,则将B B或或BLBL指指令置为令置为NOPNOP操作。操作。 AREA Init, CODE, READONLYAREA Init, CODE, READONLY IMPORT Main IMPORT Main END END共96页588 8、EXTERNEXTERN EXTERN EXTERN伪指令与伪指令与IMPORTIMPORT伪指令的功能伪指令的功能基本相同,但如果当前源文件中的程序实基本相同,但如果当前源文件中的程序实际并未使用该指令,则该符号不会加入到际并未使用该指令,则该符号不会加入到当前源文件的符号表中。当前源文

43、件的符号表中。 其它与其它与IMPORTIMPORT相同。相同。9 9、GETGET(或(或INCLUDEINCLUDE)共96页59 GET GET伪指令用于将一个源文件包含到当伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源问在当前前的源文件中,并将被包含的源问在当前位置进行汇编。位置进行汇编。 GET GET 文件名文件名 可以使用可以使用INCLUDEINCLUDE代替代替GETGET。 GET GET伪指令只能用于包含源文件,包伪指令只能用于包含源文件,包含目标文件则需要使用含目标文件则需要使用INCBININCBIN伪指令。伪指令。共96页60 AERA Init, CO

44、DE, READONLYAERA Init, CODE, READONLY GET a1.s GET a1.s GET c:a2.s GET c:a2.s END END1010、INCBININCBIN INCBIN INCBIN伪指令用于将一个目标文件或伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含数据文件包含到当前的源文件中,被包含共96页61的文件不做任何变动地存放在当前文件中,的文件不做任何变动地存放在当前文件中,编译器从其后开始继续处理。编译器从其后开始继续处理。 INCBIN INCBIN 文件名文件名 AREA Init, CODE, READONLYAREA

45、Init, CODE, READONLY INCBIN a1.dat INCBIN a1.dat INCBIN c:a2.txt INCBIN c:a2.txt END END共96页621111、RNRN RN RN伪指令用于给一个寄存器定义一个伪指令用于给一个寄存器定义一个别名,一提高程序的可读性。别名,一提高程序的可读性。 名称名称 RN RN 表达式表达式 名称为给寄存器定义的别名,表达式名称为给寄存器定义的别名,表达式为寄存器的编码。为寄存器的编码。 Temp RN R0 ;Temp RN R0 ;将将R0R0定义一个别名定义一个别名TempTemp共96页631212、ROUTRO

46、UT ROUTROUT伪指令用于给一个局部变量定义伪指令用于给一个局部变量定义作用范围。作用范围。 名称名称 ROUTROUT 在程序中未使用该伪指令时,局部变在程序中未使用该伪指令时,局部变量的作用范围为所在的量的作用范围为所在的AREAAREA;而使用;而使用ROUTROUT后,局部变量的作用范围为当前后,局部变量的作用范围为当前ROUTROUT和下和下一个一个ROUTROUT之间。之间。共96页645.3 5.3 宏与宏指令宏与宏指令5.3.1 5.3.1 宏宏1 1、MACROMACRO和和MENDMEND MACRO MACRO和和MENDMEND伪指令可以为一个程序伪指令可以为一个

47、程序段定义一个名称。这样,在汇编语言应用段定义一个名称。这样,在汇编语言应用程序中就通过这个名称来使用它所代表的程序中就通过这个名称来使用它所代表的程序段,即当程序做汇编时,该名称将被程序段,即当程序做汇编时,该名称将被替换为其所代表的程序段。替换为其所代表的程序段。共96页65MACROMACRO$ $标号标号 宏名宏名 $ $参数参数1 1, $ $参数参数2 2,.程序段(宏定义体)程序段(宏定义体)MENDMEND$ $标号:主标号,宏内的所有其它标号必须标号:主标号,宏内的所有其它标号必须由主标号组成。由主标号组成。宏名:宏名称,为宏在程序中的引用名。宏名:宏名称,为宏在程序中的引用

48、名。$ $参数参数1 1,$ $参数参数2 2:宏中可以使用的参数。:宏中可以使用的参数。共96页66 宏中的所有标号必须在前面冠以符号宏中的所有标号必须在前面冠以符号“$ $”。 MACRO MACRO ;宏定义指令;宏定义指令$MDATA MAXNUM $NUM1,$NUM2 $MDATA MAXNUM $NUM1,$NUM2 ;主标号,宏名,参数;主标号,宏名,参数 语句段语句段$MDATD.MAY1 $MDATD.MAY1 ;宏内标号;宏内标号 语句段语句段$MDATA.MAY2 $MDATA.MAY2 ;宏内标号;宏内标号 语句段语句段 MEND MEND ;宏结束指令;宏结束指令共

49、96页672 2、MEXITMEXIT MEXIT MEXIT用于从宏定义中跳转出去。用于从宏定义中跳转出去。 MEXITMEXIT5.3.2 5.3.2 宏指令宏指令 在在ARMARM中,还有一种汇编器内置的无中,还有一种汇编器内置的无参数和标号宏参数和标号宏宏指令。宏指令。 在汇编时,这些宏指令被替换成一条在汇编时,这些宏指令被替换成一条或两条真正的或两条真正的ARMARM或或ThumbThumb指令。指令。共96页681 1、近地址读取指令、近地址读取指令ADRADR ADR ADR指令用于将一个近地址值传递到指令用于将一个近地址值传递到一个寄存器中。一个寄存器中。 ADRcond ,

50、ADRcond , regreg为目标寄存器名称。为目标寄存器名称。 exprexpr为表达式。该表达式通常是一个程为表达式。该表达式通常是一个程序中表示一条指令存储位置的地址标号。序中表示一条指令存储位置的地址标号。共96页69 该指令的功能是把标号所表示的地址该指令的功能是把标号所表示的地址传递到目标寄存器中。传递到目标寄存器中。 汇编器在汇编时,将把汇编器在汇编时,将把ADRADR伪指令替换伪指令替换成一条真正的成一条真正的ADDADD或或SUBSUB指令,以当前的指令,以当前的PCPC值减去或加上值减去或加上exprexpr与与PCPC之间的偏移量得到之间的偏移量得到标号的地址,并将其

51、传递到目标寄存器。标号的地址,并将其传递到目标寄存器。 start MOV R0,#10start MOV R0,#10 ADR R4,start ADR R4,start共96页70共96页71 由于指令由于指令ADDADD或或SUBSUB中对立即数的限制,中对立即数的限制,因此标号地址就不能距离当前指令的地址因此标号地址就不能距离当前指令的地址(PCPC)过远。对于非字对齐地址来说,其)过远。对于非字对齐地址来说,其距离必须在距离必须在255255字节以内;而对于字对齐地字节以内;而对于字对齐地址来说,距离必须在址来说,距离必须在10201020字节一内。所以字节一内。所以ADRADR叫做

52、近地址读取指令。叫做近地址读取指令。2 2、远地址读取指令、远地址读取指令ADRLADRL 类似于类似于ADRADR,但可以把更远的地址赋,但可以把更远的地址赋给目标寄存器。给目标寄存器。共96页72 ADRLcond , ADRLcond , regreg为目标寄存器名称。为目标寄存器名称。 exprexpr为表达式,必须是为表达式,必须是64KB64KB以内非字对以内非字对齐地址,齐地址,256KB256KB以内的字对齐地址。以内的字对齐地址。 该指令只能在该指令只能在ARMARM状态下使用,在状态下使用,在ThumbThumb状态下不能使用。汇编时,状态下不能使用。汇编时,ADRLADR

53、L伪伪指令由汇编器替换成两条合适的指令。指令由汇编器替换成两条合适的指令。共96页73 start MOV R0,#10start MOV R0,#10 ADRL R4,start+60000 ADRL R4,start+60000其中其中ADRLADRL将被替换为如下两条指令:将被替换为如下两条指令: ADD R4ADD R4,PCPC,#0XE800#0XE800 ADD R4 ADD R4,R4R4,#0X2543#0X2543 如果汇编器找不到合适的两条指令,如果汇编器找不到合适的两条指令,将会报错。将会报错。3 3、全范围地址读取指令、全范围地址读取指令LDRLDR共96页74 LD

54、Rcond reg,=expr | label - exprLDRcond reg,=expr | label - expr regreg:目标寄存器名称;:目标寄存器名称; exprexpr:3232位常数;位常数; label label expr expr:为基于:为基于PCPC地址表达式。地址表达式。 程序经常用这条指令把一个地址传递程序经常用这条指令把一个地址传递到寄存器到寄存器regreg中。汇编器再哦对这种指令中。汇编器再哦对这种指令进行汇编时,会根据指令中进行汇编时,会根据指令中exprexpr的值的大的值的大小来把这条指令替换为合适的指令。小来把这条指令替换为合适的指令。共9

55、6页75(1 1)当)当exprexpr的值未超过的值未超过MOVMOV或或MVNMVN指令所指令所限定的取值范围时,汇编器用限定的取值范围时,汇编器用ARMARM的的MOVMOV或或MVNMVN指令来取代宏指令指令来取代宏指令LDRLDR。(2 2)当)当exprexpr的值超过的值超过MOVMOV或或MVNMVN指令所限指令所限定的取值范围时,汇编器将常数定的取值范围时,汇编器将常数exprexpr放在放在由由LTORGLTORG定义的文字缓冲池,同时用一条定义的文字缓冲池,同时用一条ARMARM的装载指令的装载指令LDRLDR来取代宏指令来取代宏指令LDRLDR,而,而这条装载这条装载L

56、DRLDR指令则用指令则用PCPC加偏移量的方法加偏移量的方法共96页76到文字缓冲池中把该常数读取到指令指定到文字缓冲池中把该常数读取到指令指定的寄存器。的寄存器。 由于这种指令可以传递一个由于这种指令可以传递一个3232位地址,位地址,因此被叫做全范围地址读取指令。因此被叫做全范围地址读取指令。4 4、NOPNOP 汇编器对汇编器对NOPNOP指令进行汇编时,会将其指令进行汇编时,会将其转换为:转换为: MOV R0MOV R0,R0R0共96页775.4 5.4 汇编语言的规范汇编语言的规范5.4.1 5.4.1 汇编语句格式汇编语句格式ARMARM(ThumbThumb)汇编语言的语句

57、格式为:)汇编语言的语句格式为: ;注释;注释 在汇编语言程序设计中,每一条指令在汇编语言程序设计中,每一条指令的助记符可以全部用大写或全部用小写,的助记符可以全部用大写或全部用小写,但不允许在一条指令中大小写混用。但不允许在一条指令中大小写混用。共96页78 如果一条语句太长,则可将该长语句如果一条语句太长,则可将该长语句分成若干行来书写,每行的末尾用分成若干行来书写,每行的末尾用“ ”来来表示下一行与本行为同一条语句。表示下一行与本行为同一条语句。5.4.2 5.4.2 汇编语言的表达式和运算符汇编语言的表达式和运算符 运算次序遵循如下的优先级:运算次序遵循如下的优先级:(1 1)优先级相

58、同的双目运算符运算顺序为)优先级相同的双目运算符运算顺序为从左到右。从左到右。共96页79(2 2)相邻的单目运算符的运算顺序为从右)相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运到左,且单目运算符的优先级高于其他运算符。算符。(3 3)括号运算符的优先级最高。)括号运算符的优先级最高。1 1、数字表达式及运算符、数字表达式及运算符(1 1)+ +、- -、X X、/ /及及MODMOD算术运算符算术运算符 X + Y X + Y 表示表示X X与与Y Y的和。的和。共96页80(2 2)ROLROL、RORROR、SHLSHL及及SHRSHR移位运算符移位运算符 X -

59、 Y X - Y 表示表示X X与与Y Y的差。的差。 X X Y X X Y 表示表示X X与与Y Y的乘积。的乘积。 X / Y X / Y 表示表示X X除以除以Y Y的商。的商。 X :MOD: Y X :MOD: Y 表示表示X X除以除以Y Y的余数。的余数。 X :ROL: Y X :ROL: Y 表示将表示将X X循环左移循环左移Y Y位。位。 X :ROR: Y X :ROR: Y 表示将表示将X X循环右移循环右移Y Y位。位。共96页81 X :SHL: Y X :SHL: Y 表示将表示将X X左移左移Y Y位。位。 X :SHR: Y X :SHR: Y 表示将表示将

60、X X右移右移Y Y位。位。(3 3)ANDAND、OROR、NOTNOT及及EOREOR按位逻辑运算符按位逻辑运算符 X :AND: Y X :AND: Y 表示将表示将X X和和Y Y按位做逻辑按位做逻辑“与与”的操作。的操作。 X :OR: Y X :OR: Y 表示将表示将X X和和Y Y按位做逻辑按位做逻辑“或或”的操作。的操作。共96页82 :NOT: Y :NOT: Y 表示将表示将Y Y按位做逻辑按位做逻辑“非非”的的操作。操作。 X :EOR: Y X :EOR: Y 表示将表示将X X和和Y Y按位做逻辑按位做逻辑“异或异或”的操作。的操作。2 2、逻辑表达式及运算符、逻辑表达式及运算符(

温馨提示

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

最新文档

评论

0/150

提交评论