《4第四章 ARM汇编语言程序设计1451.pptx》由会员分享,可在线阅读,更多相关《4第四章 ARM汇编语言程序设计1451.pptx(75页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章第四章 ARM汇编语言程序设计汇编语言程序设计ADS1.2ADS1.2环境下的汇编语句格式环境下的汇编语句格式q1.ARM 1.ARM 汇编中汇编中,所有标号必须在一行的顶格书写所有标号必须在一行的顶格书写,其后面不要添加其后面不要添加“:”,而所有指令均不能顶格书写。,而所有指令均不能顶格书写。q2.ARM 2.ARM 汇编器对标识符大小写敏感,书写标号及汇编器对标识符大小写敏感,书写标号及指令时字母大小写要一致,在指令时字母大小写要一致,在ARM ARM 汇编程序中,一个汇编程序中,一个ARM ARM 指令、伪指令、寄存器名可以全部为大写字母,指令、伪指令、寄存器名可以全部为大写字母
2、,也可以全部为小写字母,但不要大小写混合使用也可以全部为小写字母,但不要大小写混合使用(如如果混合使用也能编译通过果混合使用也能编译通过,如如mov SP,r6mov SP,r6能编译能编译通过通过,但是但是moV SP,r6moV SP,r6则出现错误则出现错误)。q3.3.注释可以在一行的顶格书写。注释可以在一行的顶格书写。4.1伪操作伪操作 在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没没有有相相对对应应的的操操作作码码,通通常称这些特殊指令助记符为伪指令常称这些特殊指令助记符为伪指令 他们所完成的操作称为伪操作伪操作。ARM 指令系统 伪指令伪指令
3、:由汇编器处理由汇编器处理 伪伪指指令令是是由由汇汇编编器器对对源源程程序序汇汇编编期期间进行处理的间进行处理的.伪伪指指令令仅仅在在汇汇编编过过程程中中起起作作用用,一一旦汇编结束,伪指令的使命就完成。旦汇编结束,伪指令的使命就完成。指令指令 :由由ARMARM处理器执行处理器执行ARM 指令系统在在ARMARM的汇编程序中,有如下几种伪指令:的汇编程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。ARM 指令系统4.1.1 符号定义伪指令 符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。ARM 指令系统4.1
4、.1 符号定义伪指令 常见的符号定义伪指令有如下几种:常见的符号定义伪指令有如下几种:用用于于定定义义全全局局变变量量的的GBLA、GBLL和和GBLS。用用于于定定义义局局部部变变量量的的LCLA、LCLL和和LCLS。用于对变量赋值的用于对变量赋值的SETA、SETL、SETS。为通用寄存器列表定义名称的为通用寄存器列表定义名称的RLIST。ARM 指令系统1、GBLA、GBLL和和GBLS语法格式:语法格式:GBLA(GBLL或或GBLS)全局变量名全局变量名GBLA、GBLL和和GBLS伪指令用于定义一个伪指令用于定义一个ARM程程序中的全局变量,并将其初始化。序中的全局变量,并将其初
5、始化。GBLA伪伪指指令令用用于于定定义义一一个个全全局局的的数数字字变变量量,并并初初始始化为化为0;GBLL伪伪指指令令用用于于定定义义一一个个全全局局的的逻逻辑辑变变量量,并并初初始始化为化为F(假);(假);GBLS伪伪指指令令用用于于定定义义一一个个全全局局的的字字符符串串变变量量,并并初初始化为空;始化为空;由由于于以以上上三三条条伪伪指指令令用用于于定定义义全全局局变变量量,因因此此在在整整个个程序范围内程序范围内变量名必须唯一变量名必须唯一。GBLA Test1;定义一个全局的数字变量,变量名为;定义一个全局的数字变量,变量名为Test1Test1SETA0 xaa;将该变量赋
6、值为;将该变量赋值为0 xaaGBLL Test2;定义一个全局的逻辑变量,变量名为;定义一个全局的逻辑变量,变量名为Test2Test2SETLTRUE;将该变量赋值为真;将该变量赋值为真GBLSTest3;定义一个全局的字符串变量,变量名为;定义一个全局的字符串变量,变量名为Test3Test3SETSTesting;将该变量赋值为;将该变量赋值为Testing2、LCLA、LCLL和和LCLS语法格式:语法格式:LCLA(LCLL或或LCLS)局部变量名局部变量名LCLA、LCLL和和LCLS伪指令用于定义一个伪指令用于定义一个ARM程程序中的局部变量,并将其初始化。其中:序中的局部变量
7、,并将其初始化。其中:LCLA伪伪指指令令用用于于定定义义一一个个局局部部的的数数字字变变量量,并初始化为并初始化为0;LCLL伪伪指指令令用用于于定定义义一一个个局局部部的的逻逻辑辑变变量量,并初始化为并初始化为F(假);(假);LCLS伪伪指指令令用用于于定定义义一一个个局局部部的的字字符符串串变变量量,并初始化为空;并初始化为空;以上三条伪指令用于声明局部变量以上三条伪指令用于声明局部变量ARM 指令系统使用示例:使用示例:LCLATest4 ;声声明明一一个个局局部部的的数数字字变变量量,变量名为变量名为Test4Test3SETA0 xaa ;将将该该变变量量赋赋值值为为0 xaaL
8、CLLTest5;声声明明一一个个局局部部的的逻逻辑辑变变量量,变变量名为量名为Test5Test4SETLTRUE;将将该该变变量量赋赋值值为为真真LCLSTest6;定定义义一一个个局局部部的的字字符符串串变变量量,变量名为变量名为Test6Test6SETS“Testing”;将将该该变变量量赋赋值值为为“Testing”3、SETA、SETL和和SETS语法格式:语法格式:变量名变量名SETA(SETL或或SETS)表达式)表达式 伪伪指指令令SETA、SETL、SETS给给一一个个已已经经定定义义的全局变量或局部变量赋值。的全局变量或局部变量赋值。SETA伪指令用于给一个数学变量赋值
9、;伪指令用于给一个数学变量赋值;SETL伪指令用于给一个逻辑变量赋值;伪指令用于给一个逻辑变量赋值;SETS伪指令用于给一个字符串变量赋值;伪指令用于给一个字符串变量赋值;其其中中,变变量量名名为为已已经经定定义义过过的的全全局局变变量量或局部变量,表达式为将要赋给变量的值。或局部变量,表达式为将要赋给变量的值。使用示例:使用示例:LCLA Test3;声声明明一一个个局局部部的的数字变量,变量名为数字变量,变量名为Test3Test3 SETA0 xaa;将将该该变变量量赋赋值值为为0 xaaLCLL Test4;声声明明一一个个局局部部的的逻辑变量,变量名为逻辑变量,变量名为Test4Te
10、st4 SETLTRUE;将将该该变变量赋值为真量赋值为真ARM 指令系统 4、RLIST 名称名称 RLIST 寄存器列表寄存器列表 RLIST伪伪指指令令可可用用于于对对一一个个通通用用寄寄存存器器列列表表定定义义名名称称,使使用用该该伪伪指指令令定定义义的的名名称称可可在在ARM指指令令LDM/STM中使用。中使用。在在LDM/STM指指令令中中,列列表表中中的的寄寄存存器器访访问问次次序序为为根根据据寄寄存存器器的的编编号号由由低低到到高高,而而与与列列表表中中的的寄存器排列次序无关。寄存器排列次序无关。RLIST使用示例:使用示例:RegListRLISTR0-R5,R8,R10 将
11、将寄寄存存器器列列表表名名称称定定义义为为RegList,可可在在ARM指指令令LDM/STM中中通通过过该该名名称访问寄存器列表。称访问寄存器列表。例例:RegListRLISTr1-r13;必须顶格开始写必须顶格开始写 LDMIA r0,RegList4.1.2 数据定义(数据定义(Data Definition)伪指令)伪指令 数数据据定定义义伪伪指指令令一一般般用用于于为为特特定定的的数数据据分分配配存存储储单单元元,同同时时可可完完成成已已分分配配存存储储单单元元的的初初始始化化。常常见见的的数数据据定定义义伪伪指指令令有有如如下下几几种:种:DCB 用用于于分分配配一一片片连连续续
12、的的字字节节存存储储单单元元并并用用指定的数据初始化。指定的数据初始化。DCW(DCWU)用用于于分分配配一一片片连连续续的的半半字字存存储储单元并用指定的数据初始化。单元并用指定的数据初始化。DCFD(DCFDU)用用于于为为双双精精度度的的浮浮点点数数分分配配一一片片连续的字存储单元并用指定的数据初始化。连续的字存储单元并用指定的数据初始化。ARM 指令系统DCFS(DCFSU)用用于于为为单单精精度度的的浮浮点点数数分分配配一一片片连连续续的的字字存存储储单单元元并并用用指指定定的的数数据据初始化。初始化。DCQ(DCQU)用用于于分分配配一一片片以以8字字节节为为单单位位的的连连续续的
13、的存存储储单单元元并并用用指指定定的的数数据据初初始始化。化。DCD(DCDU)用用于于分分配配一一片片连连续续的的字字存存储储单单元元并用指定的数据初始化。并用指定的数据初始化。SPACE用于分配一片连续的存储单元用于分配一片连续的存储单元MAP 用于定义一个结构化的内存表首地址用于定义一个结构化的内存表首地址FIELD 用于定义一个结构化的内存表的数据域用于定义一个结构化的内存表的数据域1 1、DCB(DCBDCB(DCB也可用也可用“=”“=”代替代替)语法格式:标号标号DCBDCB 表达式表达式 DCBDCB伪伪指指令令用用于于分分配配一一片片连连续续的的字字节节存存储储单单元元并并用
14、用伪伪指指令令中中指指定定的的表表达达式式初初始始化化。其其中中,表表达达式式可可以以为为0 0255255的的数数字或字符串。字或字符串。使用示例:使用示例:StrStr DCB DCBThis is a testThis is a test!;分配一片连续的字节存储单元并初始化。;分配一片连续的字节存储单元并初始化。2 2、DCDDCD(或(或DCDU,DCDDCDU,DCD也可用也可用“&”“&”代替)代替)语法格式:语法格式:标号标号DCDDCD(或(或DCDUDCDU)表达式表达式 DCDDCD(或或DCDUDCDU)伪伪指指令令用用于于分分配配一一片片连连续续的的字字存存储储单单元
15、元并并用用伪伪指指令令中中指指定定的的表表达达式式初初始始化化。其其中中,表表达达式式可可以以为为程程序序标标号号或或数数字字表达式。表达式。用用DCDDCD分分配配的的字字存存储储单单元元是是字字对对齐齐的的,而而用用DCDUDCDU分配的字存储单元并不严格字对齐。分配的字存储单元并不严格字对齐。使用示例:使用示例:DataTestDataTestDCDDCD4 4,5 5,6 6;分分配配一一片连续的字存储单元并初始化。片连续的字存储单元并初始化。3 3、SPACE(SPACESPACE(SPACE也可用也可用“”代替代替)语法格式:语法格式:标号标号SPACESPACE表达式表达式 SP
16、ACESPACE伪伪指指令令用用于于分分配配一一片片连连续续的的存存储储区区域域并并初初始始化化为为0 0。其其中中,表表达式为要分配的字节数。达式为要分配的字节数。使用示例:使用示例:DataSpaceDataSpaceSPACESPACE100100;分分配配连连续续100100字节的存储单元并初始化为字节的存储单元并初始化为0 0。4 4、MAP,MAPMAP,MAP也可用也可用“”代替。代替。语法格式:语法格式:MAPMAP表达式表达式,基址寄存器,基址寄存器 MAPMAP伪伪指指令令用用于于定定义义一一个个结结构构化化的的内内存表的首地址。存表的首地址。表表达达式式可可以以为为程程序
17、序中中的的标标号号或或数数学学表表达达式式,基基址址寄寄存存器器为为可可选选项项,当当基基址址寄寄存存器器选选项项不不存存在在时时,表表达达式式的的值值即即为为内内存存表表的的首首地地址址,当当该该选选项项存存在在时时,内内存存表表的的首首地地址址为为表表达达式式的的值值与与基基址址寄寄存存器的和。器的和。MAPMAP伪伪指指令令通通常常与与FIELDFIELD伪伪指指令令配合使用来定义结构化的内存表。配合使用来定义结构化的内存表。使用示例:使用示例:MAPMAP0 x1000 x100,R0R0;定定义义结结构构化内存表首地址的值为化内存表首地址的值为0 x1000 x100R0R0。5 5
18、、FILED FILEDFILED FILED也可用也可用“#”“#”代替。代替。语法格式:语法格式:标号标号FIELDFIELD表达式表达式 FIELDFIELD伪伪指指令令用用于于定定义义一一个个结结构构化化内内存表中的数据域。存表中的数据域。表表达达式式的的值值为为当当前前数数据据域域在在内内存存表表中所占的字节数。中所占的字节数。FIELDFIELD伪伪指指令令常常与与MAPMAP伪伪指指令令配配合合使使用用来来定定义义结结构构化化的的内内存存表表。MAPMAP伪伪指指令令定定义义内内存存表表的的首首地地址址,FIELDFIELD伪伪指指令令定定义义内内存存表表中中的的各各个个数数据据
19、域域,并并可可以以为为每个数据域指定一个标号供其他的指令引用。每个数据域指定一个标号供其他的指令引用。注注意意 MAPMAP和和FIELDFIELD伪伪指指令令仅仅用用于于定定义义数数据据结结构,并不实际分配存储单元。构,并不实际分配存储单元。使用示例:使用示例:MAP MAP0 x1000 x100;定定义义结结构构化化内内存存表首地址的值为表首地址的值为0 x1000 x100。A AFIELDFIELD1616;定定义义A A的的长长度度为为1616字节,位置为字节,位置为0 x1000 x100B BFIELDFIELD3232;定定义义B B的的长长度度为为3232字节,位置为字节,
20、位置为0 x1100 x110S SFIELDFIELD256256;定定义义S S的的长长度度为为256256字节,位置为字节,位置为0 x1300 x130 s3c44b0 x ARM s3c44b0 x ARM芯片的初始化源程序芯片的初始化源程序:AREA RamData,DATA,READWRITE AREA RamData,DATA,READWRITE (_IRQ_BASEADDRESS);(_IRQ_BASEADDRESS);即即 MAPMAPHandleReset#4 ;#HandleReset#4 ;#即即 DCD DCDHandleUndef#4HandleUndef#4Ha
21、ndleSWI#4HandleSWI#4HandlePabort#4HandlePabort#4HandleDabort#4HandleDabort#4HandleReserved#4HandleReserved#4HandleIRQ#4HandleIRQ#4HandleFIQ#4HandleFIQ#44.1.3 汇编控制伪指令汇编控制伪指令 汇汇编编控控制制伪伪指指令令用用于于控控制制汇汇编编程序的执行流程程序的执行流程常用的汇编控制伪指令包括常用的汇编控制伪指令包括:IF、ELSE、ENDIFWHILE、WENDMACRO、MENDMEXITARM 指令系统1 IF1 IF、ELSEELS
22、E、ENDIF(ENDIF(等价于等价于|)语法格式:语法格式:IFIF逻辑表达式逻辑表达式指令序列指令序列1 1ELSEELSE指令序列指令序列2 2ENDIFENDIF IFIF、ELSEELSE、ENDIFENDIF伪伪指指令令能能根根据据条条件件的的成成立立与与否否决决定定是是否否执执行行某某个个指指令令序序列列。当当IFIF后后面面的的逻逻辑辑表表达达式式为为真真,则则执执行行指指令令序序列列1 1,否否则则执执行行指指令令序序列列2 2。其其中中,ELSEELSE及及指指令令序序列列2 2可可以以没没有有,此此时时,当当IFIF后后面面的的逻逻辑辑表表达达式式为为真真,则则执执行行
23、指指令令序序列列1 1,否则继续执行后面的指令。,否则继续执行后面的指令。IFIF、ELSEELSE、ENDIFENDIF伪指令可以嵌套使用。伪指令可以嵌套使用。使用示例:使用示例:GBLL Test;声明一个全局的逻辑变量,变量名为;声明一个全局的逻辑变量,变量名为Test IF Test=TRUE指令序列指令序列1 ELSE指令序列指令序列2 ENDIF s3c44b0 x ARM s3c44b0 x ARM芯片的初始化源程序芯片的初始化源程序:GBLL THUMBCODE GBLL THUMBCODE;global logical variable,init.to false;globa
24、l logical variable,init.to false CONFIG=16 CONFIG=16 ;=if=if,CONFIG:build-in variable defined by ARM,CONFIG:build-in variable defined by ARM;assembler,16=assembing Thumbcode.;assembler,16=assembing Thumbcode.THUMBCODE SETLTHUMBCODE SETLTRUE ;SETL:set the logic variableTRUE ;SETL:set the logic variab
25、le CODE32 ;changing from Thumb state to Arm state CODE32 ;changing from Thumb state to Arm state|;|;|=else|=elseTHUMBCODE SETLTHUMBCODE SETLFALSEFALSE ;=endif=endif2 2、WHILEWHILE、WENDWEND语法格式:语法格式:WHILEWHILE逻辑表达式逻辑表达式指令序列指令序列WENDWEND WHILEWHILE、WENDWEND伪指令可以嵌套使用。伪指令可以嵌套使用。WHILEWHILE、WENDWEND伪伪指指令令能能
26、根根据据条条件件的的成成立立与与否否决决定定是是否否循循环环执执行行某某个个指指令令序序列列。当当WHILEWHILE后后面面的的逻逻辑辑表表达达式式为为真真,则则执执行行指指令令序序列列,该该指指令令序序列列执执行行完完毕毕后后,再再判判断断逻逻辑辑表表达达式式的的值值,若若为为真真则则继继续续执执行行,一一直直到到逻逻辑辑表表达达式的值为假。式的值为假。使用示例:使用示例:GBLA Counter;声明一个全局的数学变量,变量名为;声明一个全局的数学变量,变量名为CounterCounter Counter SETASETA3 3;由变量;由变量CounterCounter控制循环次数控制
27、循环次数 WHILE Counter 10 指令序列指令序列 WEND3 3、MACROMACRO、MENDMEND语语法格式:法格式:MACROMACRO$标标号号宏名宏名$参数参数1 1,$参数参数2 2,指令序列指令序列 MEND MEND MACROMACRO、MENDMEND伪伪指指令令可可以以将将一一段段代代码码定定义义为为一一个个整整体体,称称为为宏宏指指令令,然然后后就就可可以以在在程程序序中中通通过过宏宏指指令令多多次次调调用用该该段段代代码码。其其中中,$标标号号在在宏宏指指令令被被展展开开时时,标标号会被替号会被替换为换为用用户户定定义义的符号的符号;宏宏指指令令可可以以
28、使使用用一一个个或或多多个个参参数数,当当宏宏指指令令被被展开展开时时,这这些参数被相些参数被相应应的的值值替替换换。MACRO MACRO、MENDMEND伪指令可以嵌套使用。伪指令可以嵌套使用。s3c44b0 xs3c44b0 x初始化程序里的例子:初始化程序里的例子:MACRO$HandlerLabel HANDLER$HandleLabel$HandlerLabel sub sp,sp,#4 stmfd sp!,r0 ldr r0,=$HandleLabel ldr r0,r0 str r0,sp,#4 ldmfd sp!,r0,pc MENDHandlerEINT4567Handle
29、rEINT4567HANDLER HANDLER HandleEINT4567HandleEINT4567将被汇编成如下语句:将被汇编成如下语句:HandlerEINT4567HandlerEINT4567 sub sub sp,sp,#4 sp,sp,#4 stmfd sp!,r0 stmfd sp!,r0 ldr ldr r0,=r0,=HandleEINT4567HandleEINT4567;ldr ldr r0,r0 r0,r0 str str r0,sp,#4 r0,sp,#4 ldmfd sp!,r0,pc ldmfd sp!,r0,pcHandleEINT4567HandleEI
30、NT4567的定义的定义:(_IRQ_BASEADDRESS+0 x100)(_IRQ_BASEADDRESS+0 x100)HandleADC#4HandleADC#4.HandleEINT4567#4HandleEINT4567#4图图1 执行执行sub sp,sp,#4sub sp,sp,#4时堆栈的情况时堆栈的情况图图2 2 执行执行stmfd sp!,r0,stmfd sp!,r0,将将R0R0压入堆栈压入堆栈后缀后缀“!”表示最后的地址写回到表示最后的地址写回到sp sp 中中图图3 3 执行执行str r0,sp,#4str r0,sp,#4,将,将R0R0压入堆栈压入堆栈 (R
31、0)=(R0)=HandleXXX HandleXXX处的内容,不改变处的内容,不改变SPSP的值。的值。图图4 ldmfd sp!,r0,pc4 ldmfd sp!,r0,pc;弹出两个字,分别送到;弹出两个字,分别送到R0R0,PCPC 4 4、MEXITMEXIT语语法格式:法格式:MEXITMEXITMEXITMEXIT用于从宏定用于从宏定义义中跳中跳转转出去。出去。ARM 指令系统4.1.6 其他常用的伪指令其他常用的伪指令 还还有有一一些些其其他他的的伪伪指指令令,在在汇汇编编程程序序中中经常会被使用,包括以下几条:经常会被使用,包括以下几条:AREA ALIGN CODE16、C
32、ODE32 ENTRY END EQU EXPORT(或(或GLOBAL)IMPORT EXTERN GET(或(或INCLUDE)INCBIN RN ROUT1、AREA语法格式:语法格式:AREA段名段名 属性属性1,属性,属性2,AREA伪伪指指令令用用于于定定义义一一个个代代码码段段或或数数据据段段。其其中中,段段名名若若以以数数字字开开头头,则则该该段段名名需需用用“|”括起来,如括起来,如|1_test|。属属性性字字段段表表示示该该代代码码段段(或或数数据据段段)的的相相关关属属性性,多多个个属属性性用用逗逗号号分分隔隔。常常用用的的属属性如下:性如下:CODE属属 性性:用用
33、于于 定定 义义 代代 码码 段段,默默 认认 为为READONLY。DATA属属 性性:用用 于于 定定 义义 数数 据据 段段,默默 认认 为为READWRITE。READONLY属属性性:指指定定本本段段为为只只读读,代代码码段段默默认认为为READONLY。READWRITE属属性性:指指定定本本段段为为可可读读可可写写,数数据据段段的的默认属性为默认属性为READWRITE。ALIGN属属性性:使使用用方方式式为为ALIGN 表表达达式式。在在默默认认时时,ELF(可可执执行行连连接接文文件件)的的代代码码段段和和数数据据段段是是按按字字对对齐齐的的,表表达达式式的的取取值值范范围围
34、为为031,相相应应的的对对齐齐方方式为式为2表达式次方。表达式次方。This is not the same as the way that This is not the same as the way that the the ALIGN ALIGN directive is specified.directive is specified.Do not use ALIGN=0 or ALIGN=1 for code Do not use ALIGN=0 or ALIGN=1 for code sections.sections.使用示例:使用示例:AREA Init,CODE,READ
35、ONLY;该该伪伪指指令令定定义义了了一一个个代代码码段段,段段名名为为Init,属性为只读,属性为只读 AREA MyDATA,DATA,READONLY,ALIGN=14AREA MyDATA,DATA,READONLY,ALIGN=14;(;(以以2 21414字节对齐字节对齐.).)2、ALIGN语法格式:语法格式:ALIGN表达式表达式,偏移量,偏移量 ALIGN伪伪指指令令可可通通过过添添加加填填充充字字节节的的方方式,使当前位置满足一定的对其方式式,使当前位置满足一定的对其方式|。其其中中,表表达达式式的的值值用用于于指指定定对对齐齐方方式式,可可能能的的取取值值为为2的的幂幂,
36、如如1、2、4、8、16等等。若若未未指指定定表表达达式式,则则将将当当前前位位置置对对齐齐到到下下一一个字的位置。个字的位置。偏偏移移量量也也为为一一个个数数字字表表达达式式,如如果果不不是是用用在在AREA里的里的,应该是应该是 表达式表达式 偏移量偏移量.将将两两个个字字节节的的数数据据放放在在同同一一个个字字的的第第一一个个字字节节和和第第四四个个字字节节中中,带带offset 的的ALIGN对齐对齐:AREA offsetFxample,CODE DCB 0 x31;第一个字节保存第一个字节保存0 x31 ALIGN 4,3;字对齐字对齐 DCB 0 x32;第四个字节保存第四个字节
37、保存0 x32 内容是内容是:0 x32000031 上上面面的的语语句句ALIGN 4,3意意义义是是:字字对对齐齐,然然后再加上偏移后再加上偏移3Examples AREA cacheable,CODE,ALIGN=3rout1 ;code;aligned on 8-byte boundary ;code MOV pc,lr;aligned only on 4-byte boundary ALIGN 8;now aligned on 8-byte boundaryrout2 ;code3、CODE16、CODE32语法格式:语法格式:CODE16(或(或CODE32)CODE16伪伪指指令
38、令通通知知编编译译器器,其其后后的的指指令令序列为序列为16位的位的Thumb指令。指令。CODE32伪伪指指令令通通知知编编译译器器,其其后后的的指指令令序列为序列为32位的位的ARM指令。指令。若若在在汇汇编编源源程程序序中中同同时时包包含含ARM指指令令和和Thumb指指令令时时,可可用用CODE16伪伪指指令令通通知知编编译译器器其其后后的的指指令令序序列列为为16位位的的Thumb指指令令,CODE32伪伪指指令令通通知知编编译译器器其其后后的的指指令令序序列列为为32位位的的ARM指指令令。因因此此,在在使使用用ARM指指令令和和Thumb指指令令混混合合编编程程的的代代码码里里,
39、可可用用这这两两条条伪伪指指令令进进行切换行切换 注注意意:他他们们只只通通知知编编译译器器其其后后指指令令的的类型,并不能对处理器进行状态的切换。类型,并不能对处理器进行状态的切换。AREAInit,CODE,READONLY CODE32;通知编译器其后的指令为通知编译器其后的指令为32位的位的ARM指令指令LDRR0,NEXT1;将跳转地址放入寄存将跳转地址放入寄存R0BX R0;程程序序跳跳转转到到新新的的位位置置执执行,并将处理器切换到行,并将处理器切换到Thumb工作状态工作状态CODE16;通通知知编编译译器器其其后后的指令为的指令为16位的位的Thumb指令指令NEXT LDR
40、R3,0 x3FF END;程序结束;程序结束4、ENTRY语法格式:语法格式:ENTRY ENTRY伪伪指指令令用用于于指指定定汇汇编编程程序序的的入入口口点点。在在一一个个完完整整的的汇汇编编程程序序中中至至少少要要有有一一个个ENTRY(也也可可以以有有多多个个,当当有有多多个个ENTRY时时,程程序序的的真真正正入入口口点点由由链链接接器器指指定定),但但在在一一个个源源文文件件里里最最多多只能有一个只能有一个ENTRY(可以没有)。(可以没有)。使用示例:使用示例:AREAInit,CODE,READONLYENTRY;指定应用程序的入口点;指定应用程序的入口点 5 5、ENDEND
41、语语法格式:法格式:ENDEND ENDEND伪伪指指令令用用于于通通知知编编译译器器已已经经到到了了源源程程序序的的结结尾尾,用用于于指指示示汇汇编编编编译译器器源源文文件件已已结结束束.每一个每一个汇编汇编源文件均要使用一个源文件均要使用一个.使用示例:使用示例:AREAAREAInitInit,CODECODE,READONLYREADONLYENDEND;指定;指定应应用程序的用程序的结结尾尾6 6、EQUEQU,可用可用“*”“*”代替。代替。语语法格式:法格式:名称名称EQUEQU 表达式表达式,类类型型 名称名称 必须顶格写必须顶格写EQUEQU伪伪指指令令用用于于为为程程序序中
42、中的的常常量量、标标号号等等定定义义一一个个等等效效的的字字符符名名称称,类类似似于于C C语语言言中中的的definedefine。名名称称为为EQUEQU伪伪指指令令定定义义的的字字符符名名称称,当当表表达达式式为为3232位位的的常常量量时时,可可以以指指定定表表达达式式的的数据数据类类型,可以有以下三种型,可以有以下三种类类型:型:CODE16CODE16、CODE32CODE32和和DATADATA使用示例:使用示例:TestTestEQUEQU 5050;定;定义标义标号号TestTest的的值为值为5050AddrAddrEQUEQU 0 x550 x55,CODE32CODE3
43、2;定定义义AddrAddr的的值值为为0 x550 x55,且且该该处处为为3232位位的的ARMARM指令。指令。7 7、EXPORTEXPORT(或(或GLOBALGLOBAL)语语法格式:法格式:EXPORTEXPORT标标号号WEAKWEAK EXPORTEXPORT伪伪指指令令用用于于在在程程序序中中声声明明一一个个全全局局的的标标号号,该该标标号号可可在在其其他他的的文文件件中引用。中引用。EXPORTEXPORT可用可用GLOBALGLOBAL代替。代替。标标号在程序中区分大小写号在程序中区分大小写 WEAKWEAK选选项项声声明明其其他他的的同同名名标标号号优优先于先于该标该
44、标号被引用。号被引用。使用示例:使用示例:AREAInit,CODE,READONLYEXPORTEXPORTStestStest ;声明一个可全局引用的标号;声明一个可全局引用的标号StestStest END 8 8、IMPORTIMPORT语语法格式:法格式:IMPORTIMPORT标标号号WEAKWEAK IMPORTIMPORT伪伪指指令令用用于于通通知知编编译译器器要要使使用用的的标标号号在在其其他他的的源源文文件件中中定定义义,但但要要在在当当前前源源文文件件中中引引用用,而而且且无无论论当当前前源源文文件件是是否否引引用用该该标标号号,该该标标号号均均会会被被加加入入到到当当前
45、前源源文文件件的的符符号表中。号表中。WEAKWEAK选选项项表表示示当当所所有有的的源源文文件件都都没没有有定定义义这这样样一一个个标标号号时时,编编译译器器也也不不给给出出错错误误信信息息,在在多多数数情情况况下下将将该该标标号号置置为为0 0,若若该该标标号号为为B B或或BLBL指指令令引引用用,则则将将B B或或BLBL指指令令置置为为NOPNOP操作。操作。使用示例:使用示例:AREAInit,CODE,READONLYIMPORTIMPORTMainMain;通通知知编编译译器器当当前前文文件件要要引引用用标标号号MainMain,但但MainMain在其他源文件中定义在其他源文
46、件中定义END 9 9、EXTERNEXTERN语语法格式:法格式:EXTERNEXTERN标标号号WEAKWEAK EXTERNEXTERN伪伪指指令令用用于于通通知知编编译译器器要要使使用用的的标标号号在在其其他他的的源源文文件件中中定定义义,但但要要在在当当前前源源文文件件中中引引用用,如如果果当当前前源源文文件件实实际际并并未未引引用用该该标标号号,该该标标号号就就不不会会被被加加入到当前源文件的符号表中。入到当前源文件的符号表中。使用示例:使用示例:AREAInit,CODE,READONLYEXTERNEXTERNMainMain;通通知知编编译译器器当当前前文文件件要要引引用用标
47、标号号MainMain,但,但MainMain在其他源文件中定义在其他源文件中定义END1010、GETGET(或(或INCLUDEINCLUDE)语语法格式:法格式:GETGET文件名文件名 GETGET伪伪指指令令用用于于将将一一个个源源文文件件包包含含到到当当前前的的源源文文件件中中,并并将将被被包包含含的的源源文文件件在当前位置在当前位置进进行行汇编处汇编处理。理。使用方法与使用方法与C C语语言中的言中的“include”“include”相似。相似。GETGET伪伪指指令令只只能能用用于于包包含含源源文文件件,包包含目含目标标文件需要使用文件需要使用INCBININCBIN伪伪指令
48、指令使用示例:使用示例:AREAAREAInitInit,CODECODE,READONLYREADONLY GETGETa1.sa1.s;通通知知编编译译器器当当前前源源文文件件包包含源文件含源文件a1.sa1.s GETGETC C:a2.sa2.s;通通知知编编译译器器当当前前源源文文件件包含源文件包含源文件C C:a2.s a2.s ENDEND1111、INCBININCBIN语语法格式:法格式:INCBININCBIN文件名文件名INCBININCBIN伪伪指指令令用用于于将将一一个个目目标标文文件件或或数数据据文文件件包包含含到到当当前前的的源源文文件件中中,被被包包含含的的文文
49、件件不不作作任任何何变变动动的的存存放放在在当当前前文文件件中中,编译编译器从其后开始器从其后开始继续处继续处理。理。使用示例:使用示例:AREAAREAInitInit,CODECODE,READONLYREADONLY INCBININCBINa1.data1.dat;通知;通知编译编译器当前源文件包含文件器当前源文件包含文件a1.data1.dat INCBIN INCBIN C C:a2.txta2.txt;通知通知编译编译器当前源文件包含文件器当前源文件包含文件 C C:a2.txta2.txt ENDEND1212、RNRN语语法格式:法格式:名称名称RNRN表达式表达式 RNRN
50、伪伪指指令令用用于于给给一一个个寄寄存存器器定定义义一一个个别别名名。采采用用这这种种方方式式可可以以方方便便程程序序员员记记忆忆该该寄寄存存器器的的功功能能。其其中中,名名称称为为给给寄寄存存器器定定义义的的别别名,表达式名,表达式为为寄存器的寄存器的编码编码。名称必须顶格写名称必须顶格写.使用示例:使用示例:TempTemp RN RN R0R0;将;将R0R0定定义义一个一个别别名名TempTemp1313、ROUTROUT语语法格式:法格式:名称名称 ROUTROUTROUTROUT伪伪指指令令用用于于给给一一个个局局部部变变量量定定义义作作用用范范围围。在在程程序序中中未未使使用用该