版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章ARM汇编伪指令与伪操作2、伪操作:为完成汇编程序做各种准备工作,只在汇编过程中起作用,一旦汇编结束,它的作用也随之结束。3、宏指令:是一段独立的程序代码,可插在源程序中。与子程序相似,但有本质不同。1、伪指令:在汇编时将被合适的指令代替。伪操作、宏指令一般与编译器有关,常用ARM编译开发环境有2种:GNU(基于EmbestIDE环境)和ADS(ARM公司提供)目前一页\总数五十六页\编于三点目前常用的编译环境有2种:1.
ADS/SDT、RealViewMDK等ARM公司推出的开发工具2.
GNUARM开发工具目前二页\总数五十六页\编于三点1.
ADS/SDT、RealViewMDK等ARM公司推出的开发工具ADS由ARM公司推出,使用了CodeWarrior公司的编译器。针对ARM资源配置为用户提供了在CodeWarriorIDE集成环境下配置各种ARM开发工具的能力。以ARM为目标平台的工程创建向导,可以使用户以此为基础,快速创建ARM和Thumb工程。目前三页\总数五十六页\编于三点ARM将Keil公司收购之后,正式推出了针对ARM微控制器的开发工具RealViewMicrocontrollerDevelopmentKit(简称RealViewMDK或者MDK),它将ARM开发工具RealViewDevelopmentSuite(简称RVDS)的编译器RVCT与Keil的工程管理、调试仿真工具集成在一起,是一款非常强大的ARM微控制器开发工具。目前四页\总数五十六页\编于三点2.
GNUARM开发工具GNU是“GNU‘sNotUnix”的递归缩写。在1983年9月27日由RichardStallman公开发起GNU计划,它的目标是创建一套完全自由的操作系统。GNU格式ARM汇编语言程序主要是面对在ARM平台上移植嵌入式Linux操作系统,GNU组织开发的基于ARM平台的编译工具有主要由GNU的汇编器as,交叉汇编器gcc和连接器ld组成。目前五页\总数五十六页\编于三点6.1汇编语言伪指令伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。ARM伪指令有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。目前六页\总数五十六页\编于三点ARM伪指令——大范围的地址读取
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。LDR{cond}register,=expr|label_exprLDR伪指令格式指令执行的条件码加载的目标寄存器基于PC的地址表达式或外部表达式注意:1.从指令位置到文字池的偏移量必须小于4KB;2.与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。目前七页\总数五十六页\编于三点ARM伪指令——大范围的地址读取
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载常量):LDRR2,=0xFF0;MOVR2,#0xFF0LDRR0,=0xFF000000;MOVR0,#0xFF000000LDRR1,=0xFFFFFFFE;MVNR1,#0x1目前八页\总数五十六页\编于三点ARM伪指令——大范围的地址读取
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载地址):
...LDRR1,=InitStack...InitStackMOVR0,LR...使用伪指令将程序标号InitStack的地址存入R1目前九页\总数五十六页\编于三点ARM伪指令——大范围的地址读取
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载地址):编译后的反汇编代码:
...LDRR1,=InitStack...InitStackMOVR0,LR...
...0x60LDRR1,0xb4...0x64MOVR0,LR...0xb4DCD0x64使用伪指令将程序标号InitStack的地址存入R1地址程序代码目前十页\总数五十六页\编于三点ARM伪指令——大范围的地址读取
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载地址):编译后的反汇编代码:
...LDRR1,=InitStack...InitStackMOVR0,LR...
...0x60LDRR1,0xb4...0x64MOVR0,LR...0xb4DCD0x64使用伪指令将程序标号InitStack的地址存入R1LDR伪指令被汇编成一条LDR指令,并在文字池中定义了一个常量,该常量为InitStack标号的地址目前十一页\总数五十六页\编于三点ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。ADRL{cond}register,exprADRL伪指令格式指令执行的条件码加载的目标寄存器地址表达式地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-64K~64K;当地址值是字对齐时,其取指范围为-256K~256K;目前十二页\总数五十六页\编于三点ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。
...ADRLR0,Delay...DelayMOVR0,r14...应用示例(源程序):使用伪指令将程序标号Delay的地址存入R0目前十三页\总数五十六页\编于三点ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。
...ADRLR0,Delay...DelayMOVR0,r14...应用示例(源程序):
...0x20ADDr1,pc,#400x24ADDr1,r1,#FF00...0xFF68MOVr0,r14...编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0地址程序代码目前十四页\总数五十六页\编于三点ARM伪指令——中等范围的地址读取
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。
...ADRLR0,Delay...DelayMOVR0,r14...应用示例(源程序):
...0x20ADDr1,pc,#400x24ADDr1,r1,#FF00...0xFF68MOVr0,r14...编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0ADRL伪指令被汇编成两条指令目前十五页\总数五十六页\编于三点ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。ADR{cond}register,exprADR伪指令格式指令执行的条件码加载的目标寄存器地址表达式地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-255~255;当地址值是字对齐时,其取指范围为-1020~1020;目前十六页\总数五十六页\编于三点ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
...ADRR0,Delay...DelayMOVR0,r14...应用示例(源程序):使用伪指令将程序标号Delay的地址存入R0目前十七页\总数五十六页\编于三点
...0x20ADDr1,pc,#0x3c......0x64MOVr0,r14...ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
...ADRR1,Delay...DelayMOVR0,r14...应用示例(源程序):编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0地址程序代码目前十八页\总数五十六页\编于三点ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
...ADRR0,Delay...DelayMOVR0,r14...应用示例(源程序):
...0x20ADDr1,pc,#0x3c......0x64MOVr0,r14...编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0ADR伪指令被汇编成一条指令目前十九页\总数五十六页\编于三点ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。应用示例2(查表):
ADRR0,DISP_TAB ;加载转换表地址
LDRBR1,[R0,R2] ;使用R2作为参数,进行查表
…DISP_TABDCB0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8目前二十页\总数五十六页\编于三点ARM伪指令——空操作伪指令
NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOVR0,R0”指令等。NOP可用于延时操作。NOPNOP伪指令格式应用示例(延时子程序):
movR1,#0x1234DelayNOP ;空操作
NOPNOPSUBSR1,R1,#1 ;循环次数减一
BNEDelay ;如果循环没有结束,跳转Delay继续
MOVPC,LR ;子程序返回目前二十一页\总数五十六页\编于三点6.2 ARM汇编语言伪操作伪操作(Directive)是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。伪操作只是汇编过程中起作用,一旦汇编结束,伪操作也就随之消失。目前二十二页\总数五十六页\编于三点6.3ARM汇编伪操作ARM公司推出的开发工具所支持的汇编伪操作:符号定义伪操作数据定义伪操作汇编信息报告控制伪操作汇编代码控制伪操作文件包含伪操作指令集类型标识伪操作其他功能伪操作目前二十三页\总数五十六页\编于三点符号定义伪操作语法格式功能LCLA variable定义一个局部算术变量并将其初始化为0LCLL variable定义一个局部逻辑变量并将其初始化为FALSELCLS variable定义一个局部字符串变量并将其初始化为空串GBLA variable定义一个全局算术变量并将其初始化为0GBLL variable定义一个全局逻辑变量并将其初始化为FALSEGBLS variable定义一个全局字符串变量并将其初始化为空串variable_aSETAexpr_a给一个全局或局部算术变量赋值variable_lSETLexpr_l给一个全局或局部逻辑变量赋值variable_sSETSexpr_s给一个全局或局部字符串变量赋值目前二十四页\总数五十六页\编于三点举例如下:
GBLATest1;定义一个全局的数字变量Test1SETA0xaa;将该变量赋值为0xaaGBLLTest2;定义一个全局的逻辑变量Test2SETL{TRUE};将该变量赋值为真
GBLSTest3;定义一个全局的字符串变量Test3SETS“Testing”;将该变量赋值为“Testing”举例如下:
LCLATest4;声明一个局部的数字变量Test4SETA0xaa;将该变量赋值为0xaaLCLLTest5;声明一个局部的逻辑变量Test5SETL{TRUE};将该变量赋值为真
LCLSTest6;定义一个局部的字符串变量Test6SETS“Testing”;将该变量赋值为“Testing”目前二十五页\总数五十六页\编于三点符号定义伪操作语法格式功能nameRLIST{registers_list}为一个通用寄存器列表定义名称nameSNexpr为一个单精度的VFP寄存器定义名称,单精度寄存器编号范围为0~31nameDNexpr为一个双精度的VFP寄存器定义名称,双精度寄存器编号范围为0~15nameFNexpr为一个FPA浮点寄存器定义名称,浮点寄存器编号范围为0~7nameCPexpr为一个协处理器定义名称,协处理器编号范围为0~15nameCNexpr为一个协处理器的寄存器定义名称,协处理器的寄存器编号范围为0~15目前二十六页\总数五十六页\编于三点符号定义伪操作注意事项用伪操作声明的全局或局部变量名必须在整个程序范围内是唯一的。用伪操作对变量赋值前必须先声明变量。用RLIST定义的寄存器列表名,可以在LDM/STM中使用。在使用DN伪操作时,双精度VFP寄存器D0~D15是汇编器预先定义的,用户不能再使用。在使用SN伪操作时,单精度VFP寄存器S0~S31是汇编器预先定义的,用户不能再使用。在使用FN伪操作时,FPA浮点寄存器F0~F7是汇编器预先定义的,用户不能再使用。在使用CP伪操作时,协处理器P0~P15是汇编器预先定义的,用户不能再使用。在使用CN伪操作时,协处理器的寄存器C0~C15是汇编器预先定义的,用户不能再使用。目前二十七页\总数五十六页\编于三点ARM汇编器对ARM的寄存器进行了预定义,所有的寄存器和协处理器名都是大小写敏感的。预定义的寄存器如下:预定义变量1R0~R15和r0~r15;a1~a4(参数、结果或临时寄存器,与r0~r3同义);v1~v8(变量寄存器,与r4~r11同义);sb和SB(静态基址寄存器,与r9同义);sl和SL(堆栈限制寄存器,与r10同义);fp和FP(帧指针,与r11同义);目前二十八页\总数五十六页\编于三点预定义变量2ip和IP(过程调用中间临时寄存器,与r12同义);sp和SP(堆栈指针,与r13同义);lr和LR(链接寄存器,与r14同义);pc和PC(程序计数器,与r15同义);cpsr和CPSR(程序状态寄存器);spsr和SPSR(程序状态寄存器);f0~f7和F0~F7(FPA寄存器);s0~s31和S0~S31(VFP单精度寄存器);d0~d15和D0~D15(VFP双精度寄存器);p0~p15(协处理器0~15);c0~c15(协处理器寄存器0~15)。目前二十九页\总数五十六页\编于三点内置变量ARM汇编器所定义的内置变量如下表1所示。值得注意的是内置变量的设置不能用SETA、SETL或SETS等指示符来设置,只能用于表达式或条件语句。例如:IF{ARCHITECTURE}=“4T”目前三十页\总数五十六页\编于三点变量含义{PC}或.当前指令的地址{VAR}或@存储区位置计数器的当前值{TRUE}逻辑常量真{FALSE}逻辑常量假{OPT}当前设置列表选项值,OPT用来保存当前列表选项,改变选项值,恢复它的原始值{CONFIG}如果汇编器汇编ARM代码,则值为32;如果汇编器汇编Thumb代码,则值为16{ENDIAN}如果汇编器在大端模式下,则值为big;如果汇编器在小端模式下,则值为little表1内置变量目前三十一页\总数五十六页\编于三点{CODESIZE}如果汇编器汇编ARM代码,则值为32;如果汇编器汇编Thumb代码,则值为16,与{CONFIG}同义{CPU}选定的CPU名,缺省时为ARM7TDMI{FPU}选定的FPU名,缺省时为SoftVFP{ARCHITECTURE}选定的ARM体系结构的值;3,3M,4,4T和4TxM{PCSTOREOFFSET}STRpc,[…]或STMRb,[…PC]指令的地址和PC存储值之间的偏移量{ARMASM_VERSION}或|ads$version|ARM汇编器的版本号,为整数表1内置变量(续)目前三十二页\总数五十六页\编于三点数据定义伪操作数据定义伪操作一般用于为特定的数据分配存储单元,也可以完成已分配存储单元的初始化。目前三十三页\总数五十六页\编于三点数据定义伪操作语法格式功能{label} DCB expr{,expr}…其中:expr是-128~255之间的数字或字符串分配一片连续的字节存储单元并用expr初始化,字节数由expr的个数决定。“DCB”可以用“=”代替。{label} DCW expr{,expr}…其中:expr是-32768~65535之间的数字表达式或已定义的变量分配一片连续的半字存储单元并用expr初始化,半字数由expr的个数决定。(要求半字对齐){label} DCWU expr{,expr}…其中:expr是-32768~65535之间的数字表达式或已定义的变量分配一片连续的半字存储单元并用expr初始化,半字数由expr的个数决定。(不要求半字对齐)以上三条中的label:是可选的程序标号;目前三十四页\总数五十六页\编于三点数据定义伪操作语法格式功能{label} DCD expr{,expr}…其中:expr为数字表达式或已定义的变量分配一片连续的字存储单元并用expr初始化,字数由expr的个数决定。“DCD”可以用“&”代替。(要求字对齐){label} DCDU expr{,expr}…其中:expr为数字表达式或已定义的变量分配一片连续的字存储单元并用expr初始化,字数由expr的个数决定。(不要求字对齐)以上三条中的label:是可选的程序标号;目前三十五页\总数五十六页\编于三点数据定义伪操作语法格式功能{label} DCQ {-}expr{,{-}expr}…其中:expr为数字或表达式,其数值必须是整数。如果前没有“-”号,取值范围为0~264-1;如果前有“-”号,取值范围为0~263-1分配一片连续的双字存储单元并用expr初始化,字数等于expr个数的2倍。(要求字对齐){label} DCQU {-}expr{,{-}expr}…其中:expr为数字或表达式,其数值必须是整数。如果前没有“-”号,取值范围为0~264-1;如果前有“-”号,取值范围为0~263-1分配一片连续的双字存储单元并用expr初始化,字数等于expr个数的2倍。(不要求字对齐)以上三条中的label:是可选的程序标号;目前三十六页\总数五十六页\编于三点数据定义伪操作语法格式功能{label} DCFS fpliteral{,fpliteral}…其中fpliteral单精度浮点表达式,取值范围:1.17549435e-38~3.4028234e+38。分配一片连续的单精度浮点数存储单元并用fpliteral初始化,每个浮点数占一个字单元,分配的字数由fpliteral的个数决定。(要求字对齐){label} DCFSU fpliteral{,fpliteral}…其中fpliteral单精度浮点表达式,取值范围:1.17549435e-38~3.4028234e+38。分配一片连续的单精度浮点数存储单元并用fpliteral初始化,每个浮点数占一个字单元,分配的字数由fpliteral的个数决定。(不要求字对齐)以上三条中的label:是可选的程序标号;目前三十七页\总数五十六页\编于三点数据定义伪操作语法格式功能{label} DCFD fpliteral{,fpliteral}…其中fpliteral单精度浮点表达式,取值范围:2.22507385850720138e-308~1.7976931348623157e+308分配一片连续的双精度浮点数存储单元并用fpliteral初始化,每个浮点数占两个字单元,分配的字数等于fpliteral个数的2倍。(要求字对齐){label} DCFDU fpliteral{,fpliteral}…其中fpliteral单精度浮点表达式,取值范围:2.22507385850720138e-308~1.7976931348623157e+308分配一片连续的双精度浮点数存储单元并用fpliteral初始化,每个浮点数占两个字单元,分配的字数等于fpliteral个数的2倍。(不要求字对齐)以上三条中的label:是可选的程序标号;目前三十八页\总数五十六页\编于三点声明数据缓冲池LTORG功能:在使用LDR伪指令时,要在适当的位置加入LTROG声明数据缓冲池,这样就会把要加载的数据保存到缓存池中,再使用ARM加载指令读出,如果没有使用LTROG声明数据缓冲池,则汇编器会在程序末尾自动声明。语法格式: LTROG分配存储空间SPACE功能:用于分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。SPACE也可用“%”代替。
语法格式:{label} SPACEexpr其中:label为可选的程序标号;expr为分配的字节数。目前三十九页\总数五十六页\编于三点使用示例:AREAExample,CODE,READONLYstartBLfunc1func1;codeLDRr1,=0x55555555;codeMOVpc,lrLTORGdataSPACE4200;从当前位置开始分配连续4200字
节的存储单元并初始化为0END目前四十页\总数五十六页\编于三点定义结构化内存表首地址MAP功能:用于定义一个结构化的内存表的首地址。MAP也可用“^”代替。表达式可以为程序中的标号或数学表达式;基址寄存器为可选项:当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。语法格式:MAPexpr{,base_register}其中:结构化内存表的首址为expr与base_register之和MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。目前四十一页\总数五十六页\编于三点定义结构化内存表数据域FIELD功能:用于定义一个结构化内存表中的数据域。FILED也可用“#”代替。语法格式: {label} FIELD expr其中:label为可选的程序标号,当指定这一选项时,label的值为当前内存表的位置计数器的值;expr为当前数据域在内存表中所占的字节数。FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表:目前四十二页\总数五十六页\编于三点注意:MAP和FIELD伪指令仅用于定义数据结构,并不实际分配存储单元。
MAP伪指令定义内存表的首地址;FIELD伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。举例如下:MAP0x100;定义结构化内存表首地址的值为0x100。AFIELD16;定义A的长度为16字节,位置为0x100BFIELD32;定义B的长度为32字节,位置为0x110SFIELD256;定义S的长度为256字节,位置为0x130目前四十三页\总数五十六页\编于三点汇编代码控制伪操作汇编控制伪操作用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条:
—IF、ELSE、ENDIF—WHILE、WEND—MACRO、MEND—MEXIT
目前四十四页\总数五十六页\编于三点IF条件编译伪操作语法格式: IFlogical_expression
程序代码段A {ELSE
程序代码段B } ENDIF当IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。其中,ELSE及指令序列2可以没有。此时,当IF后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面的指令。IF、ELSE、ENDIF伪指令可以嵌套使用。举例如下:GBLLTest⋯⋯IFTest=TRUE
指令序列1ELSE
指令序列2ENDIF目前四十五页\总数五十六页\编于三点WHILE条件编译伪操作语法格式: WHILE logical_expression
程序代码段 WEND当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。
WHILE、WEND伪指令可以嵌套使用。GBLACounterCounterSETA3⋯⋯WHILECounter<10
指令序列WEND目前四十六页\总数五十六页\编于三点MACRO宏定义伪操作语法格式: MACRO {$label} macroname {$parameter{,$parameter}…}
程序代码段 MENDMACRO、MEND伪指令可以将一段代码定义为一个整体,称为宏指令。宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。MACRO、MEND伪指令可以嵌套使用。;macrodefinitionMACRO;startmacrodefinition$labelxmac$p1,$p2…;code$label.loop1…;code…;codeBGE$label.loop1$label.loop2…;codeBL$p1BGT$label.loop2…;codeADR$p2…;codeMEND;endmacrodefinition目前四十七页\总数五十六页\编于三点;macrodefinitionMACRO;startmacrodefinition$labelxmac$p1,$p2;code$label.loop1;code;codeBGE$label.loop1$label.loop2;codeBL$p1BGT$label.loop2;codeADR$p2;codeMEND;endmacrodefinition;macroinvocationabcxmacsubr1,de;invokemacro
;codeabcloop1;code;codeBGEabcloop1abcloop2;codeBLsubr1BGTabcloop2;codeADRde;code目前四十八页\总数五十六页\编于三点其他常用的伪指令AREA指令指示汇编器汇编新的代码段或数据段。段是不可分的已命名独立代码或数据块,由链接器处理。
AREAsectionname{,attr}{,attr}...—sectionname段指定的名称,以非字母字符开头的名称必须包含在竖杠内,否则会生成缺失段名的错误。
—{,attr}表示该段的相关属性,多个属性用逗号分隔,常用属性如下:AREAInit,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度家庭保姆雇佣与技能提升服务合同4篇
- 2025年度门窗安装与室外照明一体化工程合同范本3篇
- 2025年度个人精装修房屋租赁合同示范文本2篇
- 2025年度茶馆店铺转让及文化传承合同3篇
- 2025版宁波共有产权房租赁合同模板4篇
- 2025年度车辆购置担保合同模板2篇
- 二零二五年度充电桩充电服务市场分析合同4篇
- 2025版木地板产业链整合与战略投资合同4篇
- 2025年度酒店楼顶花园租赁与维护合同3篇
- 年薪制劳动合同范本2025:新能源汽车行业人才激励方案3篇
- 幼儿园学习使用人民币教案教案
- 2023年浙江省绍兴市中考科学真题(解析版)
- 语言学概论全套教学课件
- 大数据与人工智能概论
- 《史记》上册注音版
- 2018年湖北省武汉市中考数学试卷含解析
- 测绘工程产品价格表汇编
- 《肾脏的结构和功能》课件
- 装饰图案设计-装饰图案的形式课件
- 护理学基础教案导尿术catheterization
- ICU护理工作流程
评论
0/150
提交评论