ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:28.06KB ,
资源ID:3786115      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3786115.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(汇编语言伪指令.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

汇编语言伪指令.docx

1、汇编语言伪指令汇编语言伪指令在汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,它们没有对应的机器码。这些助记符在源程序中的作用是完成汇编程序的各种准备工作,包括定义变量、分配数据存储空间、控制汇编过程、定义程序入口等。它们仅仅在汇编的过程中起作用,一旦汇编过程结束,它们的使命也就完成了。这些助记符称为伪指令,它们所完成的操作称为伪操作。不同汇编器的伪指令可能存在少量的区别,并非所有的伪指令在任何编译器上都能被识别。一、符号定义伪指令符号定义(Symbol Definition)伪指令用于定义ARM汇编程序中的变量,对变量赋值和定义寄存器别名等,如表1所列。表1 符号定义伪

2、指令助 记 符指令功能描述GBLA定义一个全局的数字变量,并初始化为0GBLL定义一个全局的逻辑变量,并初始化为F(假)GBLS定义一个全局的字符串变量,并初始化为空LCLA定义一个局部的数字变量,并初始化为0LCLL定义一个局部的逻辑变量,并初始化为F(假)LCLS定义一个局部的字符串变量,并初始化为空SETA用于给一个数字变量赋值SETL用于给一个逻辑变量赋值SETS用于给一个字符串变量赋值RN用于给一个特殊的寄存器命名CN用于给一个协处理器的寄存器命名CP用于给一个协处理器命名DN用于给一个双精度的VFP寄存器命名SN用于给一个单精度的VFP寄存器命名FN用于给一个FPA浮点寄存器命名R

3、LIST定义一个通用寄存器列表,根据寄存器编号由低到高访问实例: GBLL P_ON ; 定义全局逻辑变量P_ONP_ON SETL TRUE ; 给全局逻辑变量P_ON赋值为真 LCLA NUM ; 定义局部数字变量NUM NUM SETA 100 ; 给全局数字变量NUM赋值为100RegList RLIST R0-R5,R8,R10 ; 定义一个寄存器列表RegList,可用; LDM/STM指令访问该列表二、数据定义伪指令数据定义(Data Denfinition)伪指令一般用于为特定的数据分配存储单元,同时完成对已分配存储单元的初始化工作。数据定义伪指令如表2所示。表2 数据定义伪指

4、令助 记 符指令功能描述SPACE用于分配一片连续的存储单元,并初始化为0MAP用于定义一个结构化内存表的首地址FIELD用于定义一个结构化内存表的数据域LTORG用于声明一个数据缓冲池的开始DCI分配一段字节的存储单元,用指定表达式初始化,并指定存放的是代码DATA在代码段中使用数据DCB用于分配一段连续的字节存储单元,并用指定的表达式初始化DCW(DCWU)用于分配一段连续的半字存储单元,并用指定的表达式初始化DCD(DCDU)用于分配一段连续的字存储单元,并用指定的表达式初始化DCFS(DCFSU)用于为单精度浮点数分配连续字节存储单元,一个数分配1个字单元,并用指定的表达式初始化DCF

5、D(DCFDU)用于为双精度浮点数分配连续字节存储单元,一个数分配2个字单元,并用指定的表达式初始化DCQ(DCQU)用于分配一段连续的双字存储单元,并用指定的64位整数初始化DCDO用于分配一段连续的字存储单元,并将内容初始化为相对于静态基址寄存器的偏移量从使用方法上来讲,数据定义伪指令可以分为以下3类。1SPACE伪指令SPACE用于分配一片连续的存储区,并初始化为0。其中表达式中的数字表示分配的字节数。SPACE也可以用%代替。实例:DataSpace SPACE 100 ; 分配连续100字节的存储单元并初始化为02MAP和FIELD伪指令MAP和伪指令FIELD经常结合在一起使用。M

6、AP用于定义一个结构化的内存表的首地址,可以用“”替代。FIELD用于定义一个结构化的内存表中的数据域,可以用“#”代替。FIELD与MAP配合使用能够定义结构化的内存表。首先用伪指令MAP定义表的首地址,再用伪指令FIELD定义表中的各个数据域,并为每个数据域指定一个标号以供其他指令引用。注意MAP和FIELD仅用于定义数据结构,并不实际分配存储单元。实例:MAP 0x1000 ; 定义结构化内存表首地址为0x1000F1 FIELD 32 ; 长度为32字节数据域F1,起始位置0x1000F2 FIELD 64 ; 长度为64字节数据域F2,起始位置0x1020F3 FIELD 128 ;

7、 长度为128字节数据域F3,起始位置0x10603存储单元分配伪指令DCB用于分配一片连续的以字节为最小单位的存储单元,并可以使用指定的表达式对其进行初始化。换句话说,初始化时数据的取值范围为0255的数字或字符,每个数字或字符存储时占1字节。DCB也可以用“=”代替。伪指令DCW用于分配一片连续的以半字为最小单位的存储单元,并可以使用指定的表达式对其进行初始化。DCWU与DCW的区别在于DCW分配存储单元时严格要求半字对齐,而DCWU则不严格要求半字对齐。DCD、DCFS、DCFD、DCQ与DCW类似并要求字或双字对齐,而DCDU、DCFSU、DCFDU、DCQU与DCWU类似,不严格要求

8、字或双字对齐。实例:hello DCB “Hello Worldn0” ; 用字符串初始化标号为hello的连续字节存储单元 DCD (B013)+(B16) ; 使用表达式初始化连续字存储单元src DCD 1, 2, 3, 4, 5 ; 用数字常量初始化标号为src的连续字存储单元三、汇编控制伪指令汇编控制(Assembly Control)伪指令用于控制汇编程序的执行流程,可以让汇编器按照一定的条件选择性地编译汇编指令或多次编译一段指令,从而根据程序员设定的参数生成不同的映像文件,减少程序员的工作量。常用的汇编控制伪指令包括以下几条,如表3所列。表3 汇编控制伪指令助 记 符指令功能描述

9、IF、ELSE和ENDIF根据条件成立与否决定是否编译某个指令序列WHILE和WEND根据条件成立与否决定是否循环编译某个指令序列MACRO和MEND将一段代码用一个标号替代,可在程序中多次调用该段代码MEXIT从宏定义中跳转出去汇编控制指令可以分为以下3类。1条件判断条件判断指令包括IF、ELSE和ENDIF三条伪指令,其用法和高级语言中的if语句类似,指令书写格式如下。IF logical expression 指令序列1ELSE 指令序列2ENDIFIF,ELSE和ENDIF伪指令能根据条件的成立与否决定是否编译某个指令序列。若IF后面的逻辑表达式为真,则编译指令序列1,否则执行指令序列

10、2。其中,ELSE及指令序列2可以没有,此时当IF后面的逻辑表达式为真,则编译指令序列1,否则继续执行后面的指令。IF、ELSE和ENDIF伪指令可以嵌套使用。实例:GBLL Test ; 声明一个全局的逻辑变量,变量名为TestIF Test = TRUE 指令序列1ELSE 指令序列2ENDIF通过判断Test的值是否为真,汇编器决定编译哪一段指令序列。程序员可以通过设置Test的值,灵活地生成不同的映像文件。2循环控制循环控制指令包括WHILE和WEND指令,指令书写格式如下所示。WHILE logical expression 指令序列WENDWHILE和WEND伪指令能根据条件的成立

11、与否决定是否循环编译某个指令序列。若WHILE后面的逻辑表达式为真,则编译指令序列。该指令序列编译完毕后,再判断逻辑表达式的值,若为真则继续再次编译,一直到逻辑表达式的值为假。WHILE和WEND伪指令可以嵌套使用。实例: GBLA Counter ; 声明一个全局的数学变量,变量名为CounterCounter SETA 3 ; 由变量Counter控制循环次数 WHILE Counter 10 指令序列 WEND通过循环控制指令,可以将一段相同的代码多次编译,类似于把代码复制多次。通过对循环次数的控制可以灵活地控制代码复制次数,极大地减少了程序员的工作量。3宏指令MACRO和MEND伪指令

12、可以将一段代码定义为一个整体,这两条指令称为宏指令。程序员可以在程序中通过宏指令多次调用完成宏定义的代码。指令书写格式如下所示。MACRO$label Microname $parameter1,$parameter2, ; codeMEND其中,在宏指令展开时,$label中的label会替换为用户定义的符号。宏指令可以使用一个或多个参数,当宏指令展开时,这些参数被相应的值替换。包含在MACRO和MEND之间的指令序列称为宏定义体,在宏定义体的第一行应声明宏的原型(包含宏名和所需的参数),然后就可以在汇编程序中通过宏名来调用该指令序列。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序

13、列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数。MACRO和MEND伪指令可以嵌套使用。宏定义实例:MACRO ; 宏定义开始$lable xmac $p1, $p2 ; 宏的名称为xmac,有两个参数$p1和$p2 ; 宏的标号$lable可用于构造宏定义体内的其他标号名称 指令序列$lable.loop1 指令 ; $lable.loop1为宏定义体的内部标号 指令序列BGE $lable.loop1$lable.loop2 指令 ; $lable.loop2为宏定义体的内部标号BL $p1 ; 参数$p1为一个子程序的名称BGT $lable.loop2 指令序列ADR

14、$p2 指令序列MEND ; 宏定义结束在上述代码中,宏名为xmac,标号为$lable,有两个参数$p1和$p2。标号和参数在实际调用中可根据需要被替换成不同的符号。而宏名是唯一确定的,在调用宏时以宏名为依据。调用上述宏可以采用下面的方式:abc xmac subr1, de ; 通过宏的名称xmac调用宏,其中宏的标号为abc, ; 第一个参数为subr1,第二个参数为de可以看出宏调用是通过宏名完成的,调用宏时标号$lable被替换成了abc,两个参数$p1和$p2分别被替换成了subr1和de。汇编器处理宏时会将宏展开还原成为一段代码。程序被汇编后,宏展开的结果为 指令序列abc.lo

15、op1 指令 ; 用标号$lable的实际值abc代替$lable而构成标号 ; abc.loop1 指令序列BGE abc.loop1abc.loop2 指令BL subr1 ; 第一个参数的实际值为subr1BGT abc.loop2 指令序列ADR de ; 第二个参数的实际值为de 指令序列对比宏定义可以看出,原来宏定义中凡是出现了$lable的地方均被替换成了abc,出现$p1的地方被替换成了subr1,而出现$p2的地方被替换成了de。对于程序员而言,采用宏定义的方法可以用一条语句替代一大段指令序列,灵活使用可以极大地提高编程效率。宏指令的使用方式和功能与子程序有些相似,但其本质是

16、完全不同的。采用宏指令时,用一条语句表示了一大段指令序列,汇编器在完成编译时会将宏指令还原成指令序列。换句话说,如果在程序中调用了N次宏指令,最终将汇编器还原成N段指令序列。这N段代码都会被编译成映像文件,最终ARM会将这N段代码都执行一遍,从本质上来讲程序最终生成的映像文件大小不会发生变化。子程序调用则是通过改变程序计数器(PC)的值,从而改变程序的执行顺序来完成的。换句话说,如果在程序中调用N次子程序,子程序本身并不会被复制N次,在编译时也只会生成一段映像文件。但在ARM执行到调用子程序的指令时,会通过改变PC的值将同一段子程序执行N次。与宏定义相比,子程序可以提供模块化的程序设计、节省存

17、储空间并提高运行速度。但在使用子程序结构时需要保护现场,从而增加了系统开销。因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序,通过占用更多的存储空间而减少系统开销,从而优化系统运行速度。MEXIT用于从宏定义中跳转出去。MEXIT使用实例如下:MACRO ; 宏定义开始$abc microabc $param1, $param2 指令序列WHILE condition1 指令序列IF condition2 指令序列MEXIT ; 从宏中跳转出去ELSE 指令序列ENDIFWEND 指令序列MEND四、其他常用伪指令还有一些其他常用的伪指令,在汇编程序中也经常用到,如表4所示。表

18、4 杂项伪指令助 记 符指令功能描述ALIGN通过添加填充字节的方式,使当前位置满足一定的对齐方式AREA段定义,定义一个代码段或数据段CODE16指示汇编器后面的指令为16位的Thumb指令CODE32指示汇编器后面的指令为32位的ARM指令END指示汇编器源文件已经结束ENTRY指定程序的入口点EQU为数字常量,基于寄存器的值和程序中的标号定义一个名称EXPORT声明一个符号可以被其他文件引用GLOBAL同上IMPORT指示编译器当前符号在其他文件中定义,本文件中可能引用该符号(续表)助 记 符指令功能描述EXTERN同上GET/INCLUDE引用文件,包含一个源文件并在当前位置进行汇编I

19、NCBIN引用文件,包含一个源文件但并不进行汇编处理KEEP指示编译器保留符号表中的局部符号NOFP禁止源程序中包含浮点运算指令REQUIRE指定段间的依赖关系REQUORE8指示当前文件请求堆栈为8字节对齐PRESERVE8指示当前文件保存堆栈为8字节对齐ROUT定义局部标号的有效范围下面简要介绍杂项指令中较为常用的几条指令。1AREAAREA伪指令用于定义一个代码段或数据段。指令书写格式:AREA sectionname ,attr ,attr, 其中sectionname表示段名,段名若以数字开头,则该段名需用“|”括起来,如|1_test|。属性字段attr,表示该代码段(或数据段)的

20、相关属性,多个属性以逗号分隔。常用属性如下所示。l CODE属性。用于定义代码段。l DATA属性。用于定义数据段。l READONLY属性。指定本段为只读属性,代码段默认为READONLY。l READWRITE属性。指定本段为可读写属性,数据段的默认属性为READWRITE。l ALIGN属性。书写格式为ALIGN Expr。默认情况下,ELF(可执行连接文件)的代码段和数据段是按字对齐的,目的: 建立库房管理制度,保证物料在储存期安全储存。2适用范围: 适用于本公司库存的原料、辅料、包装材料、半成品和成品的储存管理。3职责:3.1 供应链部负责库房的管理工作。3.2 库管员负责按本制度实

21、施储存管理。4控制要求:4.1 物料管理4.1.1 物料应按不同的状态分区存放。应放在洁净的托盘上,间距合适通风良好,严禁直接堆放在地上,堆放以不超出托板为宜。4.1.2 存放原则4.1.2.1 不合格品应设专区存放;其他有特殊存放要求的,应存放于与其存放条件相适宜的库房(冷库、化学品库)。4.1.2.3 成品应按品种、规格分区存放;同一品种、同一规格,应按批号存放,以利先进先出。零箱应放在明显的位置,以利清点。4.1.2.4 内包材与外包材、液体物料与固体物料应分区隔离存放。容易相互发生化学反应或者灭火方法不同的物品,必须分间、分库储存,并在醒目处标明储存物品的名称、性质和灭火方法。4.1.

22、2.5 含有挥发性成分的物料,应密闭保存。4.1.3 库存物料有明显的状态标记(待验:黄色;合格:绿色;不合格:红色),以区别不同的状态。4.1.4 凡采用单独地区储藏来保证隔离状况时,这些地区应当有明显标志,且应当仅限于被批准者方可进入。4.1.5物料进入库房时,需要按照物料堆放的要求进行码垛,垛与垛间距不小于0.5米,垛与墙间距不小于0.5米,垛与梁、柱间距不小于0.3米,主要通道宽度不少于2米。4.1.6 库房内设备、管道、设施与货垛应保持至少0.3米距离,电器设施、设备周围,架空线路下方不准堆放物料。4.1.7 仓储区内物料的码放、搬运应严格按操作规定进行,轻拿轻放,以防止损坏。4.1

23、.8 库存物料的收发、保管应实行二人复核,所有物料、帐、卡、记录、单据、状态标志等应由表达式的取值范围为031。l COMMON属性。该属性定义一个通用的段,不包含任何用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。例如,AREA Init, CODE, READONLY ; 该伪指令定义了一个代码段,段名为Init,属性为只读AREA Data1, DATA, READWRITE ; 该伪指令定义了一个数据段,段名为Data1,属性为可读写2ALIGN指令书写格式:ALIGN expr, o

24、ffsetALIGN伪指令可通过添加填充字节的方式,使当前位置满足一定的对齐方式。其中,expr(表达式)的值用于指定对齐方式,可能的取值为2的幂,如1,2,4,8和16等。若未指定expr,则将当前位置对齐到下一个字的位置。offset(偏移量)也是一个数字表达式,若使用该字段,则当前位置的对齐方式为2的expr次幂+ offset。例如,AREA Init, CODE, READONLY, ALIGN = 3 ; 指定后面的指令为8字节对齐指令序列END3CODE16和CODE32CODE16伪指令通知编译器,其后的指令序列为16位的Thumb指令。CODE32伪指令通知编译器,其后的指令

25、序列为32位的ARM指令。若在汇编源程序中同时包含ARM指令和Thumb指令,则可用CODE16伪指令通知编译器其后的指令序列为16位的Thumb指令,用CODE32伪指令通知编译器其后的指令序列为32位的ARM指令。因此,在使用ARM指令和Thumb指令混合编程的代码里,可用这两条伪指令进行切换,但要注意的是,它们只通知编译器其后指令的类型,并不能对处理器进行状态的切换。例如,AREA Init, CODE, READONLYCODE32 ; 通知编译器其后的指令为32位的ARM指令LDR R0, = NEXT + 1 ; 将跳转地址放入寄存器R0BX R0 ; 程序跳转到新的位置执行,并将

26、处理器切换到Thumb工作状态CODE16 ; 通知编译器其后的指令为16位的Thumb指令NEXT LDR R3, = 0x3FF END ; 程序结束4ENTRYENTRY伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由连接器指定),但在一个源文件里最多只能有一个ENTRY(也可以没有)。例如,AREA Init, CODE, READONLYENTRY ; 指定应用程序的入口点5EQU指令书写格式:name EQU expr, typeEQU伪指令用于为程序中的常量和标号等定义一个等效的字符名称,类似于C

27、语言中的define。其中EQU可用“*”代替。name(名称)为EQU伪指令定义的字符名称,当expr(表达式)为32位常量时,可以指定其type(数据类型),可为三种类型之一:CODE16,CODE32和DATA。例如,Test EQU 50 ; 定义标号Test的值为50Addr EQU 0x55, CODE32 ; 定义Addr的值为0x55,且该处为32位的ARM指令6引用指令EXPORT、GLOBAL、IMPORT和EXTERN伪指令属于引用指令。其主要作用是声明一个符号可以被其他文件引用,或在本文件中将引用其他文件中的符号。指令书写格式如下:EXPORT(GLOBAL/IMPOR

28、T/EXTERN)Symbol WEAKEXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他文件中引用。EXPORT可用GLOBAL代替。IMPORT伪指令用于通知编译器要使用的标号在其他源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。EXTERN伪指令用于通知编译器要使用的标号在其他源文件中定义,但要在当前源文件中引用。如果当前源文件实际并未引用该标号,则该标号不会被加入到当前源文件的符号表中。标号在程序中区分大小写,WEAK选项表示当所有源文件都没有定义这样一个标号时,编译器不会给出错误信息,在多数情况下将该标号置

29、为0。若该标号被B或BL指令引用,则将B或BL指令置为NOP操作。例如,AREA Init, CODE, READONLYEXTERN Main ; 通知编译器当前文件要引用标号Main,但Main在其他源文件中定义END7包含指令GET、INCLUDE和INCBIN等伪指令属于包含伪指令,这类伪指令通常表示当前的源文件编译时需要使用到源文件或目标文件。GET伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。汇编程序中常用的方法是在某源文件中定义一些宏指令,用EQU定义常量的符号名称,用MAP和FIELD定义结构化的数据类型,然后用GET伪指令将这个源文件包含到其他源文件中。使用方法与C语言中的include相似。GET伪指令只能用于包含源文件,包含目标文件需要使用INCBIN伪指令。INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不做任何变动而存放在当前文件中,编译器从其后开始继续处理。包含指令使用实例如下:AREA Init, CODE, READONLYGET a1.s ; 通知编译器当前源文件包含源文件a1.sGET C:b1.s ; 通知编译器当前源文件包含源文件C:a2.sINCBIN a2.dat

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1