ARM汇编伪指令与伪操作.ppt

上传人:牧羊曲112 文档编号:5415692 上传时间:2023-07-05 格式:PPT 页数:53 大小:1.05MB
返回 下载 相关 举报
ARM汇编伪指令与伪操作.ppt_第1页
第1页 / 共53页
ARM汇编伪指令与伪操作.ppt_第2页
第2页 / 共53页
ARM汇编伪指令与伪操作.ppt_第3页
第3页 / 共53页
ARM汇编伪指令与伪操作.ppt_第4页
第4页 / 共53页
ARM汇编伪指令与伪操作.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《ARM汇编伪指令与伪操作.ppt》由会员分享,可在线阅读,更多相关《ARM汇编伪指令与伪操作.ppt(53页珍藏版)》请在三一办公上搜索。

1、6.1 汇编语言伪指令,ARM汇编器支持ARM伪指令,伪指令可以像其它ARM指令一样使用,这些伪指令在汇编阶段被翻译成ARM或者Thumb指令(或指令序列)。ARM伪指令包含LDR、ADRL、ADR、NOP等。,注意:ARM伪指令不属于ARM指令集中的指令,是为了编程方便而定义的。,LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。,LDRcond register,=expr|label_expr,常量或地址表达式,注意:与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。,1.大范围地址读取伪指令LDR,目标寄存器,应用示例1(加载常量):,LDR R2,=0 xFF0;M

2、OV R2,#0 xFF0LDR R0,=0 xFF000000;MOV R0,#0 xFF000000,应用示例2(加载地址):,.LDR R1,=InitStack.InitStack MOV R0,LR.,使用伪指令将程序标号InitStack的地址存入R1,2.中等范围地址读取伪指令ADRL,ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。,地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-64K64K;当地址值是字对齐时,其取指范围为-256K256K;,ADRLcond register,ex

3、pr,目标寄存器,地址表达式,3.小范围地址读取伪指令ADR,ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。,ADRcond register,expr,目标寄存器,地址表达式,地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-255255;当地址值是字对齐时,其取指范围为-10201020;,.ADR R0,Delay.Delay MOV R0,R14.,应用示例1:,使用伪指令将程序标号Delay的地址存入R0,ADR R0,DISP_TAB;加载转换表地址 LDRB R1,R0,R2;使用R2作为偏移量,进行查表 DISP_TAB DC

4、B 0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,应用示例2(查表程序):,4.空操作伪指令NOP,NOP是空操作伪指令,在汇编时将会被替代成ARM中的空操作。,NOP,例6-4用软件实现延时5个时钟周期。.Delay5 NOP NOP NOP NOP NOP.,6.2 ARM汇编语言伪操作,伪操作是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。伪操作只是汇编过程中起作用,一旦汇编结束,伪操作也就随之消失。,在ARM的汇编程序中,伪操作主要有符号定义伪操作

5、、数据定义伪操作、汇编代码控制伪操作、汇编信息报告控制伪操作、指令集类型标识伪操作、文件包含伪操作和其他类型伪操作等。,6.3.1 符号定义伪操作,符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种。(1)局部变量定义LCLA、LCLL及LCLS(2)全局变量定义GBLA、GBLL及GBLS(3)变量赋值伪操作SETA、SETL及SETS(4)给通用寄存器列表定义名称RLIST(5)VFP寄存器名称定义DN、SN(6)FPA浮点寄存器名称定义FN(7)协处理器名称定义CP(8)协处理器寄存器名称定义CN,GBLA Test1 Tes

6、t1 SETA 0 xaa GBLL Test2 Test2 SETL TRUE GBLS Test3 Test3 SETS“Testing”,应用示例:,例6-11将寄存器列表R0、R1、R2、R5、R7、R10、R11、R12的名称定义为Reglist。Reglist RLIST R0-R2,R5,R7,R10-R12,4.给通用寄存器列表定义名称RLIST,RLIST伪操作用于给一个通用寄存器列表定义名称,使用该伪操作定义的名称可以在LDM/STM中使用。,name RLIST registers_list,6.3.2 数据定义伪操作,数据定义伪操作一般用于为特定的数据分配存储单元,同时

7、可完成已分配存储单元的初始化。常见的数据定义伪操作有如下几种。,(1)DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。(2)DCW/DCWU 用于分配一片连续的半字存储单元并用指定的数据初始化。(3)DCD/DCDU 用于分配一片连续的字存储单元并用指定的数据初始化。(4)DCFS/DCFSU 用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。(5)DCFD/DCFDU 用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。,(6)DCQ/DCQU用于分配一片以8字节为单位的连续的存储单元并用指定的数据初始化。(7)LTORG 声明一个数据缓冲池。(8)

8、SPACE用于分配一片连续的存储区域并将其初始化为0。(9)MAP用于定义一个结构化的内存表首地址。(10)FIELD用于定义一个结构化的内存表的数据域。(11)DCDO 将内存单元的内容初始化为相对地址。(12)DCI 分配用于存放代码的内存单元。,DCB:DISPTAB DCB 0 x33,0 x43,0 x76,0 x12 DCB-120,20,36,55ERRSTR DCB“Send,data is error!”,0,DCD:AREA Word,CODE,READONLY num EQU 20 ENTRY start LDR R0,=src LDR R1,=dst MOV R2,#n

9、umwordcopy LDR R3,R0,#4 STR R3,R1,#4 SUBS R2,R2,#1 BNE wordcopystop B stop AREA BlockData,DATA,READWRITEsrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 END,LTORG:例6-22(1)声明一个数据缓冲池用来存储0 xAABBCCDD。LDR R0,=0 xAABBCCDD EOR R1,R1,R0 B SUB_pro LTORG(2)用LTORG伪

10、操作定义数据缓冲池。AREA Example,CODE,READONLY_start BL fun_sub1 fun_sub1 LDR R0,=0 xAABBCCDD MOV PC,LR LTORG END,SPACE:AREA Data,DATA,READWRITE DataBuf SPACE 1000,MAP、FIELD:例6-25(1)定义一个结构化的内存表,其首地址固定为0 x300,该结构化内存表包含4个域,Fdata1长度为4字节,Fdata2长度为8字节,Fdata3长度为100字节,Fdata4长度为200字节。MAP 0 x300 Fdata1 FIELD 4 Fdata2

11、FIELD 8 Fdata3 FIELD 100 Fdata4 FIELD 200,MAP、FIELD:(2)分析下面LDR指令实现的功能。MAP 4,R12 FIELD 4Fdata FIELD 4 LDR R0,Fdata,MAP、FIELD:,6.3.3 汇编代码控制伪操作,汇编代码控制伪操作用于控制汇编程序的执行流程,常用的汇编控制伪操作包括以下几条:1.IF条件编译伪操作;2.WHILE条件编译伪操作;3.MACRO宏定义伪操作,IF、ELSE、ENDIF伪操作能根据条件的成立与否来决定是否对一段程序代码进行编译。语法格式:IF logical-expression 程序代码AELS

12、E 程序代码BENDIF,1.IF条件编译伪操作,例6-28IF UART0=ON BL UART0_initELSE BL UART1_initENDIF,WHILE、WEND伪操作能根据条件的成立与否决定是否对一段程序代码进行重复编译,直到WHILE后面的逻辑表达式不成立为止。语法格式:WHILE logical-expression 程序代码WEND,2.WHILE条件编译伪操作,例6-29 counter SETA 100 WHILE counter0.counter SETA counter-1WEND,MACRO、MEND伪操作可以将一段代码定义为一个整体,称为宏,然后就可以在程序

13、中通过宏指令多次调用该段代码。MACRO标志宏定义的开始,MEND标志宏定义的结束。语法格式:MACRO$label macroname$parameter,$parameter程序代码段MEND,3.MACRO宏定义伪操作,#define PI 3.1415926#define S(r)PI*r*r main()float a,area;a=3.6;area=S(a);printf(“r=%fnarea=%fn”,a,area);,C语言宏定义和使用,与C语言中的define相似,仅在源程序中做字符替换以MACRO指示符开始,以MEND结束。,例6-30MACRO$labelTestAndB

14、ranch$dest,$reg,$cc$labelCMP$reg,#0B$cc$destMEND,TestTestAndBranch NonZero,R0,NENonZero,TestCMP R0,#0BNE NonZeroNonZero,6.3.5 指令集类型标识伪操作,指令集类型标识伪操作用来告诉编译器所处理的是32位的ARM指令还是16位的Thumb指令,实现这一操作的操作符有ARM、CODE32、THUMB、CODE16。,例6-35 AREA ToThumb,CODE,READONLY ENTRY ARMstart ADR R0,into_thumb+1 BX R0 THUMBint

15、o_thumb MOVS R0,#10,6.3.6 文件包含伪操作,文件包含伪操作包括两类:一类是将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理;另一类是也将一个源文件包含到当前源文件中,但被包含文件不进行汇编处理。,GET伪操作用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。,1文件包含GET或INCLUDE,例6-36:AREA Example,CODE,READONLYGET include_s.sGET C:testinclude_init.s,INCBIN伪操作将一个文件包含到当前源文件中,该

16、文件按原样包含,不进行汇编处理。可以使用INCBIN来包含可执行文件、文字或其他数据。,2文件原样包含INCBIN,例6-37:AREA Example,CODE,READONLYINCBIN test1.datINCBIN c:testtest2.txt,6.3.7 其他类型伪操作,对齐方式设置ALIGN段属性定义伪操作AREA 源程序结尾标识END 声明程序的入口点ENTRY 定义常量或标号名称EQU 声明全局标号EXPORT或GLOBAL 将符号导出到目标文件EXPORTAS 外部符号声明IMPORT 和 EXTERN 保留局部符号KEEP 禁止使用浮点指令NOFP 指定段的相关性REQ

17、UIRE 堆栈八字节对齐REQUIRE8 和 PRESERVE8 局部变量范围定义ROUT,ALIGN伪操作通过用零或NOP指令进行填充来使当前位置与指定的边界对齐。应用示例:AREA Example,CODE,READONLY START LDR R0,=sdfjk.MOV PC,LR sdfjk DCB 0X56 ALIGN SUBI MOV R1,R3.MOV PC,LR,1.对齐方式设置ALIGN,段属性定义伪操作AREA用于定义一个代码段或数据段,AREA 伪操作指示汇编器汇编新的代码段或数据段。ARM程序采用分段式设计,一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段

18、和数据段。,2段属性定义伪操作AREA,AREA ThumbSub,CODE,READONLYENTRY CODE32header ADR R0,start+1 BX R0 CODE16start MOV R0,#10 MOV R1,#3 BL doaddstop B stopdoadd ADD R0,R0,R1 MOV PC,LR END,END伪操作用于通知编译器已经到了源程序的结尾。,3源程序结尾标识END,ENTRY伪操作用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个ENTRY,但在一个源文件里不能使用多个ENTRY。重释:一个程序(可以包含多个源文件)中至少要有一个EN

19、TRY,可以有多个ENTRY,但一个源文件中最多只有一个ENTRY。,4声明程序的入口点ENTRY,EQU伪操作用于为程序中的常量、标号等定义一个等效的字符名称。应用示例:Test EQU 50Addr EQU 0 x55,5定义常量或标号名称EQU,EXPORT伪操作用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。应用示例:AREA Init,CODE,READONLYEXPORT StestEND,6EXPORT(注:汇编源程序中用),EXTERN伪操作用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到

20、当前源文件的符号表中。,8EXTERN(注:C源程序中用),C源程序:#include extern void strcopy(char*d,const char*s);int main(void)const char*srcstr=“First stringsource”;const char*dststr=“Second stringdestination”;strcopy(dststr,srcstr);return(0);,汇编源程序:AREA SCopy,CODE,READONLY ENTRY EXPORT strcopy strcopy LDRB R2,R1,#1 STRB R2,R0,#1 CMP R2,#0 BNE strcopy MOV PC,LR END,IMPORT伪操作用于通知编译器要使用的标号在其他的源文件中定义。,IMPORT(注:汇编源程序中用),C函数原型:int g(int a,int b,int c,int d)return a+b+c+d;,汇编源程序:AREA f,CODE,READONLYIMPORT gSTR LR,SP,#-4!ADD R1,R0,R0ADD R2,R1,R0ADD R3,R1,R2STR R4,SP,#-4!ADD R3,R1,R1BL gADD SP,SP,#4 LDR PC,SP,#4 END,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号