第6讲ARM汇编伪指令与伪操作

上传人:zhan****gclb 文档编号:124148874 上传时间:2022-07-24 格式:PPTX 页数:56 大小:224.55KB
返回 下载 相关 举报
第6讲ARM汇编伪指令与伪操作_第1页
第1页 / 共56页
第6讲ARM汇编伪指令与伪操作_第2页
第2页 / 共56页
第6讲ARM汇编伪指令与伪操作_第3页
第3页 / 共56页
点击查看更多>>
资源描述
1TM第第6章章 ARM汇编伪指令与伪操作汇编伪指令与伪操作2、伪操作:伪操作:为完成汇编程序做各种准备工作,只在汇编过程为完成汇编程序做各种准备工作,只在汇编过程中起作用,一旦汇编结束,它的作用也随之结束。中起作用,一旦汇编结束,它的作用也随之结束。3、宏指令:、宏指令:是一段独立的程序代码,可插在源程序中。与子程是一段独立的程序代码,可插在源程序中。与子程序相似,但有本质不同。序相似,但有本质不同。1、伪指令:、伪指令:在汇编时将被合适的指令代替。在汇编时将被合适的指令代替。伪操作、宏指令一般与编译器有关,常用伪操作、宏指令一般与编译器有关,常用ARM编译开发环境有编译开发环境有2种:种:GNU(基于(基于Embest IDE环境)和环境)和ADS(ARM公司提供)公司提供)2TM2目前常用的编译环境有目前常用的编译环境有2种:种:1.ADS/SDT、RealView MDK等等ARM公司推公司推出的开发工具出的开发工具2.GNU ARM开发工具开发工具3TM3n1.ADS/SDT、RealView MDK等等ARM公司推出公司推出的开发工具的开发工具nADS由由ARM公司推出公司推出,使用了使用了CodeWarrior公司的公司的编译器。针对编译器。针对ARM资源配置为用户提供了在资源配置为用户提供了在 CodeWarrior IDE 集成环境下配置各种集成环境下配置各种ARM 开发开发工具的能力。工具的能力。n 以以ARM为目标平台的工程创建向导,可以使用户为目标平台的工程创建向导,可以使用户以此为基础,快速创建以此为基础,快速创建ARM和和Thumb工程。工程。4TM4nARM 将将Keil 公司收购之后公司收购之后,正式推出了针对正式推出了针对ARM 微控制器的开发工具微控制器的开发工具RealView Microcontroller Development Kit(简称简称Real View MDK 或者或者MDK),它将,它将ARM 开发工具开发工具RealView Development Suite(简称简称RVDS)的编译器的编译器RVCT 与与Keil的工程管理、调试仿真工具集成在一起,是的工程管理、调试仿真工具集成在一起,是一款非常强大的一款非常强大的ARM 微控制器开发工具。微控制器开发工具。5TM5n2.GNU ARM开发工具开发工具nGNU是是“GNUs Not Unix”的递归缩写。在的递归缩写。在1983年年9月月27日由日由Richard Stallman公开发起公开发起GNU计划,计划,它的目标是创建一套完全自由的操作系统。它的目标是创建一套完全自由的操作系统。nGNU格式格式ARM汇编语言程序主要是面对在汇编语言程序主要是面对在ARM平平台上移植嵌入式台上移植嵌入式Linux操作系统,操作系统,GNU组织开发的组织开发的基于基于ARM平台的编译工具有主要由平台的编译工具有主要由GNU的汇编器的汇编器as,交叉汇编器交叉汇编器gcc和连接器和连接器ld组成。组成。6TM661 汇编语言伪指令汇编语言伪指令n伪指令伪指令是是ARM处理器支持的汇编语言程序里处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机的特殊助记符,它不在处理器运行期间由机器执行器执行,只是在汇编时将被合适的机器指令代只是在汇编时将被合适的机器指令代替成替成ARM或或Thumb指令指令,从而实现真正的指从而实现真正的指令操作。令操作。nARM伪指令有四条,分别为伪指令有四条,分别为ADR伪指令、伪指令、ADRL伪指令、伪指令、LDR伪指令、伪指令、NOP伪指令。伪指令。7TM7ARM伪指令伪指令大范围的地址读取大范围的地址读取 LDRLDR伪指令用于加载伪指令用于加载3232位的立即数或一个地址值到指定寄存器。在汇位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,编编译源程序时,LDRLDR伪指令被编译器替换成一条合适的指令。若加载的伪指令被编译器替换成一条合适的指令。若加载的常数未超出常数未超出MOVMOV或或MVNMVN的范围,则使用的范围,则使用MOVMOV或或MVNMVN指令代替该指令代替该LDRLDR伪伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDRLDR指指令从文字池读出常量。令从文字池读出常量。LDRcond register,=expr|label_exprLDR伪指令格式指令执行的条件码指令执行的条件码加载的目标寄存器加载的目标寄存器基于基于PCPC的地址表达式的地址表达式或外部表达式或外部表达式注意注意:1.1.从指令位置到文字池的偏移量必须小于从指令位置到文字池的偏移量必须小于4KB4KB;2.2.与与ARMARM指令的指令的LDRLDR相比,伪指令的相比,伪指令的LDRLDR的参数有的参数有“=”号。号。8TM8ARM伪指令伪指令大范围的地址读取大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载常量):应用示例(加载常量):LDR R2,=0 xFF0 ;MOV R2,#0 xFF0LDR R0,=0 xFF000000 ;MOV R0,#0 xFF000000LDR R1,=0 xFFFFFFFE ;MVN R1,#0 x19TM9ARM伪指令伪指令大范围的地址读取大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载地址):应用示例(加载地址):.LDR R1,=InitStack .InitStack MOV R0,LR .使用伪指令将程序标号使用伪指令将程序标号InitStackInitStack的地址存入的地址存入R1R110TM10ARM伪指令伪指令大范围的地址读取大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的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的地址存入的地址存入R1R1地址地址程序代码程序代码11TM11ARM伪指令伪指令大范围的地址读取大范围的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的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标号的地址标号的地址12TM12ARM伪指令伪指令中等范围的地址读取中等范围的地址读取 ADRLADRL伪指令将基于伪指令将基于PCPC相对偏移的地址值或基于寄存器相对偏移的地相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比址值读取到寄存器中,比ADRADR伪指令可以读取更大范围的地址伪指令可以读取更大范围的地址 。在汇编编。在汇编编译器编译源程序时,译器编译源程序时,ADRLADRL伪指令被编译器替换成两条合适的指令。若不伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。能用两条指令实现,则产生错误,编译失败。ADRLcond register,exprADRLADRL伪指令格式伪指令格式指令执行的条件码指令执行的条件码加载的目标寄存器加载的目标寄存器地址表达式地址表达式 地址表达式地址表达式exprexpr的取指范围:的取指范围:当地址值是字节对齐时,其取指范围为当地址值是字节对齐时,其取指范围为-64K-64K64K64K;当地址值是字对齐时,其取指范围为当地址值是字对齐时,其取指范围为-256K-256K256K256K;13TM13ARM伪指令伪指令中等范围的地址读取中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。.ADRL R0,Delay .Delay MOV R0,r14 .应用示例(源程序):应用示例(源程序):使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R014TM14ARM伪指令伪指令中等范围的地址读取中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。.ADRL R0,Delay .Delay MOV R0,r14 .应用示例(源程序):应用示例(源程序):.0 x20 ADD r1,pc,#400 x24 ADD r1,r1,#FF00 .0 xFF68 MOV r0,r14 .编译后的反汇编代码:编译后的反汇编代码:使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R0地址地址程序代码程序代码15TM15ARM伪指令伪指令中等范围的地址读取中等范围的地址读取 ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。.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伪指令被汇编成两条指令伪指令被汇编成两条指令16TM16ARM伪指令伪指令小范围的地址读取小范围的地址读取 ADRADR伪指令将基于伪指令将基于PCPC相对偏移的地址值或基于寄存器相对偏移的地址相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,值读取到寄存器中。在汇编编译器编译源程序时,ADRADR伪指令被编译器替伪指令被编译器替换成一条合适的指令。通常,编译器用一条换成一条合适的指令。通常,编译器用一条ADDADD指令或指令或SUBSUB指令来实现该指令来实现该ADRADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。ADRcond register,exprADRADR伪指令格式伪指令格式指令执行的条件码指令执行的条件码加载的目标寄存器加载的目标寄存器地址表达式地址表达式 地址表达式地址表达式exprexpr的取指范围:的取指范围:当地址值是字节对齐时,其取指范围为当地址值是字节对齐时,其取指范围为-255-255255255;当地址值是字对齐时,其取指范围为当地址值是字对齐时,其取指范围为-1020-102010201020;17TM17ARM伪指令伪指令小范围的地址读取小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。.ADR R0,Delay .Delay MOV R0,r14 .应用示例(源程序):应用示例(源程序):使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R018TM18 .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 .应用示例(源程序):应用示例(源程序):编译后的反汇编代码:编译后的反汇编代码:使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R0地址地址程序代码程序代码19TM19ARM伪指令伪指令小范围的地址读取小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。.ADR R0,Delay .Delay MOV R0,r14 .应用示例(源程序):应用示例(源程序):.0 x20 ADD r1,pc,#0 x3c .0 x64 MOV r0,r14 .编译后的反汇编代码:编译后的反汇编代码:使用伪指令将程序标号使用伪指令将程序标号DelayDelay的地址存入的地址存入R0R0ADRADR伪指令被汇编成一条指令伪指令被汇编成一条指令20TM20ARM伪指令伪指令小范围的地址读取小范围的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。应用示例应用示例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 xF821TM21ARM伪指令伪指令空操作伪指令空操作伪指令 NOPNOP伪指令在汇编时将会被代替成伪指令在汇编时将会被代替成ARMARM中的空操作,比如可能是中的空操作,比如可能是“MOV R0,R0MOV R0,R0”指令等。指令等。NOPNOP可用于延时操作。可用于延时操作。NOPNOPNOP伪指令格式伪指令格式应用示例(延时子程序):应用示例(延时子程序):mov R1,#0 x1234Delay NOP;空操作空操作 NOP NOP SUBS R1,R1,#1;循环次数减一循环次数减一 BNE Delay;如果循环没有结束,跳转如果循环没有结束,跳转DelayDelay继续继续 MOV PC,LR;子程序返回子程序返回22TM2262ARM汇编语言伪操作汇编语言伪操作(Directive)是是ARM汇编语言程序里的汇编语言程序里的一些特殊的指令助记符一些特殊的指令助记符,其作用主要是为完成其作用主要是为完成汇编程序做各种准备工作汇编程序做各种准备工作,对源程序运行汇编对源程序运行汇编程序处理程序处理,而不是在计算机运行期间由处理器而不是在计算机运行期间由处理器执行。执行。n伪操作只是汇编过程中起作用伪操作只是汇编过程中起作用,一旦汇编结束一旦汇编结束,伪操作也就随之消失。伪操作也就随之消失。23TM2363 ARM汇编伪操作汇编伪操作ARM公司推出的开发工具所支持的汇编公司推出的开发工具所支持的汇编伪操作伪操作:n符号定义伪操作符号定义伪操作n数据定义伪操作数据定义伪操作n汇编信息报告控制伪操作汇编信息报告控制伪操作n汇编代码控制伪操作汇编代码控制伪操作n文件包含伪操作文件包含伪操作n指令集类型标识伪操作指令集类型标识伪操作n其他功能伪操作其他功能伪操作24TM24符号定义伪操作符号定义伪操作 语法格式语法格式功能功能LCLAvariable 定义一个局部算术变量并将其初始化为定义一个局部算术变量并将其初始化为0LCLL variable定义一个局部逻辑变量并将其初始化为定义一个局部逻辑变量并将其初始化为FALSELCLSvariable定义一个局部字符串变量并将其初始化为空串定义一个局部字符串变量并将其初始化为空串GBLA variable 定义一个全局算术变量并将其初始化为定义一个全局算术变量并将其初始化为0GBLLvariable定义一个全局逻辑变量并将其初始化为定义一个全局逻辑变量并将其初始化为FALSEGBLSvariable定义一个全局字符串变量并将其初始化为空串定义一个全局字符串变量并将其初始化为空串variable_a SETA expr_a给一个全局或局部算术变量赋值给一个全局或局部算术变量赋值variable_l SETL expr_l给一个全局或局部逻辑变量赋值给一个全局或局部逻辑变量赋值variable_s SETS expr_s 给一个全局或局部字符串变量赋值给一个全局或局部字符串变量赋值25TM25举例如下:举例如下: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 TRUE ;将该变量赋值为真将该变量赋值为真 LCLS Test6 ;定义一个局部的字符串变量定义一个局部的字符串变量Test6 SETS “Testing”;将该变量赋值为将该变量赋值为“Testing”26TM26符号定义伪操作符号定义伪操作 语法格式语法格式功能功能name RLIST registers_list为一个通用寄存器列表定义名称为一个通用寄存器列表定义名称name SN expr为一个单精度的为一个单精度的VFP寄存器定义名称,寄存器定义名称,单精度寄存器编号范围为单精度寄存器编号范围为031name DN expr为一个双精度的为一个双精度的VFP寄存器定义名称,寄存器定义名称,双精度寄存器编号范围为双精度寄存器编号范围为015name FN expr为一个为一个FPA浮点寄存器定义名称,浮点寄存器定义名称,浮点寄存器编号范围为浮点寄存器编号范围为07name CP expr为一个协处理器定义名称,为一个协处理器定义名称,协处理器编号范围为协处理器编号范围为015name CN expr为一个协处理器的寄存器定义名称,为一个协处理器的寄存器定义名称,协处理器的寄存器编号范围为协处理器的寄存器编号范围为01527TM27符号定义伪操作注意事项符号定义伪操作注意事项n用伪操作声明的全局或局部变量名必须在整个程序范围内是唯一的。用伪操作声明的全局或局部变量名必须在整个程序范围内是唯一的。n用伪操作对变量赋值前必须先声明变量。用伪操作对变量赋值前必须先声明变量。n用用RLIST定义的寄存器列表名,可以在定义的寄存器列表名,可以在LDM/STM中使用。中使用。n在使用在使用DN伪操作时,双精度伪操作时,双精度VFP寄存器寄存器D0D15是汇编器预先定义的,是汇编器预先定义的,用户不能再使用。用户不能再使用。n在使用在使用SN伪操作时,单精度伪操作时,单精度VFP寄存器寄存器S0S31是汇编器预先定义的,用是汇编器预先定义的,用户不能再使用。户不能再使用。n在使用在使用FN伪操作时,伪操作时,FPA浮点寄存器浮点寄存器F0F7是汇编器预先定义的,用户是汇编器预先定义的,用户不能再使用。不能再使用。n在使用在使用CP伪操作时,协处理器伪操作时,协处理器P0P15是汇编器预先定义的,用户不能是汇编器预先定义的,用户不能再使用。再使用。n在使用在使用CN伪操作时,协处理器的寄存器伪操作时,协处理器的寄存器C0C15是汇编器预先定义的,是汇编器预先定义的,用户不能再使用。用户不能再使用。28TM28 ARM汇编器对汇编器对ARM的寄存器进行了预定义,所的寄存器进行了预定义,所有的寄存器和协处理器名都是大小写敏感的。预定有的寄存器和协处理器名都是大小写敏感的。预定义的寄存器如下:义的寄存器如下:n预定义变量预定义变量1nR0R15和和r0r15;na1a4(参数、结果或临时寄存器,与(参数、结果或临时寄存器,与r0r3同义);同义);nv1v8(变量寄存器,与(变量寄存器,与r4r11同义);同义);nsb和和SB(静态基址寄存器,与(静态基址寄存器,与r9同义);同义);nsl和和SL(堆栈限制寄存器,与(堆栈限制寄存器,与r10同义);同义);nfp和和FP(帧指针,与(帧指针,与r11同义);同义);29TM29n预定义变量预定义变量2nip和和IP(过程调用中间临时寄存器,与(过程调用中间临时寄存器,与r12同义);同义);nsp和和SP(堆栈指针,与(堆栈指针,与r13同义);同义);nlr和和LR(链接寄存器,与(链接寄存器,与r14同义);同义);npc和和PC(程序计数器,与(程序计数器,与r15同义);同义);ncpsr和和CPSR(程序状态寄存器);(程序状态寄存器);nspsr和和SPSR(程序状态寄存器);(程序状态寄存器);nf0f7和和F0F7(FPA寄存器);寄存器);ns0s31和和S0S31(VFP单精度寄存器);单精度寄存器);nd0d15和和D0D15(VFP双精度寄存器);双精度寄存器);np0p15(协处理器(协处理器015););nc0c15(协处理器寄存器(协处理器寄存器015)。)。30TM30n内置变量nARM汇编器所定义的内置变量如下表汇编器所定义的内置变量如下表1所示。所示。n值得注意的是内置变量的设置不能用值得注意的是内置变量的设置不能用SETA、SETL或或SETS等指示符来设置,只能用于表达等指示符来设置,只能用于表达式或条件语句。式或条件语句。n例如:例如:IF ARCHITECTURE=“4T”31TM31变量变量含义含义PC或或.当前指令的地址当前指令的地址VAR或或存储区位置计数器的当前值存储区位置计数器的当前值TRUE逻辑常量真逻辑常量真FALSE逻辑常量假逻辑常量假OPT当前设置列表选项值,当前设置列表选项值,OPT用来保存当前列表选项,改用来保存当前列表选项,改变选项值,恢复它的原始值变选项值,恢复它的原始值CONFIG如果汇编器汇编如果汇编器汇编ARM代码,则值为代码,则值为32;如果汇编器汇编;如果汇编器汇编Thumb代码,则值为代码,则值为16ENDIAN如果汇编器在大端模式下,则值为如果汇编器在大端模式下,则值为big;如果汇编器在小;如果汇编器在小端模式下,则值为端模式下,则值为little表表1 内置变量内置变量32TM32CODESIZE如果汇编器汇编如果汇编器汇编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|ARM汇编器的版本号,为整数汇编器的版本号,为整数表表1 内置变量(续)内置变量(续)33TM33数据定义伪操作数据定义伪操作 n数据定义伪操作一般用于为特定的数据分配数据定义伪操作一般用于为特定的数据分配存储单元,也可以完成已分配存储单元的初存储单元,也可以完成已分配存储单元的初始化始化。34TM34数据定义伪操作数据定义伪操作语法格式语法格式功能功能label DCBexpr,expr其中:其中:expr是是-128255之间的之间的数字或字符串数字或字符串分配一片连续的分配一片连续的字节字节存储单元并用存储单元并用expr初初始化,字节数由始化,字节数由expr的个数决定。的个数决定。“DCB”可以用可以用“=”代替。代替。label DCWexpr,expr 其中:其中:expr是是-3276865535之之间的数字表达式或已定义的变间的数字表达式或已定义的变量量分配一片连续的分配一片连续的半字半字存储单元并用存储单元并用expr初初始化,半字数由始化,半字数由expr的个数决定。的个数决定。(要求半字对齐)(要求半字对齐)label DCWU expr,expr 其中:其中:expr是是-3276865535之之间的数字表达式或已定义的变间的数字表达式或已定义的变量量分配一片连续的分配一片连续的半字半字存储单元并用存储单元并用expr初初始化,半字数由始化,半字数由expr的个数决定。的个数决定。(不要求半字对齐)(不要求半字对齐)以上三条中的以上三条中的label:是可选的程序标号:是可选的程序标号;35TM35数据定义伪操作数据定义伪操作语法格式语法格式功能功能label DCDexpr,expr 其中:其中:expr为数字表达式或已为数字表达式或已定义的变量定义的变量分配一片连续的分配一片连续的字字存储单元并用存储单元并用expr初始初始化,字数由化,字数由expr的个数决定。的个数决定。“DCD”可可以用以用“&”代替。代替。(要求字对齐)(要求字对齐)label DCDU expr,expr 其中:其中:expr为数字表达式或已为数字表达式或已定义的变量定义的变量分配一片连续的分配一片连续的字字存储单元并用存储单元并用expr初始初始化,字数由化,字数由expr的个数决定。的个数决定。(不要求字对齐)(不要求字对齐)以上三条中的以上三条中的label:是可选的程序标号:是可选的程序标号;36TM36数据定义伪操作数据定义伪操作语法格式语法格式功能功能label DCQ-expr,-expr 其中:其中:expr为数字或表达式,其数值必为数字或表达式,其数值必须是整数。如果前没有须是整数。如果前没有“-”号,取值范围号,取值范围为为0264-1;如果前有;如果前有“-”号,取值范围号,取值范围为为0263-1分配一片连续的分配一片连续的双字双字存储单元并存储单元并用用expr初始化,字数等于初始化,字数等于expr个个数的数的2倍。倍。(要求字对齐)(要求字对齐)label DCQU-expr,-expr 其中:其中:expr为数字或表达式,其数值必为数字或表达式,其数值必须是整数。如果前没有须是整数。如果前没有“-”号,取值范围号,取值范围为为0264-1;如果前有;如果前有“-”号,取值范围号,取值范围为为0263-1分配一片连续的分配一片连续的双字双字存储单元并存储单元并用用expr初始化,字数等于初始化,字数等于expr个个数的数的2倍。倍。(不要求字对齐)(不要求字对齐)以上三条中的以上三条中的label:是可选的程序标号:是可选的程序标号;37TM37数据定义伪操作数据定义伪操作语法格式语法格式功能功能label DCFSfpliteral,fpliteral 其中其中fpliteral单精度浮点表达式,取值范单精度浮点表达式,取值范围:围:1.17549435e-383.4028234e+38。分配一片连续的分配一片连续的单精度浮点数单精度浮点数存存储单元并用储单元并用fpliteral初始化,每个初始化,每个浮点数占一个字单元,分配的字浮点数占一个字单元,分配的字数由数由fpliteral的个数决定。的个数决定。(要求字对齐)(要求字对齐)label DCFSUfpliteral,fpliteral 其中其中fpliteral单精度浮点表达式,取值范单精度浮点表达式,取值范围:围:1.17549435e-383.4028234e+38。分配一片连续的分配一片连续的单精度浮点数单精度浮点数存存储单元并用储单元并用fpliteral初始化,每个初始化,每个浮点数占一个字单元,分配的字浮点数占一个字单元,分配的字数由数由fpliteral的个数决定。的个数决定。(不要求字对齐)(不要求字对齐)以上三条中的以上三条中的label:是可选的程序标号:是可选的程序标号;38TM38数据定义伪操作数据定义伪操作语法格式语法格式功能功能label DCFDfpliteral,fpliteral 其中其中fpliteral单精度浮点表达式,取值范单精度浮点表达式,取值范围:围:2.22507385850720138e-308 1.7976931348623157e+308分配一片连续的分配一片连续的双精度浮点数双精度浮点数存存储单元并用储单元并用fpliteral初始化,每个初始化,每个浮点数占两个字单元,分配的字浮点数占两个字单元,分配的字数等于数等于fpliteral个数的个数的2倍。倍。(要求字对齐)(要求字对齐)label DCFDUfpliteral,fpliteral 其中其中fpliteral单精度浮点表达式,取值范单精度浮点表达式,取值范围:围:2.22507385850720138e-308 1.7976931348623157e+308分配一片连续的分配一片连续的双精度浮点数双精度浮点数存存储单元并用储单元并用fpliteral初始化,每个初始化,每个浮点数占两个字单元,分配的字浮点数占两个字单元,分配的字数等于数等于fpliteral个数的个数的2倍。倍。(不要求字对齐)(不要求字对齐)以上三条中的以上三条中的label:是可选的程序标号:是可选的程序标号;39TM39n声明数据缓冲池声明数据缓冲池LTORGn功能:在使用功能:在使用LDR伪指令时,要在适当的位置加入伪指令时,要在适当的位置加入LTROG声明数据声明数据缓冲池,这样就会把要加载的数据保存到缓存池中,再使用缓冲池,这样就会把要加载的数据保存到缓存池中,再使用ARM加载加载指令读出,如果没有使用指令读出,如果没有使用LTROG声明数据缓冲池,则汇编器会在程声明数据缓冲池,则汇编器会在程序末尾自动声明。序末尾自动声明。n语法格式:语法格式:LTROGn分配存储空间分配存储空间SPACEn语法格式:语法格式:label SPACE expr 其中:其中:label为可选的程序标号为可选的程序标号;expr为分配的字节数。为分配的字节数。40TM40使用示例:使用示例:AREA Example,CODE,READONLY start BL func1 func1 ;code LDR r1,=0 x55555555 ;code MOV pc,lr LTORG data SPACE 4200 ;从当前位置开始从当前位置开始分配连续分配连续4200字字 节的存储单元并初始化为节的存储单元并初始化为0END41TM41n定义结构化内存表首地址定义结构化内存表首地址MAPn功能:用于定义一个结构化的内存表的首地址。功能:用于定义一个结构化的内存表的首地址。MAP 也也可用可用“”代替。表达式可以为程序中的标号或数学表达代替。表达式可以为程序中的标号或数学表达式;基址寄存器为可选项:当基址寄存器选项不存在时,式;基址寄存器为可选项:当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。表的首地址为表达式的值与基址寄存器的和。n语法格式:语法格式:MAP expr,base_registern其中:结构化内存表的首址为其中:结构化内存表的首址为expr与与base_register之和之和nMAP 伪指令通常与伪指令通常与FIELD 伪指令配合使用来定义结构化伪指令配合使用来定义结构化的内存表。的内存表。42TM42n定义结构化内存表数据域定义结构化内存表数据域FIELDn功能:用于定义一个结构化内存表中的数据域。功能:用于定义一个结构化内存表中的数据域。FILED 也也可用可用“#”代替。代替。n语法格式:语法格式:labelFIELD exprn其中:其中:label为可选的程序标号,当指定这一选项时,为可选的程序标号,当指定这一选项时,label的值为当前内存表的位置计数器的值;的值为当前内存表的位置计数器的值;expr为当前为当前数据域在内存表中所占的字节数。数据域在内存表中所占的字节数。nFIELD 伪指令常与伪指令常与MAP 伪指令配合使用来定义结构化的伪指令配合使用来定义结构化的内存表:内存表:43TM43注意:注意:MAP 和和FIELD 伪指令仅用于定义数据结构,并不实伪指令仅用于定义数据结构,并不实际分配存储单元。际分配存储单元。MAP 伪指令定义内存表的首地址;伪指令定义内存表的首地址;FIELD 伪指令定义内存表中的各个数据域,并可以为每伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。个数据域指定一个标号供其他的指令引用。44TM44汇编代码控制伪操作汇编代码控制伪操作 汇编控制伪操作用于控制汇编程序的执行流程,常汇编控制伪操作用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条:用的汇编控制伪指令包括以下几条:n IF、ELSE、ENDIFn WHILE、WENDn MACRO、MENDn MEXIT 45TM45nIF条件编译伪操作条件编译伪操作n语法格式:语法格式:IF logical_expression程序代码段程序代码段AELSE程序代码段程序代码段BENDIFn当当IF 后面的逻辑表达式为真后面的逻辑表达式为真,则执行指令序列,则执行指令序列1,否则,否则执行指令序列执行指令序列2。n其中,其中,ELSE 及指令序列及指令序列2 可以没有。此时,当可以没有。此时,当IF 后面后面的逻辑表达式为真,则执行的逻辑表达式为真,则执行指令序列指令序列1,否则继续执行,否则继续执行后面的指令。后面的指令。nIF、ELSE、ENDIF 伪指令伪指令可以嵌套使用。可以嵌套使用。46TM46nWHILE条件编译伪操作条件编译伪操作n语法格式:语法格式:WHILE logical_expression程序代码段程序代码段WENDn当当WHILE 后面的逻辑表后面的逻辑表达式为真,则执行指令达式为真,则执行指令序列,该指令序列执行序列,该指令序列执行完毕后,再判断逻辑表完毕后,再判断逻辑表达式的值,若为真则继达式的值,若为真则继续执行,一直到逻辑表续执行,一直到逻辑表达式的值为假。达式的值为假。n WHILE、WEND 伪指伪指令可以嵌套使用。令可以嵌套使用。47TM47nMACRO宏定义伪操作宏定义伪操作n语法格式:语法格式:MACRO$labelmacroname$parameter,$parameter程序代码段程序代码段MENDnMACRO、MEND伪指令可以将一段代码定义为一个整体,称为宏伪指令可以将一段代码定义为一个整体,称为宏指令。宏指令可以使用一个或多个参数,当宏指令被展开时,这些指令。宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。参数被相应的值替换。nMACRO、MEND 伪指令可以嵌套使用。伪指令可以嵌套使用。48TM4849TM49nAREA 指令指示汇编器汇编新的代码段或数据段。指令指示汇编器汇编新的代码段或数据段。段是段是不可分的已命名独立代码或数据块,由链接器处理。不可分的已命名独立代码或数据块,由链接器处理。AREA sectionname,attr,attr.sectionname 段指定的名称,以非字母字符开头的名段指定的名称,以非字母字符开头的名称必须包含在竖杠内,否则会生成缺失段名的错误。称必须包含在竖杠内,否则会生成缺失段名的错误。,attr表示该段的相关属性,多个属性用逗号分隔,表示该段的相关属性,多个属性用逗号分隔,常用属性如下:常用属性如下:50TM50,attr表示的常用属性如下:表示的常用属性如下:nCODE:用于定义代码段,:用于定义代码段,READONLY是缺省值,是缺省值,指示不应向此段写入;指示不应向此段写入;nDATA:用于定义数据段,:用于定义数据段,READWRITE是缺省值,是缺省值,指示可以读写此段;指示可以读写此段;nALIGN:使用方式为:使用方式为ALIGN表达式,表达式的取值范表达式,表达式的取值范围为围为031,相应的对齐方式为,相应的对齐方式为2的次方。在默认时,的次方。在默认时,可执行连接文件的代码段和数据段是按字对齐的;可执行连接文件的代码段和数据段是按字对齐的;51TM51nENTRY伪指令用于指定汇编程序的入口点。伪指令用于指定汇编程序的入口点。n在一个完整的汇编程序中至少要有一个在一个完整的汇编程序中至少要有一个ENTRY(也可以有(也可以有多个,当有多个多个,当有多个ENTRY时,程序的真正入口点由链接器指时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个定),但在一个源文件里最多只能有一个ENTRY(可以没(可以没有)。有)。n举例如下:举例如下:AREA Init,CODE,READONLY ENTRY;指定应用程序的入口点;指定应用程序的入口点 52TM52nEQU伪指令用于为程序中的常量、标号等定义一个伪指令用于为程序中的常量、标号等定义一个 等效的等效的字符名称,类似于字符名称,类似于C语言中的语言中的define。其中。其中EQU可用可用“*”代替。代替。n举例如下:举例如下:Test EQU 50;定义标号;定义标号Test的值为的值为50 53TM53n引用指令引用指令 EXPORT 用于在程序中声明一个全局的标号,该标号可用于在程序中声明一个全局的标号,该标号可在其他的文件中被引用。在其他的文件中被引用。GLOBAL与与EXPORT是同义词。是同义词。IMPORT 用于通知编译器当前的标号在其他的源文件中用于通知编译器当前的标号在其他的源文件中有定义,可在当前的源文件中使用。无论当前源文件是否引有定义,可在当前的源文件中使用。无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。用该标号,该标号均会被加入到当前源文件的符号表中。EXTERN 与与EXPORT相似,只是如果当前源文件没有引相似,只是如果当前源文件没有引用该标号,该标号就不会被加入到当前源文件的符号表中。用该标号,该标号就不会被加入到当前源文件的符号表中。AREA Example,CODE,READONLY EXTERN _CPP_INITIALIZE LDR r0,=_CPP_INITIALIZE CMP r0,#0 BEQ nocplusplus54TM54n包含指令包含指令 GET 用于将一个源文件包含到当前的源文件中,并将用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。被包含的源文件在当前位置进行汇编处理。INCLUDE与它与它用法相同。用法相同。INCBIN 用于将一个目标文件或数据文件包含到当前的用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前的源源文件中,被包含的文件不作任何变动的存放在当前的源文件中,编译器从其后开始继续处理。文件中,编译器从其后开始继续处理。55TM第第6章章 ARM汇编伪指令与伪操作汇编伪指令与伪操作The End56TM56思考与练习题思考与练习题n定义一个结构化的内存表,其首地址固定定义一个结构化的内存表,其首地址固定为为0 x900,该结构化内存表包含,该结构化内存表包含2个域,个域,Fdata1长度为长度为8个字节,个字节,Fdata2长度为长度为160个字节。个字节。n有有ARM ADS伪操作将寄存器列表伪操作将寄存器列表R0-R5、R7、R8的名称定义为的名称定义为Reglist。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 财经资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!