版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目前常用的编译环境有2种:1.ADS/SDT、RealViewMDK等ARM公司推出的开发工具2.GNUARM开发工具第1页/共56页 1.ADS/SDT、RealViewMDK等ARM公司推出的开发工具 ADS由ARM公司推出,使用了CodeWarrior公司的编译器。针对ARM资源配置为用户提供了在CodeWarriorIDE集成环境下配置各种ARM开发工具的能力。 以ARM为目标平台的工程创建向导,可以使用户以此为基础,快速创建ARM和Thumb工程。第2页/共56页 ARM将Keil公司收购之后,正式推出了针对ARM微控制器的开发工具RealViewMicrocontrollerDev
2、elopmentKit(简称RealViewMDK或者MDK),它将ARM开发工具RealViewDevelopmentSuite(简称RVDS)的编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM微控制器开发工具。第3页/共56页 2.GNUARM开发工具 GNU是“GNUsNotUnix”的递归缩写。在1983年9月27日由RichardStallman公开发起GNU计划,它的目标是创建一套完全自由的操作系统。 GNU格式ARM汇编语言程序主要是面对在ARM平台上移植嵌入式Linux操作系统,GNU组织开发的基于ARM平台的编译工具有主要由GNU的汇编器as
3、,交叉汇编器gcc和连接器ld组成。第4页/共56页61 汇编语言伪指令汇编语言伪指令 伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。 ARM伪指令有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。第5页/共56页ARM伪指令大范围的地址读取 LDRLDR伪指令用于加载伪指令用于加载3232位的立即数或一个地址值到指定寄存器。在汇位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,编编译源程序时,LDRLDR伪指令被编译器替换成一条合适的指令。若
4、加载的伪指令被编译器替换成一条合适的指令。若加载的常数未超出常数未超出MOVMOV或或MVNMVN的范围,则使用的范围,则使用MOVMOV或或MVNMVN指令代替该指令代替该LDRLDR伪伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDRLDR指指令从文字池读出常量。令从文字池读出常量。LDRcond register,= expr | label_exprLDR伪指令格式指令执行的条件码指令执行的条件码加载的目标寄存器加载的目标寄存器基于基于PCPC的地址表达式的地址表达式或外部表达式或外部表达式注意注意:1. 1.从
5、指令位置到文字池的偏移量必须小于从指令位置到文字池的偏移量必须小于4KB4KB;2.2.与与ARMARM指令的指令的LDRLDR相比,伪指令的相比,伪指令的LDRLDR的参数有的参数有“=”号。号。第6页/共56页ARM伪指令大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载常量):应用示例(加载常量):LDR R2, =0 xF
6、F0 ;MOV R2, #0 xFF0LDR R0, =0 xFF000000 ;MOV R0, #0 xFF000000LDR R1, =0 xFFFFFFFE ;MVN R1, #0 x1第7页/共56页ARM伪指令大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载地址):应用示例(加载地址): . LDR R1,=InitS
7、tack .InitStack MOV R0, LR .使用伪指令将程序标号使用伪指令将程序标号InitStackInitStack的地址存入的地址存入R1R1第8页/共56页ARM伪指令大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载地址):应用示例(加载地址):编译后的反汇编代码:编译后的反汇编代码: . LDR R1,=I
8、nitStack .InitStack MOV R0, LR . .0 x60 LDR R1,0 xb4 .0 x64 MOV R0, LR .0 xb4 DCD 0 x64使用伪指令将程序标号使用伪指令将程序标号InitStackInitStack的地址存入的地址存入R1R1地址地址程序代码程序代码第9页/共56页ARM伪指令大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对
9、偏移的LDR指令从文字池读出常量。应用示例(加载地址):应用示例(加载地址):编译后的反汇编代码:编译后的反汇编代码: . LDR R1,=InitStack .InitStack MOV R0, LR . .0 x60 LDR R1,0 xb4 .0 x64 MOV R0, LR .0 xb4 DCD 0 x64使用伪指令将程序标号使用伪指令将程序标号InitStackInitStack的地址存入的地址存入R1R1LDRLDR伪指令被汇编成一条伪指令被汇编成一条LDRLDR指令,指令,并在文字池中定义了一个常量,该并在文字池中定义了一个常量,该常量为常量为InitStackInitStack
10、标号的地址标号的地址第10页/共56页ARM伪指令中等范围的地址读取 ADRLADRL伪指令将基于伪指令将基于PCPC相对偏移的地址值或基于寄存器相对偏移的地相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比址值读取到寄存器中,比ADRADR伪指令可以读取更大范围的地址伪指令可以读取更大范围的地址 。在汇编编。在汇编编译器编译源程序时,译器编译源程序时,ADRLADRL伪指令被编译器替换成两条合适的指令。若不伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。能用两条指令实现,则产生错误,编译失败。ADRLcond register,exprADRLAD
11、RL伪指令格式伪指令格式指令执行的条件码指令执行的条件码加载的目标寄存器加载的目标寄存器地址表达式地址表达式 地址表达式地址表达式exprexpr的取指范围:的取指范围:当地址值是字节对齐时,其取指范围为当地址值是字节对齐时,其取指范围为-64K-64K64K64K;当地址值是字对齐时,其取指范围为当地址值是字对齐时,其取指范围为-256K-256K256K256K;第11页/共56页ARM伪指令中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两
12、条合适的指令。若不能用两条指令实现,则产生错误,编译失败。 . ADRL R0,Delay .Delay MOV R0,r14 .应用示例(源程序):应用示例(源程序):使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R0第12页/共56页ARM伪指令中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。 . ADRL R0,Delay .Delay MOV
13、 R0,r14 .应用示例(源程序):应用示例(源程序): .0 x20 ADD r1,pc,#400 x24 ADD r1,r1,#FF00 .0 xFF68 MOV r0,r14 .编译后的反汇编代码:编译后的反汇编代码:使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R0地址地址程序代码程序代码第13页/共56页ARM伪指令中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实
14、现,则产生错误,编译失败。 . ADRL R0,Delay .Delay MOV R0,r14 .应用示例(源程序): . 0 x20 ADD r1,pc,#400 x24 ADD r1,r1,#FF00 .0 xFF68 MOV r0,r14 .编译后的反汇编代码:使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R0ADRLADRL伪指令被汇编成两条指令伪指令被汇编成两条指令第14页/共56页ARM伪指令小范围的地址读取 ADRADR伪指令将基于伪指令将基于PCPC相对偏移的地址值或基于寄存器相对偏移的地址相对偏移的地址值或基于寄存器相对偏移的地址值读取到
15、寄存器中。在汇编编译器编译源程序时,值读取到寄存器中。在汇编编译器编译源程序时,ADRADR伪指令被编译器替伪指令被编译器替换成一条合适的指令。通常,编译器用一条换成一条合适的指令。通常,编译器用一条ADDADD指令或指令或SUBSUB指令来实现该指令来实现该ADRADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。ADRcond register,exprADRADR伪指令格式伪指令格式指令执行的条件码指令执行的条件码加载的目标寄存器加载的目标寄存器地址表达式地址表达式 地址表达式地址表达式exprexpr的取指范围:的取
16、指范围:当地址值是字节对齐时,其取指范围为当地址值是字节对齐时,其取指范围为-255-255255255;当地址值是字对齐时,其取指范围为当地址值是字对齐时,其取指范围为-1020-102010201020;第15页/共56页ARM伪指令小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。 . ADR R0,Delay .Delay MOV R0,r14 .应用示例(源
17、程序):应用示例(源程序):使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R0第16页/共56页 .0 x20 ADD r1,pc,#0 x3c . .0 x64 MOV r0,r14 .ARM伪指令小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。 . ADR R1,Delay .Delay MOV R0,r14 .应用示例(源
18、程序):应用示例(源程序):编译后的反汇编代码:编译后的反汇编代码:使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R0地址地址程序代码程序代码第17页/共56页ARM伪指令小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。 . ADR R0,Delay .Delay MOV R0,r14 .应用示例(源程序):应用示例(源程序):
19、 .0 x20 ADD r1,pc,#0 x3c . .0 x64 MOV r0,r14 .编译后的反汇编代码:编译后的反汇编代码:使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R0ADRADR伪指令被汇编成一条指令伪指令被汇编成一条指令第18页/共56页ARM伪指令小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。 应用示例应用
20、示例2 2(查表):(查表): ADR R0,DISP_TAB; ; 加载转换表地址加载转换表地址 LDRB R1,R0,R2; ; 使用使用R2R2作为参数,进行查表作为参数,进行查表 DISP_TAB DCB 0 xC0,0 xF9,0 xA4,0 xB0,0 x99, 0 x92,0 x82,0 xF8第19页/共56页ARM伪指令空操作伪指令 NOPNOP伪指令在汇编时将会被代替成伪指令在汇编时将会被代替成ARMARM中的空操作,比如可能是中的空操作,比如可能是“MOV R0,R0MOV R0,R0”指令等。指令等。NOPNOP可用于延时操作。可用于延时操作。NOPNOPNOP伪指令格
21、式伪指令格式应用示例(延时子程序):应用示例(延时子程序): mov R1,#0 x1234Delay NOP; ;空操作空操作 NOP NOP SUBS R1,R1,#1; ;循环次数减一循环次数减一 BNE Delay; ;如果循环没有结束,跳转如果循环没有结束,跳转DelayDelay继续继续 MOV PC,LR; ;子程序返回子程序返回第20页/共56页62 ARM汇编语言伪操作汇编语言伪操作(Directive)是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。 伪操作只是汇编过程中起
22、作用,一旦汇编结束,伪操作也就随之消失。第21页/共56页63 ARM汇编伪操作汇编伪操作ARM公司推出的开发工具所支持的汇编伪操作: 符号定义伪操作 数据定义伪操作 汇编信息报告控制伪操作 汇编代码控制伪操作 文件包含伪操作 指令集类型标识伪操作 其他功能伪操作第22页/共56页符号定义伪操作符号定义伪操作 语法格式语法格式功能功能LCLAvariable 定义一个局部算术变量并将其初始化为定义一个局部算术变量并将其初始化为0LCLL variable定义一个局部逻辑变量并将其初始化为定义一个局部逻辑变量并将其初始化为FALSELCLSvariable定义一个局部字符串变量并将其初始化为空串
23、定义一个局部字符串变量并将其初始化为空串GBLA variable 定义一个全局算术变量并将其初始化为定义一个全局算术变量并将其初始化为0GBLLvariable定义一个全局逻辑变量并将其初始化为定义一个全局逻辑变量并将其初始化为FALSEGBLSvariable定义一个全局字符串变量并将其初始化为空串定义一个全局字符串变量并将其初始化为空串variable_a SETA expr_a给一个全局或局部算术变量赋值给一个全局或局部算术变量赋值variable_l SETL expr_l给一个全局或局部逻辑变量赋值给一个全局或局部逻辑变量赋值variable_s SETS expr_s 给一个全局
24、或局部字符串变量赋值给一个全局或局部字符串变量赋值第23页/共56页举例如下: GBLA Test1 ;定义一个全局的数字变量Test1 SETA 0 xaa ;将该变量赋值为0 xaa GBLL Test2 ;定义一个全局的逻辑变量Test2 SETL TRUE ;将该变量赋值为真 GBLS Test3 ;定义一个全局的字符串变量Test3 SETS “Testing” ;将该变量赋值为“Testing” 举例如下: LCLA Test4 ;声明一个局部的数字变量Test4 SETA 0 xaa ;将该变量赋值为0 xaa LCLL Test5 ;声明一个局部的逻辑变量Test5 SETL
25、TRUE ;将该变量赋值为真 LCLS Test6 ;定义一个局部的字符串变量Test6 SETS “Testing” ;将该变量赋值为“Testing” 第24页/共56页符号定义伪操作符号定义伪操作 语法格式语法格式功能功能name RLIST registers_list为一个通用寄存器列表定义名称为一个通用寄存器列表定义名称name SN expr为一个单精度的为一个单精度的VFP寄存器定义名称,寄存器定义名称,单精度寄存器编号范围为单精度寄存器编号范围为031name DN expr为一个双精度的为一个双精度的VFP寄存器定义名称,寄存器定义名称,双精度寄存器编号范围为双精度寄存器编
26、号范围为015name FN expr为一个为一个FPA浮点寄存器定义名称,浮点寄存器定义名称,浮点寄存器编号范围为浮点寄存器编号范围为07name CP expr为一个协处理器定义名称,为一个协处理器定义名称,协处理器编号范围为协处理器编号范围为015name CN expr为一个协处理器的寄存器定义名称,为一个协处理器的寄存器定义名称,协处理器的寄存器编号范围为协处理器的寄存器编号范围为015第25页/共56页符号定义伪操作注意事项符号定义伪操作注意事项 用伪操作声明的全局或局部变量名必须在整个程序范围内是唯一的。 用伪操作对变量赋值前必须先声明变量。 用RLIST定义的寄存器列表名,可以
27、在LDM/STM中使用。 在使用DN伪操作时,双精度VFP寄存器D0D15是汇编器预先定义的,用户不能再使用。 在使用SN伪操作时,单精度VFP寄存器S0S31是汇编器预先定义的,用户不能再使用。 在使用FN伪操作时,FPA浮点寄存器F0F7是汇编器预先定义的,用户不能再使用。 在使用CP伪操作时,协处理器P0P15是汇编器预先定义的,用户不能再使用。 在使用CN伪操作时,协处理器的寄存器C0C15是汇编器预先定义的,用户不能再使用。第26页/共56页 ARM汇编器对ARM的寄存器进行了预定义,所有的寄存器和协处理器名都是大小写敏感的。预定义的寄存器如下:n预定义变量1nR0R15和r0r15
28、;na1a4(参数、结果或临时寄存器,与r0r3同义);nv1v8(变量寄存器,与r4r11同义);nsb和SB(静态基址寄存器,与r9同义);nsl和SL(堆栈限制寄存器,与r10同义);nfp和FP(帧指针,与r11同义);第27页/共56页n预定义变量2nip和IP(过程调用中间临时寄存器,与r12同义);nsp和SP(堆栈指针,与r13同义);nlr和LR(链接寄存器,与r14同义);npc和PC(程序计数器,与r15同义);ncpsr和CPSR(程序状态寄存器);nspsr和SPSR(程序状态寄存器);nf0f7和F0F7(FPA寄存器);ns0s31和S0S31(VFP单精度寄存器
29、);nd0d15和D0D15(VFP双精度寄存器);np0p15(协处理器015);nc0c15(协处理器寄存器015)。 第28页/共56页n内置变量nARM汇编器所定义的内置变量如下表1所示。n值得注意的是内置变量的设置不能用SETA、SETL或SETS等指示符来设置,只能用于表达式或条件语句。n例如:IF ARCHITECTURE = “4T”第29页/共56页变量含义PC或.当前指令的地址VAR或存储区位置计数器的当前值TRUE逻辑常量真FALSE逻辑常量假OPT当前设置列表选项值,OPT用来保存当前列表选项,改变选项值,恢复它的原始值CONFIG如果汇编器汇编ARM代码,则值为32;
30、如果汇编器汇编Thumb代码,则值为16ENDIAN如果汇编器在大端模式下,则值为big;如果汇编器在小端模式下,则值为little表1 内置变量第30页/共56页CODESIZE如果汇编器汇编ARM代码,则值为32;如果汇编器汇编Thumb代码,则值为16,与CONFIG同义CPU选定的CPU名,缺省时为ARM7TDMIFPU选定的FPU名,缺省时为SoftVFPARCHITECTURE选定的ARM体系结构的值;3,3M,4,4T和4TxMPCSTOREOFFSETSTR pc,或STM Rb,PC指令的地址和PC存储值之间的偏移量ARMASM_VERSION或| ads $ version
31、 |ARM汇编器的版本号,为整数表1 内置变量(续)第31页/共56页数据定义伪操作数据定义伪操作 数据定义伪操作一般用于为特定的数据分配存储单元,也可以完成已分配存储单元的初始化。第32页/共56页数据定义伪操作数据定义伪操作语法格式语法格式功能功能label DCBexpr, expr其中:其中:expr是是-128255之间的之间的数字或字符串数字或字符串分配一片连续的分配一片连续的字节字节存储单元并用存储单元并用expr初初始化,字节数由始化,字节数由expr的个数决定。的个数决定。“DCB”可以用可以用“=”代替。代替。label DCWexpr, expr 其中:其中:expr是是
32、-3276865535之之间的数字表达式或已定义的变间的数字表达式或已定义的变量量分配一片连续的分配一片连续的半字半字存储单元并用存储单元并用expr初初始化,半字数由始化,半字数由expr的个数决定。的个数决定。(要求半字对齐)(要求半字对齐)label DCWU expr, expr 其中:其中:expr是是-3276865535之之间的数字表达式或已定义的变间的数字表达式或已定义的变量量分配一片连续的分配一片连续的半字半字存储单元并用存储单元并用expr初初始化,半字数由始化,半字数由expr的个数决定。的个数决定。(不要求半字对齐)(不要求半字对齐)以上三条中的label:是可选的程序
33、标号;第33页/共56页数据定义伪操作数据定义伪操作语法格式语法格式功能功能label DCDexpr, expr 其中:其中:expr为数字表达式或已为数字表达式或已定义的变量定义的变量分配一片连续的分配一片连续的字字存储单元并用存储单元并用expr初始初始化,字数由化,字数由expr的个数决定。的个数决定。“DCD”可可以用以用“&”代替。代替。(要求字对齐)(要求字对齐)label DCDU expr, expr 其中:其中:expr为数字表达式或已为数字表达式或已定义的变量定义的变量分配一片连续的分配一片连续的字字存储单元并用存储单元并用expr初始初始化,字数由化,字数由expr的个
34、数决定。的个数决定。(不要求字对齐)(不要求字对齐)以上三条中的label:是可选的程序标号;第34页/共56页数据定义伪操作数据定义伪操作语法格式语法格式功能功能label DCQ-expr, -expr 其中:其中:expr为数字或表达式,其数值必为数字或表达式,其数值必须是整数。如果前没有须是整数。如果前没有“-”号,取值范围号,取值范围为为0264-1;如果前有;如果前有“-”号,取值范围号,取值范围为为0263-1分配一片连续的分配一片连续的双字双字存储单元并存储单元并用用expr初始化,字数等于初始化,字数等于expr个个数的数的2倍。倍。(要求字对齐)(要求字对齐)label D
35、CQU -expr, -expr 其中:其中:expr为数字或表达式,其数值必为数字或表达式,其数值必须是整数。如果前没有须是整数。如果前没有“-”号,取值范围号,取值范围为为0264-1;如果前有;如果前有“-”号,取值范围号,取值范围为为0263-1分配一片连续的分配一片连续的双字双字存储单元并存储单元并用用expr初始化,字数等于初始化,字数等于expr个个数的数的2倍。倍。(不要求字对齐)(不要求字对齐)以上三条中的label:是可选的程序标号;第35页/共56页数据定义伪操作数据定义伪操作语法格式语法格式功能功能label DCFSfpliteral, fpliteral 其中其中f
36、pliteral单精度浮点表达式,取值范单精度浮点表达式,取值范围:围:1.17549435e-383.4028234e+38。分配一片连续的分配一片连续的单精度浮点数单精度浮点数存存储单元并用储单元并用fpliteral初始化,每个初始化,每个浮点数占一个字单元,分配的字浮点数占一个字单元,分配的字数由数由fpliteral的个数决定。的个数决定。(要求字对齐)(要求字对齐)label DCFSUfpliteral, fpliteral 其中其中fpliteral单精度浮点表达式,取值范单精度浮点表达式,取值范围:围:1.17549435e-383.4028234e+38。分配一片连续的分配
37、一片连续的单精度浮点数单精度浮点数存存储单元并用储单元并用fpliteral初始化,每个初始化,每个浮点数占一个字单元,分配的字浮点数占一个字单元,分配的字数由数由fpliteral的个数决定。的个数决定。(不要求字对齐)(不要求字对齐)以上三条中的label:是可选的程序标号;第36页/共56页数据定义伪操作数据定义伪操作语法格式语法格式功能功能label DCFDfpliteral, fpliteral 其中其中fpliteral单精度浮点表达式,取值范单精度浮点表达式,取值范围:围:2.22507385850720138e-308 1.7976931348623157e+308分配一片连
38、续的分配一片连续的双精度浮点数双精度浮点数存存储单元并用储单元并用fpliteral初始化,每个初始化,每个浮点数占两个字单元,分配的字浮点数占两个字单元,分配的字数等于数等于fpliteral个数的个数的2倍。倍。(要求字对齐)(要求字对齐)label DCFDUfpliteral, fpliteral 其中其中fpliteral单精度浮点表达式,取值范单精度浮点表达式,取值范围:围: 2.22507385850720138e-308 1.7976931348623157e+308分配一片连续的分配一片连续的双精度浮点数双精度浮点数存存储单元并用储单元并用fpliteral初始化,每个初始化
39、,每个浮点数占两个字单元,分配的字浮点数占两个字单元,分配的字数等于数等于fpliteral个数的个数的2倍。倍。(不要求字对齐)(不要求字对齐)以上三条中的label:是可选的程序标号;第37页/共56页声明数据缓冲池LTORG功能:在使用LDR伪指令时,要在适当的位置加入LTROG声明数据缓冲池,这样就会把要加载的数据保存到缓存池中,再使用ARM加载指令读出,如果没有使用LTROG声明数据缓冲池,则汇编器会在程序末尾自动声明。语法格式:LTROGn分配存储空间SPACEn语法格式:label SPACE expr 其中:label为可选的程序标号; expr为分配的字节数。第38页/共56
40、页使用示例:使用示例:AREA Example, CODE, READONLY start BL func1 func1 ; code LDR r1,=0 x55555555 ; code MOV pc,lr LTORG data SPACE 4200 ;从当前位置开始从当前位置开始分配连续分配连续4200字字 节的存储单元并初始化为节的存储单元并初始化为0END第39页/共56页定义结构化内存表首地址MAP功能:用于定义一个结构化的内存表的首地址。MAP也可用“”代替。表达式可以为程序中的标号或数学表达式;基址寄存器为可选项:当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存
41、在时,内存表的首地址为表达式的值与基址寄存器的和。语法格式:MAPexpr,base_register其中:结构化内存表的首址为expr与base_register之和MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。第40页/共56页定义结构化内存表数据域FIELD功能:用于定义一个结构化内存表中的数据域。FILED也可用“#”代替。语法格式:labelFIELDexpr其中:label为可选的程序标号,当指定这一选项时,label的值为当前内存表的位置计数器的值;expr为当前数据域在内存表中所占的字节数。FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表:第41页
42、/共56页注意:MAP和FIELD伪指令仅用于定义数据结构,并不实际分配存储单元。MAP伪指令定义内存表的首地址;FIELD伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。第42页/共56页汇编代码控制伪操作汇编代码控制伪操作汇编控制伪操作用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条: IF、ELSE、ENDIF WHILE、WEND MACRO、MEND MEXIT第43页/共56页IF条件编译伪操作语法格式:IFlogical_expression程序代码段AELSE程序代码段BENDIFn当IF 后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。n其中,ELSE 及指令序列2 可以没有。此时,当IF 后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面的指令。 nIF、ELSE、ENDIF 伪指令可以嵌套使用。第44页/共56页WHILE条件编译伪操作语法格式:WHILElogical_expression程序代码段WENDn当WHILE 后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。 n WHILE、WEND 伪指令可以嵌
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届国家管网集团高校毕业生招聘笔试历年参考题库附带答案详解(浓缩500题)附参考答案详解(达标题)
- 2026国网河北省高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题及答案详解(易错题)
- 2026国家管网集团甘肃公司秋季高校毕业生招聘25人考试参考题库(浓缩500题)带答案详解(黄金题型)
- 2026秋季国家管网集团广西公司高校毕业生招聘考试参考试题(浓缩500题)及参考答案详解ab卷
- 国家管网集团2026届高校毕业生招聘笔试备考试题(浓缩500题)附答案详解(黄金题型)
- 国家管网集团湖南公司2026届秋季高校毕业生招聘考试参考试题(浓缩500题)及参考答案详解1套
- 2026国网江苏省电力公司高校毕业生提前批招聘笔试参考题库浓缩500题完整参考答案详解
- 2026秋季国家管网集团东部原油储运公司高校毕业生招聘笔试参考题库(浓缩500题)含答案详解(满分必刷)
- 2026国网重庆市高校毕业生提前批招聘(约450人)笔试模拟试题浓缩500题含答案详解(模拟题)
- 2026国家管网集团广西公司秋季高校毕业生招聘笔试备考题库(浓缩500题)及答案详解(历年真题)
- 学堂在线 生活英语听说 章节测试答案
- 三级安全教育试题及答案
- 小学教育论文800字范文
- 非公募项目管理制度
- 个人全额补缴社保协议书
- 2025-2030中国肌肉松弛药行业市场现状供需分析及投资评估规划分析研究报告
- T/CCSAS 023-2022危险化学品企业紧急切断阀设置和使用规范
- 《农机安全生产重大事故隐患判定标准(试行)》解读与培训
- 2025电力变压器声纹监测与诊断技术
- 军队文职招聘(中医学)笔试题库(全真题库)
- 细胞培养肉技术研究进展
评论
0/150
提交评论