ARM汇编程序设计基础-第四章_第1页
ARM汇编程序设计基础-第四章_第2页
ARM汇编程序设计基础-第四章_第3页
ARM汇编程序设计基础-第四章_第4页
ARM汇编程序设计基础-第四章_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

第4章ARM汇编语言程序设计根底本章介绍ARM程序设计的一些根本概念:ARM汇编语言的伪操作、汇编语言的语句格式和汇编语言的程序结构,相关例如。第4章目录伪操作(directive)ARM汇编语言语句格式ARM汇编语言的程序格式相关的程序例如第4章目录伪操作(directive)ARM汇编语言语句格式ARM汇编语言的程序格式相关的程序例如4.1伪操作(directive)伪操作 伪操作在源程序中的作用是为完成汇编程序,进行各种准备工作〔如数据定义、分配存储区、指示程序结束)。这些伪操作仅在汇编过程中起作用,一旦汇编结束,伪操作的使命就完成。如DCDFunction;就是分配一个字单元,存放Function这个标号,汇编后这个字单元的内容就为Function标号的地址。4.1伪操作(directive)宏 通过伪操作〔MACRO/MEND)将一段代码定义为一个整体称为宏。 宏操作的使用方式和功能与子程序类似,区别在于调用宏时编译程序会在调用处插入宏的程序段,有多少次调用就会插入多少次宏的程序段,而调用子程序不增加新的程序段。使用宏的好处是不占用传送参数的存放器,不用保护现场。4.1伪操作(directive)在ARM的汇编程序中,有如下几种伪操作:符号定义伪操作数据定义伪操作汇编控制伪操作其他伪操作。4.1伪操作(directive)符号定义伪操作符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义存放器的别名等操作。常见的符号定义伪操作有如下几种:定义全局变量:GBLAGBLLGBLS定义局部变量:LCLALCLLLCLS变量赋值: SETA、SETL、SETS通用存放器列表定义名称:RLIST4.1伪操作(directive)符号定义伪操作符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义存放器的别名等操作。常见的符号定义伪操作有如下几种:定义全局变量:GBLAGBLLGBLS定义局部变量:LCLALCLLLCLS变量赋值: SETA、SETL、SETS通用存放器列表定义名称:RLIST4.1伪操作(directive)定义全局变量——GBLAGBLLGBLS语法格式: GBLA〔GBLL或GBLS〕全局变量名GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中的全局变量,并将其初始化。GBLA伪操作用于定义一个全局的数字变量,并初始化为0;GBLL伪操作用于定义一个全局的逻辑变量,并初始化为False〔假〕;GBLS伪操作用于定义一个全局的字符串变量,并初始化为空;注意:由于以上三条伪操作用于定义全局变量,因此在整个程序范围内变量名必须唯一。作用范围为包含该变量的源程序GlobalArithmeticLogicString4.1伪操作(directive)定义全局变量——GBLAGBLLGBLS使用例如: GBLAobjectsize ;定义全局的数字变量objectsize,为0 ObjectsizeSETA0xff ;将该变量赋值为0xff

GBLLstatusB ;定义全局的逻辑变量statusB,为{False} statusBSETL{TRUE};将该变量赋值为真4.1伪操作(directive)符号定义伪操作符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义存放器的别名等操作。常见的符号定义伪操作有如下几种:定义全局变量:GBLAGBLLGBLS定义局部变量:LCLALCLLLCLS变量赋值: SETA、SETL、SETS通用存放器列表定义名称:RLIST4.1伪操作(directive)定义局部变量——LCLALCLLLCLS语法格式: LCLA〔LCLL或LCLS〕局部变量名LCLA、LCLL和LCLS伪操作用于定义一个ARM程序中的局部变量,并将其初始化。LCLA伪操作用于定义一个局部的数字变量,并初始化为0;LCLL伪操作用于定义一个局部的逻辑变量,并初始化为False〔假〕;LCLS伪操作用于定义一个局部的字符串变量,并初始化为空;注意:以上三条伪操作用于声明局部变量,在其作用范围内变量名必须唯一。4.1伪操作(directive)符号定义伪操作符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义存放器的别名等操作。常见的符号定义伪操作有如下几种:定义全局变量:GBLAGBLLGBLS定义局部变量:LCLALCLLLCLS变量赋值: SETA、SETL、SETS通用存放器列表定义名称:RLIST4.1伪操作(directive)变量赋值——SETA、SETL、SETS语法格式: 变量名 SETA〔SETL或SETS〕 表达式〔expression)伪操作SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值。SETA伪操作用于给一个数学变量赋值;SETL伪操作用于给一个逻辑变量赋值;SETS伪操作用于给一个字符串变量赋值;注意:在向变量赋值前,必须先声明该变量。4.1伪操作(directive)变量赋值——SETA、SETL、SETS使用例如: LCLA Test3 ;声明一个局部的数字变量,变量名为Test3 Test3 SETA 0xaa ;将该变量赋值为0xaa LCLL Test4 ;声明一个局部的逻辑变量,变量名为Test4 Test4 SETL {TRUE} ;将该变量赋值为真4.1伪操作(directive)符号定义伪操作符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义存放器的别名等操作。常见的符号定义伪操作有如下几种:定义全局变量:GBLAGBLLGBLS定义局部变量:LCLALCLLLCLS变量赋值: SETA、SETL、SETS通用存放器列表定义名称:RLIST4.1伪操作(directive)通用存放器列表定义名称——RLIST语法格式: 名称 RLIST {存放器列表}RLIST伪操作可用于对一个存放器列表定义名称,使用该伪操作定义的名称可在ARM指令LDM/STM中使用。使用例如: RegListRLIST{r0-r6,r8,r10-r12,r15} ;将存放器列表名称定义为RegList, ;可在ARM指令LDM/STM中通过该名称访问存放器列表。 ;如,LDMIASP!,RegList4.1伪操作(directive)CN为一个协处理器的存放器命名PowerCN6;将协处理器的存放器6名称定义为powerCP为一个协处理器命名DmuCP7;将协处理器7命名为DmuDN为一个双精度〔8字节〕的VFP〔vectorfloatingprocessor浮点向量协处理器〕存放器定义名称SN为一个单精度〔4字节〕VFP存放器命名HeightDN6;将VFP双精度存放器6名称定义为HeightwidthSN16;将VFP单精度存放器16名称定义为widthFN为一个FPA〔floatingprocessoraccelerate浮点加速协处理器〕的浮点存放器定义名称HeightFN6;将浮点存放器6命名为Height4.2伪指令ARM伪指令包括:

ADR、ADRL、LDR和NOP 这些伪指令在汇编编译器对源程序进行汇编处理时将被替换成ARM或Thumb指令。ADR〔小范围的地址读取指令〕 该指令将基于PC的地址值或基于存放器的地址值放入存放器中,语法格式:ADR{cond}register,expression 在汇编编译器处理源程序时,ADR伪指令被编译器替换成一条适宜的指令,通常是一条ADD指令或SUB指令来实现该ADR伪指令的功能。startmovr0,#10 adrr4,start xxxxxx,xxx xxxxx,xxx ;因为PC值为当前指令地址值加8字节,本ADR伪指 ;令将被编译器替换成SUBr4,pc,#0xc4.2伪指令ARM伪指令——小范围的地址读取ADR伪指令将基于PC相对偏移的地址值或基于存放器相对偏移的地址值读取到存放器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条适宜的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,假设不能用一条指令实现,那么产生错误,编译失败。...ADRR0,Delay...DelayMOVR0,r14...应用例如〔源程序〕:使用伪指令将程序标号Delay的地址存入R0...0x20ADDr0,pc,#0x3c......0x64MOVr0,r14...ARM伪指令——小范围的地址读取...ADRR0,Delay...DelayMOVR0,r14...应用例如〔源程序〕:编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0地址程序代码上面的PC为0x28ARM伪指令——小范围的地址读取...ADRR0,Delay...DelayMOVR0,r14...应用例如〔源程序〕:...0x20ADDr0,pc,#0x3c......0x64MOVr0,r14...编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0ADR伪指令被汇编成一条指令实际偏移为PC值为0x28,=〉0x28+0x3c=0x64ARM伪指令——小范围的地址读取应用例如2〔查表〕: ADRR0,DISP_TAB ;加载转换表地址LDRBR1,[R0,R2] ;使用R2作为参数,进行查表…DISP_TABDCB0xC0,0xF9,0xA4,0xB0,0x99ADRL〔中等范围的地址读取指令〕 该指令将基于PC的地址值或基于存放器的地址值放入存放器中,ADRL伪指令比ADR伪指令可以读取更大的范围的地址。ADRL伪指令在汇编时被编译器替换成两条指令。语法格式:ADRL{cond}register,expression 在汇编编译器处理源程序时,ADRL伪指令被编译器替换成两条适宜的指令,即使一条指令可以完成该伪指令的功能,编译器也将用两条指令来替换该ADRL伪指令。4.2伪指令startmovr0,#10 ADRLr4,start+60000; 60000=0xea60 ;因为PC值为当前指令地址值加8,本ADRL伪指令将被编译器替换成下面两条指令: ADDr4,pc,#0xE800 ADDr4,r4,#0x254 r4=pc-0xc+0xea60=pc+0xe800+0x254 =pc+0xea544.2伪指令ARM伪指令——中等范围的地址读取ADRL伪指令将基于PC相对偏移的地址值或基于存放器相对偏移的地址值读取到存放器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条适宜的指令。假设不能用两条指令实现,那么产生错误,编译失败。...ADRLR0,Delay...DelayMOVR0,r14...应用例如〔源程序〕:使用伪指令将程序标号Delay的地址存入R0ARM伪指令——中等范围的地址读取ADRL伪指令将基于PC相对偏移的地址值或基于存放器相对偏移的地址值读取到存放器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条适宜的指令。假设不能用两条指令实现,那么产生错误,编译失败。...ADRLR0,Delay...DelayMOVR0,r14...应用例如〔源程序〕:...0x20ADDr0,pc,#0x400x24ADDr0,r0,#0...0x68MOVr0,r14...编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0地址程序代码ARM伪指令——中等范围的地址读取...ADRLR0,Delay...DelayMOVR0,r14...应用例如〔源程序〕:...0x20ADDr0,pc,#0x400x24ADDr0,r0,#0...0x68MOVr0,r14...编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0ADRL伪指令被汇编成两条指令,尽管第2条指令并没有意义上面的pc为0x284.2伪指令LDR(大范围的地址读取伪指令) LDR伪指令将一个32位的常数或者一个地址值读取到存放器中。LDR{cond}register,=[expr|label-expr] expr为32位常量。当expr表示的地址指没有超过MOV/MVN指令中的地址取值范围时,编译器用适宜的MOV/MVN指令代替该LDR伪指令。例1:将0xff0读取到R1中。 LDRR1,=0xff0 汇编后: MOVR1,#0xff0 LDR{cond}register,=[expr|label-expr] 当expr表示的地址指超过MOV/MVN指令中的地址取值范围时,编译器通常将该常数放在数据缓冲区,同时用一条基于pc的LDR读取该常数。例2:将0xfff读取到R1 LDRR1,=0xfff 汇编后为: LDRR1,[PC,offset_to_lpool] ……lpoolDCD0xfffLDR{cond}register,=[expr|label-expr]label-expr为基于pc的地址标号。例3:将外部地址ADDR1读取到R1中。 LDRR1,=ADDR1 汇编后将得到: LDRR1,[PC,offset_to_lpool] …….lpoolDCDADDR1 …….ADDR1 ….....4.1伪操作(directive)ARM汇编器所支持的伪操作在ARM的汇编程序中,有如下几种伪指令:符号定义伪操作数据定义伪操作汇编控制伪操作其他伪指操作4.1伪操作(directive)数据定义伪操作数据定义伪操作,一般用于为特定的数据,分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪指令有如下几种:LTORGMAPFIELDSPACEDCB、DCW〔DCWU〕、DCD〔DCDU〕、DCQ〔DCQU〕DCFD〔DCFDU〕 DCFS〔DCFSU〕LTORG用于声明一个数据缓冲池〔literalpool〕的开始 当程序中使用了LDR伪指令时,数据缓冲池的使用可能越界。这时可以使用LTORG伪操作。防止越界发生,通常大的代码段可以使用多个数据缓冲池。 LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误地将数据缓冲池中的数据当作指令来执行。LTORG声明一个数据缓冲池LTORG ….. LDRR1,=0X55555555

;被编译成LDRR1,[PC,#OFFSETTOLITERALPOOL1]

….. MOVPC,LR ;子程序返回 ;定义数据缓冲池存放0X55555555Dataspace4200 ;分配4200字节的内存单元;假设LTORG在此处那么OFFSET超出4k,无法存放0X55555555 END偏移必须小于4k在LDR指令中的12位(212=4k)来表示偏移量存放0X55555555的地址dcd0X555555554.1伪操作(directive)数据定义伪操作——MAP语法格式: MAP表达式{,基址存放器} MAP伪操作用于定义一个结构化的内存表的首地址〔即表中第一个元素的地址〕。表达式可以为程序中的标号或数学表达式。 {,基址存放器},为可选项,当基址存放器选项不存在时,表达式的值即为内存表的首地址,当{,基址存放器}该选项存在时,内存表的首地址为表达式的值与基址存放器的和。 MAP伪操作通常与FIELD伪操作配合使用来定义结构化的内存表。MAP也可用“^”代替。4.1伪操作(directive)数据定义伪操作——FIELD语法格式:

{标号} FIELD表达式 FIELD伪操作用于定义一个结构化内存表中的数据域。表达式的值为当前数据域在内存表中所占的字节数。 FIELD伪操作常与MAP伪操作配合使用来定义结构化的内存表。MAP伪操作定义内存表的首地址,FIELD伪操作定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。注意:MAP和FIELD伪操作仅用于定义数据结构,并不实际分配存储单元。4.1伪操作(directive)数据定义伪操作——FIELD参见教材121页到123页使用例如。datastrucspace280 ;为datastruc结构保存280字节的存储空间 MAP datastruc;定义结构化内存表首地址consta FIELD 4 ;consta的长度为4字节,相对位置为0constb FIELD 4 ;constb的长度为4字节,相对位置为4x # 8 ;x的长度为8字节,相对位置为0x8y # 8 ;y的长度为8字节,相对位置为0x10string # 256 ;y的长度为256字节,相对位置为0x18 LDR R5,constb ;将内存表中数据域constb读取到R5中4.1伪操作(directive)数据定义伪操作——SPACE语法格式: {标号} SPACE表达式SPACE伪操作用于分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。SPACE也可用“%”代替。 使用例如: DataSpaceSPACE280 ;分配连续280字节的存储单元并初始化为04.1伪操作(directive)数据定义伪操作——DCB语法格式: {标号} DCB 表达式DCB伪操作用于分配一片连续的字节存储单元,并用伪操作中指定的表达式初始化。其中,表达式可以为-128~255的数字或字符串。DCB也可用“=”代替。使用例如: Nullstring DCB “Nullstring”,0 ;构造一个以NULL结尾的字符串4.1伪操作(directive)数据定义伪操作——DCW〔或DCWU〕语法格式: {标号} DCW〔或DCWU〕 表达式DCW〔或DCWU〕伪操作用于分配一片连续的半字存储单元并用伪操作中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。 DCW:半字对齐 DCWU:不严格半字对齐。 表达式取值范围:-32768~65535使用例如: data1 DCW 1,2,3,-128,num1+8 ;num1必须是已经定义过的4.1伪操作(directive)数据定义伪操作——DCD〔或DCDU〕语法格式: {标号} DCD〔或DCDU〕 表达式DCD〔或DCDU〕伪操作用于分配一片连续的字存储单元并用伪操作中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用“&”代替。 DCD:字对齐 DCDU:不严格字对齐。使用例如: data1 DCD 1,5,20 ;其值为1,5,20 data2 DCD memaddr+4;分配一个字单元,其值为程序中标号memaddr的地址加4个字节4.1伪操作(directive)数据定义伪操作——DCQ〔或DCQU〕语法格式: {标号} DCQ〔或DCQU〕 表达式DCQ〔或DCQU〕伪操作用于分配一片连续的双字存储单元并用伪操作中指定的表达式初始化。 DCQ:字对齐 DCQU:不严格字对齐。使用例如: data1 DCQ 1,5,20 ;其值为1,5,20

4.1伪操作(directive)数据定义伪操作——DCFD〔或DCFDU〕语法格式: {标号} DCFD〔或DCFDU〕 表达式DCFD〔或DCFDU〕伪操作用于为双精度的浮点数分配一片连续的字存储单元,并用伪操作中指定的表达式初始化。每个双精度的浮点数占据两个字单元。 DCFD:字对齐 DCFDU:不严格字对齐。使用例如: FDataTest1 DCFD 1E30,-4E-100 FDataTest2 DCFDU 100000,3.1E264.1伪操作(directive)数据定义伪操作——DCFS〔或DCFSU〕语法格式: {标号} DCFS〔或DCFSU〕 表达式DCFS〔或DCFSU〕伪操作用于为单精度的浮点数分配一片连续的字存储单元并用伪操作中指定的表达式初始化。每个单精度的浮点数占据一个字单元。 DCFS:字对齐 DCFSU:不严格字对齐。使用例如: FDataTest1 DCFS 1E3,-4E-9 FDataTest2 DCFSU 1.00000,3.1E64.1伪操作(directive)ARM汇编器所支持的伪操作在ARM的汇编程序中,有如下几种伪操作:符号定义伪操作数据定义伪操作汇编控制伪操作其他伪操作。4.1伪操作(directive)汇编控制伪操作汇编控制〔AssemblyControl〕伪操作用于控制汇编程序的执行流程,常用的汇编控制伪操作包括以下几条:IF、ELSE、ENDIFWHILE、WENDMACRO、MENDMEXIT4.1伪操作(directive)汇编控制伪操作——IF、ELSE、ENDIF

语法格式: IF 逻辑表达式 指令序列1 ELSE 指令序列2 ENDIFIF、ELSE、ENDIF伪操作能根据条件的成立与否决定是否执行某个指令序列。当IF后面的逻辑表达式为真,那么执行指令序列1,否那么执行指令序列2。其中,ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,那么执行指令序列1,否那么继续执行后面的指令。IF、ELSE、ENDIF伪操作可以嵌套使用。IF 逻辑表达式

指令序列1ENDIF4.1伪操作(directive)汇编控制伪操作——IF、ELSE、ENDIF

使用例如: GBLL Test ;声明一个全局的逻辑变量为Test, ;并初始化为F〔假〕 …… IF Test=TRUE 指令序列1 ELSE 指令序列2 ENDIF4.1伪操作(directive)汇编控制伪操作——WHILE、WEND

语法格式: WHILE逻辑表达式 指令序列 WENDWHILE、WEND伪操作能根据条件的成立与否决定是否循环执行某个指令序列。当WHILE后面的逻辑表达式为真,那么执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,假设为真那么继续执行,一直到逻辑表达式的值为假。WHILE、WEND伪操作可以嵌套使用。4.1伪操作(directive)汇编控制伪操作——WHILE、WEND

使用例如: count SETA 1 WHILE count<=4 count SETA count+1 ;code WEND4.1伪操作(directive)汇编控制伪操作——MACRO、MEND

语法格式:

MACRO $标号宏名$参数1,$参数2,…… 指令序列 MEND4.1伪操作(directive)汇编控制伪操作——MACRO、MEND

使用例如:在ARM中完成测试-跳转操作需要两条指令,定义一条宏指令完成测试-跳转操作MACRO$label TestAndBranch $dest,$reg,$cc$label CMP $reg, #0 B$cc $destMEND;在程序中调用该宏testTestAndBranchNonZero,r0,NE……NonZero;程序被汇编后,宏展开的结果 testCMPr0,#0 BNENonZero … … NonZero4.1伪操作(directive)汇编控制伪操作——MEXIT语法格式: MEXITMEXIT用于从宏定义中跳转出去,提前退出宏定义。4.1伪操作(directive)ARM汇编器所支持的伪操作在ARM的汇编程序中,有如下几种伪操作:符号定义伪操作数据定义伪操作汇编控制伪操作其他伪操作。4.1伪操作(directive)其他伪操作还有一些其他的伪操作,在汇编程序中经常会被使用,包括以下几条:AREACODE16、CODE32ENTRYENDEQUIMPORTGET〔或INCLUDE〕 INCBINRN4.1伪操作(directive)其他伪操作——CODE16、CODE32语法格式: CODE16〔或CODE32〕 CODE16:通知编译器,其后的指令序列为16位的Thumb指令。 CODE32:通知编译器,其后的指令序列为32位的ARM指令。注意:他们只通知编译器其后指令的类型,并不能对处理器进行状态的切换。4.1伪操作(directive)其他伪操作——EQU语法格式: 名称 EQU 表达式{,类型}EQU伪操作用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define。其中EQU可用“*”代替。名称为EQU伪操作定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有以下三种类型:CODE16、CODE32和DATA使用例如: abcd EQU2;定义abcd符号的值为2 abcd EQUlabel1+16;定义abcd符号的值〔label1+16) Addr EQU 0x55,CODE32 ;定义Addr的绝对地址值为0x55,且该处为32位的ARM指令。4.1伪操作(directive)其他伪操作——AREA语法格式: AREA 段名属性1,属性2,……AREA伪操作用于定义一个代码段或数据段。其中,段名假设以数字开头,那么该段名需用“|”括起来,如|1_test|。常用的属性如下: CODE:用于定义代码段,默认为READONLY。 DATA:用于定义数据段,默认为READWRITE。 READONLY:指定本段为只读,代码段默认为READONLY。 READWRITE:指定本段为可读可写,数据段的默认属性为READWRITE。4.1伪操作(directive)其他伪操作——AREA使用例如: AREA Example,CODE,READONLY …… ;code;该伪操作定义了一个代码段,段名为Example,属性为只读4.1伪操作(directive)其他伪操作——CODE16、CODE32使用例如: AREA ChangeState,CODE,READONLY CODE32 ;指示下面的指令为ARM指令 LDR r0,=start+1 BX r0 ;切换到Thumb状态,并跳转到start处执行 CODE16 ;指示下面的指令为Thumb指令start MOVr1,#10 4.1伪操作(directive)其他伪操作——ENTRY语法格式: ENTRYENTRY伪操作用于指定汇编程序的入口点。在一个源文件里最多只能有一个ENTRY〔可以没有〕。在一个完整的汇编程序中至少要有一个ENTRY〔当有多个ENTRY时,程序的真正入口点由链接器指定〕。使用例如: AREAexample,CODE,READONLY ENTRY ;应用程序的入口点4.1伪操作(directive)其他伪操作——END语法格式: ENDEND伪操作用于通知编译器已经到了源程序的结尾使用例如: AREAexample,CODE,READONLY …… END

ALIGNEXPORTIMPORTEXTERN源文件〔源代码〕目标文件〔ELF格式〕映像文件〔ELF格式〕1.查找源文件的错误并给出错误信息和报警信息2.汇编语言编译成16位或32位指令代码3.给出编译信息,对源程序进行优化编译连接芯片1.找出个文件之间的跳转和相互调用关系,对个文件分配地址并连接,进行优化2.提取所引用的c/c++组件下载文件中程序的位置关系和实际的存储地址是对应的4.1伪操作(directive)其他伪操作——GET〔或INCLUDE〕语法格式:

GET 文件名用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。使用方法与C语言中的“include”相似。汇编程序中常用的方法是在某源文件中定义一些宏指令,用EQU定义常量的符号名称,用MAP和FIELD定义结构化的数据类型,然后用GET伪操作将这个源文件包含到其他的源文件中。使用方法与C语言中的“include”相似。注意:GET伪操作只能用于包含源文件,不能包含目标文件。4.1伪操作(directive)其他伪操作——GET〔或INCLUDE〕使用例如: AREAexample,CODE,READONLY GETfile1.s ;包含源文件file1.s GETC:\project\file2.s ;包含源文件file2.s GETC:\Programfiles\file3.s ;包含源文件file3.s4.1伪操作(directive)其他伪操作——INCBIN

语法格式: INBIN 文件名INCBIN伪操作用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理。使用例如:AREA Init,CODE,READONLYINCBIN a1.dat ;通知编译器当前源文件包含文件a1.datINCBINC:\a2.txt ;当前源文件包含文件C:\a2.txt……END 4.3ARM汇编语言语句格式4.3ARM汇编语言语句格式 {标号} {指令或伪操作} {;注释} 标号:从一行的行头开始,不能包含空格 指令或伪操作:指令的前面必须有空格或符号〔不能顶格写〕 注释:以“;”开头每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用〔如,Ldr〕。语句之间可以插入空行。如果一条语句太长,可将该长语句分为假设干行来书写,在行的末尾用“\”表示下一行与本行为同一条语句。4.3ARM汇编语言语句格式ARM汇编语言中的符号——命名规那么在汇编语言程序设计中,经常使用各种符号代替地址、变量和常量等,以增加程序的可读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定:符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。符号在其作用范围内必须唯一。局部标号〔字在当前段起作用〕以数字开头,其他符号不能以数字开头。自定义的符号名不能与系统的保存字相同。符号名不应与指令或伪操作同名。4.3ARM汇编语言语句格式ARM汇编语言中的符号——程序中的变量程序中的变量是指其值在程序的运行过程中可以改变的量。ARM〔Thumb〕汇编程序所支持的变量有数字变量、逻辑变量和字符串变量:数字值的大小不应超出数字变量所能表示的范围。逻辑变量只有两种取值情况:真{true}或假{false}字符串变量的长度不应超出字符串变量所能表示的范围GBLA、GBLL、GBLS:声明全局变量LCLA、LCLL、LCLS:声明局部变量SETA、SETL和SETS:赋值4.3ARM汇编语言语句格式ARM汇编语言中的符号——程序中的常量程序中的常量是指其值在程序的运行过程中不能被改变的量。ARM〔Thumb〕汇编程序所支持的常量有数字常量、逻辑常量和字符串常量。数字常量一般为32位的整数,当作为无符号数时,其取值范围为0~232-1,当作为有符号数时,其取值范围为-231~231-1。逻辑常量只有两种取值情况:真或假。字符串常量为一个固定的字符串,一般用于程序运行时的信息提示。一般用EQU来声明常量4.3ARM汇编语言语句格式ARM汇编语言中的符号——程序中的变量代换程序中的变量可通过代换操作取得一个常量。代换操作符为“$”。如果在数字变量前面有一个代换操作符“$”,编译器会将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换“$”后的数字变量。使用例如:LCLA A1 ;定义局部数字变量A1LCLS S2 ;定义局部字符串变量S2A1 SETA 56 ;56=0x00000038S2 SETS “Thisisanumber$A1”;字符串变量S2的值为“Thisisanumber00000038”4.3ARM汇编语言语句格式ARM汇编语言中的符号——程序中的标号标号代表一个地址,可以表示程序中的指令或者数据地址。段内标号的地址值在汇编时确定,段外标号的地址值在链接时确定。在此要区别基于PC的标号和基于存放器的标号:基于PC的标号:位于目标指令前或者程序中数据定义伪操作前的标号。汇编时将被处理成PC值加上或减去一个数字常量。常用于表示跳转指令的目标地址,或者代码段中的少量数据。基于存放器的标号:用MAP,FIELD伪操作定义。汇编时将被处理成存放器的值加上或减去一个数字常量。常用于访问位于数据段中的数据。绝对地址:32位数字量4.3ARM汇编语言语句格式ARM汇编语言中的表达式

在汇编语言程序设计中,也经常使用各种表达式,表达式一般由变量、常量、运算符和括号构成。常用的表达式有数字表达式、逻辑表达式和字符串表达式,其运算次序遵循如下的优先级:括号运算符的优先级最高。优先级相同的双目运算符的运算顺序为从左到右。相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运算符。4.3ARM汇编语言语句格式ARM汇编语言中的表达式————数字表达式整数数字量例如: a SETA 34906 Addr DCD 0xA10E LDR R4,&1000000F DCD 2_11001010 ;2进制数 0x000000ca c3 SETA 8_74007 ;8进制数 0x00007807 DCQ 0x123456789abcdef ;16进制数 ;0x89abcdef,0x012345674.3ARM汇编语言语句格式ARM汇编语言中的表达式————数字表达式浮点数字量 单精度浮点数表示范围:3.4e+38~1.18e-38 双精度浮点数表示范围:1.8e+

温馨提示

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

评论

0/150

提交评论