ARM汇编语言的语法知识实用教案

上传人:牛*** 文档编号:78736182 上传时间:2022-04-22 格式:PPT 页数:116 大小:2.48MB
收藏 版权申诉 举报 下载
ARM汇编语言的语法知识实用教案_第1页
第1页 / 共116页
ARM汇编语言的语法知识实用教案_第2页
第2页 / 共116页
ARM汇编语言的语法知识实用教案_第3页
第3页 / 共116页
资源描述:

《ARM汇编语言的语法知识实用教案》由会员分享,可在线阅读,更多相关《ARM汇编语言的语法知识实用教案(116页珍藏版)》请在装配图网上搜索。

1、 ARM汇编语言语句(yj)格式 ARM汇编语言(hu bin y yn)的语句格式: symbolinstruction|directive|pseudo-instructioncomment其中:instruction为指令。在ARM汇编语言中,指令不能从一行的行头开始.在一行语句中,指令的前面必须有空格或符号. directive为伪操作。 pseudo-instruction为伪指令。 symbol为符号。 在ARM汇编语言中,符号必须从一行的行头开始,并且符号中不能包含空格,在指令和伪指令中符号用作地址标号,在有些(yuxi)伪操作中,符号用作变量或者常量.comment为语句的注释

2、.在 ARM 汇编语言中注释以分号”;”开头.注释的结尾即为一行的结尾,注释也可以单独占用一行.第1页/共115页第一页,共116页。5.1.ARM汇编语言(hu bin y yn)的伪操作 、宏指令和伪指令 ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成. 伪操作是ARM汇编语言程序里的一些(yxi)特殊指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序进行汇编时由汇编程序处理,而不是在计算机运行期间由机器执行.也就是说,这些伪操作只在汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之结束. 第2页/共115页第二页,共116页。5.1.ARM汇编语言(hu

3、bin y yn)的伪操作 、宏指令和伪指令 ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成. 宏指令是一段独立的程序代码,可插在源程序中,它通过伪操作来定义.宏在被使用前必须提前定义好,宏之间可互相(h xing)调用,也可自己递归调用.通过直接书写宏名来使用宏,并根据宏指令的格式设置相应的输入参数.这与C语言中子函数形参与实参的传递很相似. 第3页/共115页第三页,共116页。5.1.ARM汇编语言的伪操作(cozu) 、宏指令和伪指令 ARM汇编语言源程序中语句一般由指令(zhlng)、伪操作、宏指令(zhlng)和伪指令(zhlng)组成. 伪指令(zhlng)也是

4、ARM汇编语言程序里的一些特殊指令(zhlng)助记符,它们不是真正的ARM指令(zhlng)或Thumb指令(zhlng),也不在计算机运行期间由机器执行,而是在源程序进行汇编时被替换成相应的ARM指令(zhlng)或Thumb指令(zhlng)序列,从而实现真正的指令(zhlng)操作. 第4页/共115页第四页,共116页。5.1.ARM汇编语言(hu bin y yn)的伪操作 、宏指令和伪指令 ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令组成. 伪操作和宏指令一般与编译程序有关,在不同的编译环境下有不同的编写形式和语法规则.常见的ARM编译开发环境有2种: ARM公司

5、(n s)开发的ADS/SDT IDE开发环境 集成了GNU开发工具的IDE开发环境 第5页/共115页第五页,共116页。 ARM汇编语言(hu bin y yn)伪指令 ARM伪指令 ARM伪指令不属于ARM指令集中的指令,是为了编程方便(fngbin)而定义的。伪指令可以像其它ARM指令一样使用,但在编译时这些指令将被等效的ARM指令代替。ARM伪指令有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。 第6页/共115页第六页,共116页。 ARM伪指令小范围(fnwi)的地址读取 ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在

6、汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适(hsh)的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。ADRcond register,exprADR伪指令格式(g shi)指令执行的条件码加载的目标寄存器地址表达式 地址表达式expr的取值范围:当地址值不是字对齐时,其取值范围为-255255字节;当地址值是字对齐时,其取值范围为-10201020字节;当地址值是16字节对齐时,其取值范围将更大;该地址必须与ADR伪指令在同一个代码段中。第7页/共115页第七页,共116页。 ARM伪指令中等范围(fnwi

7、)的地址读取 ADRL伪指令将基于PC相对(xingdu)偏移的地址值或基于寄存器相对(xingdu)偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址 。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。ADRLcond register,exprADRL伪指令格式(g shi)指令执行的条件码加载的目标寄存器地址表达式 地址表达式expr的取值范围:当地址值不是字对齐时,其取值范围为-64K64K;当地址值是字对齐时,其取值范围为-256K256K;当地址值是16字节对齐时,其取值范围将更大;该地址必须与ADRL

8、伪指令在同一个代码段中 。第8页/共115页第八页,共116页。 ARM伪指令大范围(fnwi)的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替(dit)该LDR伪指令,否则汇编器将常量放入文字池(即数据缓冲区),并使用一条基于PC相对偏移的LDR指令从文字池读出该常量。LDRcond register,=exprLDR伪指令格式(g shi)指令执行的条件码加载的目标寄存器基于PC的地址表达式或外部表达式第9页/共115页第九页,共116页

9、。 ARM伪指令大范围(fnwi)的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时 , L D R 伪 指 令 被 编 译 器 替 换 成 一 条 合 适 的 指 令 。 若 加 载 的 常 数 未 超 出(choch)MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条基于PC相对偏移的LDR指令从文字池读出常量。应用(yngyng)示例(源程序): . LDR R1,=InitStack .InitStack MOV R0, LR .使 用 伪 指 令 将 程 序 标 号InitStack的地址存

10、入R1第10页/共115页第十页,共116页。 ARM伪指令大范围(fnwi)的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数(chngsh)未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条基于PC相对偏移的LDR指令从文字池读出常量。应用(yngyng)示例(源程序):编译后的反汇编代码: . LDR R1,=InitStack .InitStack MOV R0, LR . .0 x60 LDR R1,0 xb4 .0 x84 MO

11、V R0, LR .0 xb4 DCD 0 x84使 用 伪 指 令 将 程 序 标 号InitStack的地址存入R1地址程序代码第11页/共115页第十一页,共116页。 ARM伪指令大范围(fnwi)的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适(hsh)的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条基于PC相对偏移的LDR指令从文字池读出常量。应用(yngyng)示例(源程序):编译后的反汇编代码: . LDR R1,=In

12、itStack .InitStack MOV R0, LR . .0 x60 LDR R1,0 xb4 .0 x84 MOV R0, LR .0 xb4 DCD 0 x84使 用 伪 指 令 将 程 序 标 号InitStack的地址存入R1LDR伪指令被汇编成一条LDR指令,并在文字池中定义了一个常量,该常量为InitStack标号的地址第12页/共115页第十二页,共116页。 ARM伪指令大范围(fnwi)的地址读取 LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条(y tio)合适的指令。若加载的常数未超出MOV或MVN的范

13、围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条(y tio)基于PC相对偏移的LDR指令从文字池读出常量。注意:1.从指令位置到文字(wnz)池的偏移量必须小于4KB;2.与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。第13页/共115页第十三页,共116页。 ARM伪指令空操作(cozu)伪指令 NOP伪指令在汇编时将会被代替(dit)成ARM中的空操作,比如可能是“MOV R0,R0”指令等。NOP可用于延时操作。NOPNOP伪指令格式(g shi)应用示例(延时子程序):Delay NOP; ;空操作空操作 NOP NOP SUBS R

14、1,R1,#1; ;循环次数减一循环次数减一 BNE Delay; ;如果循环没有结束,跳转如果循环没有结束,跳转DelayDelay继续继续 MOV PC,LR; ;子程序返回子程序返回第14页/共115页第十四页,共116页。 ADS编译环境下的ARM伪操作(cozu)和宏指令ADS编译环境下的伪操作有如下几种:1、符号定义伪操作 4、框架描述(mio sh)伪操作2、数据定义伪操作、信息报告伪操作3、汇编控制伪操作、其他伪操作第15页/共115页第十五页,共116页。 ARM汇编语言伪操作-符号(fho)定义伪操作全局变量声明(shngmng)GBLA 声明一个全局算术变量(binlin

15、g),并将其初始化为0GBLL 声明一个全局逻辑变量(binling),并将其初始化为FALSEGBLS 声明一个全局字符串,并将其初始化为NULL使用示例使用示例: :GBLA num1GBLL logic_xGBLS string_y符号定义伪操作用于定义ARM汇编程序中的变量,对变量进行赋值以及定义寄存器名称第16页/共115页第十六页,共116页。 ARM汇编语言伪指令-符号(fho)定义伪操作局部变量声明(shngmng)LCLA 声明一个局部(jb)算术变量,并将其初始化为0LCLL 声明一个局部(jb)逻辑变量,并将其初始化为FALSELCLS 声明一个局部(jb)字符串,并将其

16、初始化为NULL使用示例使用示例: :LCLA num1LCLL logic_xLCLS string_y注意:局部变量只能在宏中进行声明和使用.第17页/共115页第十七页,共116页。 ARM汇编语言伪指令-符号定义(dngy)伪操作变量(binling)赋值SETA 给一个全局或局部算术(sunsh)变量赋值SETL 给一个全局或局部逻辑变量赋值SETS 给一个全局或局部字符串变量赋值使用示例使用示例: :num1 SETA 0 xfflogic_x SETL TRUEstring_y SETS “stringtest”注意:在向变量赋值前,必须先声明该变量第18页/共115页第十八页,

17、共116页。 ARM汇编语言(hu bin y yn)伪指令-符号定义伪操作RLIST 为通用寄存器列表定义名称,定义的名称可以在LDM/STM指令中使用.列表中的寄存器以逗号分隔,连续编号(bin ho)的寄存器可以用”-”包括,例如:R7-R9表示寄存器R7、R8、R9使用使用(shyng)(shyng)示例示例: :Reg_list RLIST R0-R4,R6,R7-R9STMFD SP! Reg_list ;将R0-R4,R6,R7-R9的内 ;容压入满降序栈中保存第19页/共115页第十九页,共116页。 ARM汇编语言伪指令-符号定义(dngy)伪操作RN 为寄存器定义(dngy

18、)名称使用使用(shyng)(shyng)示例示例: :SP RN R13 ;将R13的名称定义为SP第20页/共115页第二十页,共116页。 ARM汇编语言伪指令-符号定义(dngy)伪操作CN、CP CN为协处理器的寄存器定义(dngy)名称 CP为协处理器定义(dngy)名称使用使用(shyng)(shyng)示例示例: :power CN 6 ;将协处理器寄存器6的名称定义为powerdmu CP 6 ;将协处理器6的名称定义为dmu第21页/共115页第二十一页,共116页。 ARM汇编语言(hu bin y yn)伪指令-符号定义伪操作DN、SN 、FN DN为一个双精度的VFP

19、寄存器定义(dngy)名称 SN为一个单精度的VFP寄存器定义(dngy)名称 FN为一个FPA浮点寄存器定义(dngy)名称使用使用(shyng)(shyng)示例示例: :height DN 6;将VFP双精度寄存器6名称定义为height width SN 16 ;将VFP单精度寄存器16名称定义为widthlower FN 6 ;将浮点寄存器6名称定义为lower第22页/共115页第二十二页,共116页。 ARM汇编语言伪指令-数据(shj)定义伪操作LTORG伪操作用于数据缓冲池(也称为文字池)的开始在使用伪指令LDR时,常常需要在适当的地方加入LTORG声明(shngmng)数据

20、缓冲池,LDR加载的数据暂时放于数据缓冲池LTORG伪操作通常放在无条件跳转指令之后,或者(huzh)子程序返回指令之后,这样处理器就不会错误地将数据池中的数据当做指令来执行用LTORG伪指令定义数据缓冲池举例Funel ;子程序LDR R1, =0 x8000;将0 x8000加载到R1MOV PC, LR LTORG ;定义数据缓冲池,存放0 x8000Data SPACE 40 ;从当前位置开始分配40字节的内存 ;单元,并初始化为0第23页/共115页第二十三页,共116页。 ARM汇编语言伪指令-数据定义(dngy)伪操作MAPMAP用于定义一个结构化的内存表的首地址此时,内存表的位

21、置计数器设置成该地址值.该伪操作可以(ky)用”代替.MAP伪操作举例MAP fun ;fun就是内存(ni cn)表的首地址MAP 0 x100 ,R9 ;内存(ni cn)表的首地址为R9 0 x100 第24页/共115页第二十四页,共116页。 ARM汇编语言伪指令-数据(shj)定义伪操作FIELDFIELD用于定义一个结构化内存表中的数据域MAP伪操作和FIELD伪操作配合使用来定义结构化的内存表结构 MAP伪操作定义内存表的首地址, FIELD伪操作定义内存表中各数据域的字节长度,并可为每一个数据域指定一个标号,其他(qt)指令可引用该标号该伪操作可以用”#”代替.题目:定义一个

22、内存表,其首地址为固定地址8192,该内存表中包含(bohn)个数据域:consta长度为4字节,constb长度为4字节,x长度为8字节,y长度为8字节,string长度为16字节第25页/共115页第二十五页,共116页。 MAP 8192 consta FIELD 4 constb FIELD 4 x FIELD 8 y FIELD 8 string FIELD 16第26页/共115页第二十六页,共116页。 ARM汇编语言(hu bin y yn)伪指令-数据定义伪操作SPACE SPACE伪操作常常(chngchng)用来分配一块连续的内存区域供程序使用,并且将这个内存区域初始化为

23、0,该伪操作可以用”%”代替.使用使用(shyng)(shyng)示例示例: :dataroom SPACE 256 ;以dataroom为起始地址,分配 256 ;字节的内存单元,并初始化为0第27页/共115页第二十七页,共116页。 ARM汇编语言伪指令-数据(shj)定义伪操作DCB DCB用于定义并初始化1字节或多字节的内存区域.该伪操作(cozu)可以用”=”代替.使用使用(shyng)(shyng)示例示例: :data1 DCB 1,3,5string DCB “hello!”,() ;构造一个以NULL结尾的字符串,字 ;符串的起始地址为string第28页/共115页第二十

24、八页,共116页。 ARM汇编语言伪指令-数据(shj)定义伪指令DCD、DCDU DCD和DCDU用于定义并初始化一个或多个字的内存区域,其中(qzhng)DCD可以用”&”代替.DCD和DCDU的区别在于DCD可以保证分配的内存单元是严格的字对齐的,而DCDU不能保证.使用使用(shyng)(shyng)示例示例: :data1 DCD 0,2,4,6 ;其中0,2,4,6按字存储data2 DCDU 1,3,5第29页/共115页第二十九页,共116页。 ARM汇编语言(hu bin y yn)伪指令-数据定义伪操作DCDO DCDO用于定义并初始化一个或多个(du )字的内存区域,且保

25、证分配的内存单元是字对齐的. label DCDO expr,expr DCDO与DCD的区别在于DCDO将字单元初始化为expr相对于静态基址寄存器R9(SB)的偏移量.使用使用(shyng)(shyng)示例示例: :IMPORT externlabeldata1 DCDO externlabel ;将地址为data1的字单元初 ;始化为标号externlabel相对于R9的偏移量第30页/共115页第三十页,共116页。 ARM汇编语言伪指令-数据定义(dngy)伪操作DCFD,DCFDU,DCFS,DCFSU DCFD用于为双精度的浮点数分配字对齐的内存单元(dnyun),每个双精度浮

26、点数占据两个字单元(dnyun). DCFDU与DCFD的不同之处在于DCFDU分配的内存单元(dnyun)不能保证是严格对齐的. DCFS用于为单精度的浮点数分配字对齐的内存单元(dnyun),每个单精度浮点数占据1个字单元(dnyun). DCFSU与DCFS的不同之处在于DCFSU分配的内存单元(dnyun)不能保证是严格字对齐的.第31页/共115页第三十一页,共116页。 ARM汇编语言伪指令-数据(shj)定义伪操作DCI DCI用于分配并初始化一段内存单元,且认为内存单元中的数值为指令数据当DCI位于ARM代码(di m)中的时候,分配的内存是严格字对齐的,当DCI位于Thumb

27、代码(di m)中的时候,分配的内存是半字对齐的注意:DCI伪操作和DCD伪操作非常类似,不同之处在于,DCI分配的内存中数据被标识为指令,可用于通过宏指令来定义处理器指令系统不支持的指令第32页/共115页第三十二页,共116页。 ARM汇编语言伪指令-数据(shj)定义伪操作DCQ,DCQU DCQ用于分配(fnpi)一段以双字(字节)为单位的内存,分配(fnpi)的内存要求必须字对齐,并用伪操作中的64位的整数数据初始化DCQU与DCQ的不同之处在于,DCQU分配(fnpi)的内存单元并不严格字对齐第33页/共115页第三十三页,共116页。 ARM汇编语言伪指令-数据定义(dngy)伪

28、操作DCW,DCWU DCW用于分配一段半字对齐的半字内存单元(dnyun),并用伪操作中的expr初始化DCWU与DCW的不同之处在于,DCWU分配的内存单元(dnyun)并不严格半字对齐第34页/共115页第三十四页,共116页。 ARM汇编语言(hu bin y yn)伪指令-汇编控制伪操作IF、ELSE、ENDIF IF,ELSE及ENDIF伪操作能够根据条件把一段源代码包括在汇编语言程序内,或者将其排除在程序之外它与语言中的if语句的功能很相似语法格式如下(rxi):IF conditionInstruction or derectivesELSEInstruction or der

29、ectivesENDIF注意:condition表示控制条件,可以是逻辑表达式或标识符Instruction or derectives 表示一组语句,可以是代码指令或伪指令注意: IF,ELSE及ENDIF可以嵌套使用第35页/共115页第三十五页,共116页。 ARM汇编(hubin)语言伪指令-汇编(hubin)控制伪操作WHILE及WEND WHILE及WEND伪操作能够根据条件重复汇编相同(xin tn)的一段源代码,它与语言中的while语句很相似只要满足条件,就将重复汇编语法格式中的指令或伪指令注意: WHILE及WEND可以嵌套使用第36页/共115页第三十六页,共116页。

30、ARM汇编语言伪指令-汇编控制(kngzh)伪操作MACRO、MEND及MEXIT MACRO伪操作标识(biozh)宏定义的开始,MEND标识(biozh)宏定义的结束MEXIT用于从宏中跳转出去用MACRO和MEND定义的一段代码,称为宏定义体,这样在程序中就可通过宏名多次调用该代码段来完成相应的功能第37页/共115页第三十七页,共116页。 MACRO$label macroname $parameter ;宏代码 MEND第38页/共115页第三十八页,共116页。局部变量定义举例MACRO;声明一个宏$ label message $ a ;宏的原型(yunxng),宏的名称为 ;

31、message,有一个参数$ aLCLS string ;声明一个局部串变量stringString SETS “error” ;向该变量赋值$ label ;代码INFO 0,”string”:CC: : STR: $ a ;使用该串变量MEND ;宏定义结束第39页/共115页第三十九页,共116页。 ARM汇编语言伪指令-信息(xnx)报告伪操作信息报告伪操作用于汇编(hubin)报告指示 ASSERTASSERT为断言错误伪操作,在汇编编译器对汇编程序的第遍扫描中,如果ASSERT中的条件不成立,则ASSERT伪操作将报告该错误信息ASSERT伪操作用于保证源程序被汇编时满足(mnz)

32、相关的条件如果条件不满足(mnz),则ASSERT伪操作报告错误类型,并终止汇编第40页/共115页第四十页,共116页。 ARM汇编语言伪指令-信息(xnx)报告伪操作INFO汇编诊断信息显示(xinsh)伪操作在汇编处理过程的第遍扫描或者第遍扫描时,INFO伪操作报告诊断信息INFO伪操作用于显示(xinsh)用户自定义的错误信息 INFO 数字表达式,字符串表达式(即诊断信息) 若 数字表达式=0,第遍扫描时,打印字符串. 若数字表达式0,第1遍扫描时,打印字符串,终止汇编.OPT设置(shzh)列表选项伪操作,通过OPT伪操作可在源程序中设置(shzh)列表选项第41页/共115页第四

33、十一页,共116页。 ARM汇编语言(hu bin y yn)伪指令-信息报告伪操作TTL及SUBTTTL伪操作在列表文件每一页的开头插入一个标题该TTL伪操作将作用于其后的每一页,直到遇到新的TTL伪操作SUBT伪操作在列表文件每一页的开头插入一个子标题,该SUBT伪操作将作用于其后的每一页,直到遇到新的SUBT伪操作TTL伪操作在列表文件的页顶部显示一个标题SUBT伪操作在列表文件页标题的下面(xi mian)显示一个子标题如果要在列表文件的第一页显示标题或子标题,TTL伪操作或SUBT伪操作要放在源程序的第行当使用TTL或SUBT伪操作改变页标题时,新的标题将在下一页开始起作用TTL T

34、itle;在列表文件的第一页及后面在列表文件的第一页及后面(hu mian)的各页显示标题的各页显示标题SUBT Subtitle;在列表文件的第一页及后面;在列表文件的第一页及后面(hu mian)的各页显示的各页显示 ;子标题子标题第42页/共115页第四十二页,共116页。 ARM汇编语言(hu bin y yn)伪指令-其他伪操作CODE16及CODE32 CODE16伪操作告诉汇编编译器后面的指令序列(xli)为16位的Thumb指令; CODE32伪操作告诉汇编编译器后面的指令序列(xli)为32位的ARM指令注意:只是告诉编译器后面指令的类型,该伪操作本身并不进行程序状态的切换第

35、43页/共115页第四十三页,共116页。 ARM汇编语言(hu bin y yn)伪指令-其他伪操作EQU 为数字(shz)常量或标号定义一个字符名称,该伪指令可以用”*”代替.使用使用(shyng)(shyng)示例示例: :num EQU 2 ;数字常量num的值为2label_a EQU 0 x20 ;表示标号label_a的地址为0 x20 第44页/共115页第四十四页,共116页。 ARM汇编语言(hu bin y yn)伪指令-其他伪操作AREA 用于定义一个代码段或数据段,一个汇编程序(hu bin chn x)至少包含一个代码段使用使用(shyng)(shyng)示例示例:

36、 :AREA Example,CODE,READONLY定义了一个代码段,代码段的名称为Example,属性为READONLY第45页/共115页第四十五页,共116页。 ARM汇编语言(hu bin y yn)伪指令-其他伪操作ENTRY 用于指定(zhdng)程序的入口点一个程序可含多个源文件,而一个源文件中最多只能有一个ENTRY(也可以没有),所以一个程序可有多个ENTRY ,但至少要有一个ENTRYENDEND伪操作告诉编译器已经到了源程序结尾每一个汇编源程序都包含END伪操作,表示(biosh)本源程序的结束第46页/共115页第四十六页,共116页。 ARM汇编语言(hu bin

37、 y yn)伪指令-其他伪操作ALIGN ALIGN伪操作(cozu)通过添加补丁字节使当前位置满足一定的对齐方式. ALIGN expr ,offset 为指定对齐方式,可能(knng)的取值为的次幂,如1,2,4,8如果没有指定,则默认当前位置对齐到下一个字边界处不指定表示将当前位置对齐到以expr为单位的起始位置第47页/共115页第四十七页,共116页。 ARM汇编语言伪指令-其他(qt)伪操作ALIGN ALIGN伪操作通过添加补丁字节使当前位置满足一定(ydng)的对齐方式.例如:ALIGN 8 表示将当前位置以个字的方式对齐(du q),ALIGN 4, 3 当原始位置在0 x0

38、001(字节),使用 ALIGN 4, 3以后,当前位置会转到 0 x0007(0 x0004+3)第48页/共115页第四十八页,共116页。 ARM汇编语言(hu bin y yn)伪指令-其他伪操作EXPORT及GLOBAL EXPORT声明一个符号(fho)可被其他文件引用,相当于声明了一个全局变量GLOBAL 是EXPORT的同义词注意:声明的符号(fho)名称是区分大小写的第49页/共115页第四十九页,共116页。 ARM汇编语言伪指令-其他(qt)伪操作IMPORTIMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能(knng

39、)引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中IMPORT symbol WEAK指定这个选项后,如果symbol在所有源文件中都没有被定义,编译器也不会产生任何(rnh)错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号Symbol为声明的符号名称,它是区分大小写的第50页/共115页第五十页,共116页。 ARM汇编语言伪指令-其他(qt)伪操作EXTERNEXTERN伪操作(cozu)告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,与IMPORT不同之处在于,如果本源文件没有

40、实际引用该符号,该符号将不会被加入到本源文件的符号表中EXTERN symbol WEAK指定(zhdng)这个选项后,如果symbol在所有源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号Symbol为声明的符号名称,它是区分大小写的第51页/共115页第五十一页,共116页。 ARM汇编语言伪指令-其他(qt)伪操作GET及INCLUDE GET伪操作将一个(y )源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理,INCLUDE是同义GET filename ;其中filename为被包含的源文件的名称,

41、 ;这里可使用路径信息第52页/共115页第五十二页,共116页。 ARM汇编语言(hu bin y yn)伪指令-其他伪操作INCBIN INCBIN伪操作将一个文件包含到当前源文件中,被包含的文件不进行汇编处理通常可使用INCBIN将一个可执行文件或者任意的数据包含到当前文件中被包含的执行文件或数据将被原封不动地放到当前文件中,编译器从INCBIN伪操作后面开始继续处理INCBIN filename ;其中(qzhng)filename为被包含的文件名 ;称,这里可使用路径信息 INCBIN file1.datINCBIN c:windowsfile2.txt注意:这里所包含注意:这里所包

42、含(bohn)的文件名称及其路径信息中都的文件名称及其路径信息中都不能有空格不能有空格第53页/共115页第五十三页,共116页。 ARM汇编语言伪指令-其他(qt)伪操作KEEP KEEP伪操作告诉编译器将局部符号包含在目标文件中符号表中可使调试工作更加方便语法格式如下:KEEP symbol ;其中symbol为要保留(boli)的局部标号,如果没有指定symbol,则除了基于寄存器外的所有符号将被包含在目标文件的符号表中label CMP R0 ,R1KEEP label ;将标号label包含(bohn)到目标文件;的符号表中第54页/共115页第五十四页,共116页。 ARM汇编语言

43、(hu bin y yn)伪指令-其他伪操作NOFP 使用NOFP伪操作禁止源程序中包含浮点运算指令当系统中没有硬件或软件仿真代码支持浮点运算指令时,使用NOFP伪操作禁止在源程序中使用浮点运算指令这时如果源程序中包含浮点运算指令,或者在浮点运算指令的后面使用NOFP伪操作,编译器将会报告(bogo)错误第55页/共115页第五十五页,共116页。 ARM汇编语言伪指令-其他(qt)伪操作REQUIRE REQUIRE伪操作用于指定段之间的相互依赖关系格式如下:REQUIRE label ;其中label为所需要的标号的名称(mngchng)当进行连接处理包含有“REQUIRE label”伪

44、操作的源文件时,定义label的源文件也将被包含 第56页/共115页第五十六页,共116页。 ARM汇编语言(hu bin y yn)伪指令-其他伪操作REQUIRE8及PRESERVE8 REQUIRE8伪操作(cozu)指示当前代码中要求数据栈字节对齐PRESERVE8伪操作(cozu)表示当前代码中数据栈是字节对齐的使用说明:LDRD及STRD指令要求内存单元地址是字节对齐的当在程序中使用这些指令在数据栈中传送数据时,要求该数据栈是字节对齐的,这时就需要用REQUIRE8伪操作(cozu)来说明链接器要保证要求字节对齐的数据栈代码只能被数据栈是字节对齐的代码调用第57页/共115页第五

45、十七页,共116页。 ARM汇编语言伪指令-其他(qt)伪操作ROUT ROUT伪操作用于定义局部变量的有效范围语法格式如下(rxi):name ROUT ;其中name为所定义的作用范围的名称使用说明:当没有使用ROUT伪操作定义局部变量的作用范围时,局部变量的作用范围为其所在的段ROUT伪操作作用的范围为本ROUT 伪操作和下一个ROUT(指同一个段中ROUT伪操作)伪操作之间若只有一个ROUT,则局部标号的作用范围在ROUT与段结束伪操作(END)之间第58页/共115页第五十八页,共116页。 ARM汇编语言(hu bin y yn)伪指令-其他伪操作ROUT ROUT伪操作(cozu

46、)举例Routine ROUT ;定义局部(jb)标号的有效范围,名称为routine .1 routine ;routine范围内的局部(jb)标号 . BEQ %2 routine;若条件成立,则跳转到routine范围内的局部(jb)标号2 . BGE %1 routine ;若条件成立,则跳转到routine范围内的局部(jb)标号1 .2 routine . ;routine范围内的局部(jb)标号2 .otherroutine ROUT ;定义新的局部(jb)标号的有效范围第59页/共115页第五十九页,共116页。 GNU编译环境下的ARM伪操作(cozu)与宏指令 针对上述所讲

47、的ARM伪操作,对应地给出了常用的GNU编译环境下的伪操作1、常量(chngling)编译控制伪操作2、字符编译控制伪操作3、汇编程序代码控制伪操作4、宏编译控制伪操作5、条件编译控制伪操作6、反汇编代码控制伪操作7、其他常用伪操作第60页/共115页第六十页,共116页。 GNU编译环境(hunjng)下的ARM伪指令-常量编译控制伪操作.byte .byte伪操作用于分配(fnpi)一段字节内存单元(分配(fnpi)的内存都是字节对齐的),并用伪指令中的expr初始化语法格式如下:byte expr ,expr. 其中expr可以为数字(shz)表达式或程序中的标号byte 21,48,8

48、9,0 x13,oxFF第61页/共115页第六十一页,共116页。 GNU编译环境下的ARM伪指令-常量(chngling)编译控制伪操作.hword及.short .hword及.short都是作用于分配一段半字内存单元(dnyun)(分配的内存都是半字对齐的),并用伪指令中的expr初始化语法格式如下: hword expr ,expr. 其中expr可以(ky)为数字表达式或程序中的标号 hword 21,48,89,0 x1133,ox77FF第62页/共115页第六十二页,共116页。 GNU编译(biny)环境下的ARM伪指令-常量编译(biny)控制伪操作.word、.long

49、及.int .word、 .long 及.int伪操作(cozu)用于分配一段字内存单元(分配的内存都是字对齐的),并用伪指令中的expr初始化语法格式如下(rxi): word expr ,expr. 其中expr可以为数字表达式或程序中的标号 word 21, 0 x110033,ox77FF2255. int 17, 0 x77889933. long 1,2,3,4,5,6,7,8第63页/共115页第六十三页,共116页。 GNU编译环境下的ARM伪指令-常量编译控制(kngzh)伪操作.ascii .ascii伪指令用于定义(dngy)字符串expr(非0结束符)语法(yf)格式如

50、下: ascii expr ,expr. ascii “How are you” /*定义字符串,不是以“0”结束 */.asciz及.string.asciz和.string伪指令都是用于定义字符串expr(以“/0”结束).asciz expr ,expr. .asciz“am a student” /*定义字符串,以“0”结束*/ 第64页/共115页第六十四页,共116页。 GNU编译环境(hunjng)下的ARM伪指令-常量编译控制伪操作.float及.single .float和.single伪操作(cozu)用于定义32位IEEE浮点数expr语法格式(g shi)如下: flo

51、at expr ,expr. float 0F3.14,0F359.2E11.double.double伪操作用于定义64位IEEE浮点数expr.double expr ,expr. .double 0F2E1 第65页/共115页第六十五页,共116页。 GNU编译环境下的ARM伪指令-常量(chngling)编译控制伪操作.fill .fill伪指令用于分配一段字节(z ji)内存单元语法格式如下: fill repeat ,size (,value) 其中(qzhng)size缺省为, value缺省为 fill 8,4,0 xFFFFFFFF 分配个字节的内存单元,并将每个内存单元内

52、容初始化为0 xFFFFFFFF第66页/共115页第六十六页,共116页。 GNU编译环境(hunjng)下的ARM伪指令-常量编译控制伪操作.zero .zero伪操作用于分配一段字节内存单元(dnyun)并用来填充内存语法格式如下(rxi): zero size fill 400 分配400字节的内存单元,并用0初始化 第67页/共115页第六十七页,共116页。 GNU编译环境下的ARM伪指令-常量编译控制(kngzh)伪操作.space及.skip .space与.skip伪操作用于分配(fnpi)一段内存单元用value将内存单元初始化若value缺省,则用0初始化内存单元,语法格

53、式如下: space size ,value skip size ,value 举例.space 10 0XFF /*分配10字节的内存单元(dnyun),并用0XFF初始化*/.skip 22/*分配22字节的内存单元(dnyun),并用0初始化*/第68页/共115页第六十八页,共116页。 GNU编译环境下的ARM伪指令-字符编译控制(kngzh)伪操作.equ及.set .equ和.set伪操作(cozu)用于为数字常量,基于寄存器的值和程序中的标号定义一个字符名称语法格式如下:.equ symbol ,expr .set symbol ,expr 其中:expr为基于寄存器的地址(d

54、zh)值、程序中的标号,32位的地址(dzh)常量或者32位的常量,symbol为.equ伪指令作为expr定义的字符名称equ PLLCON ,0 x01D80000 /*对PLL控制器设置*/equ CLKCON ,0 x01d80004 /*对时钟控制器设置*/第69页/共115页第六十九页,共116页。 GNU编译环境下的ARM伪指令-字符(z f)编译控制伪操作.global及.globl .global和.globl声明一个(y )符号可被其他文件引用,相当于声明了一个(y )全局变量语法格式如下:global symbol其中(qzhng):symbol为声明的符号名称,它是区分

55、大小写的.extern .extern伪操作用于声明一个符号可被其他文件引用,相当于声明了一个全局变量第70页/共115页第七十页,共116页。 GNU编译环境下的ARM伪指令-汇编程序代码控制(kngzh)伪操作.section .section伪操作用于定义域中包含的段段可以是.text(只读代码(di m)区),.data(可读写数据区)及.bss(为静态和全局变量保留的可读写的数据区)语法(yf)格式如下:.section expr. section .bss第71页/共115页第七十一页,共116页。 GNU编译环境下的ARM伪指令-汇编程序(hu bin chn x)代码控制伪操作

56、.text、.data及.bss . text伪操作(cozu)将操作(cozu)符开始的代码编译到代码段或代码段子段. data伪操作(cozu)将操作(cozu)符开始的数据编译到数据段或数据段子段. bss伪操作(cozu)用于将变量存放到.bss段或.bss段的子段举例:.datasrc:.long 1,2,3,4,5,6,7,8,9,0 /*定义了一个数据区,以src为起始(q sh)地址*/dst:.long 0,0,0,0,0,0,0,0,0,0 /*定义了一个数据区,以dst为起始(q sh)地址*/第72页/共115页第七十二页,共116页。 GNU编译环境下的ARM伪指令-

57、汇编程序代码(di m)控制伪操作.code 16|32 . code伪操作用于选择(xunz)当前汇编指令的指令集参数16选择(xunz)Thumb指令集,参数32选择(xunz)ARM指令集举例:.code 32 /*表明下面(xi mian)是ARM指令*/header: ADR R0, start + 1 BX R0.code 16/*表明下面(xi mian)是Thumb指令*/start: MOV R0, #10 MOV R1, #3 BL doadd第73页/共115页第七十三页,共116页。 GNU编译环境下的ARM伪指令-汇编程序代码控制(kngzh)伪操作.end 标记汇编

58、文件的结束(jish)行,即标号后的代码不处理.include用于将一个源文件包含到当前(dngqin)源文件中,一般是将该源文件用到的库文件包含到本源文件中.include “option.a”.include “44b0.h”第74页/共115页第七十四页,共116页。 GNU编译环境下的ARM伪指令-汇编程序代码控制(kngzh)伪操作.align及.balign .align和.balign伪操作用于表示对齐(du q)方式,通过添加填充字节使当前位置满足一定的对齐(du q)方式语法格式如下:.align alignment ,fill ,max其中(qzhng):alignment

59、用于指定对齐方式,可能的取值为的次幂,缺省为fill是填充内容,缺省时用填充max是填充字节数最大值,如果填充字节超过max,就不进行对齐第75页/共115页第七十五页,共116页。 GNU编译环境(hunjng)下的ARM伪指令-宏编译控制伪操作.macro及.endm .macro伪操作标识宏定义的开始,.endm标识宏定义的结束,用.macro 和.endm定义一段代码,称为宏定义体,这样在程序中就可通过(tnggu)宏指令多次调用该代码段语法格式如下:.macro macronameparameter,parameter. /*代码段*/.endm其中(qzhng):macroname

60、为所定义的宏的名称 parameter为宏指令的参数,宏参数的定义可使用逗号分隔.exitm用于提前退出宏第76页/共115页第七十六页,共116页。 GNU编译环境(hunjng)下的ARM伪指令-条件编译控制伪操作.ifdef、.else及.endif .ifdef、.else及.endif伪操作是汇编控制伪操作,当满足某条件时,对一组语句进行(jnxng)编译,当条件不满足时,则编译另一组语句,其中else可以缺省语法格式如下:.ifdef conditionInstruction or derectives.else.endif注意:condition表示控制条件,可以(ky)是逻辑表

61、达式或标识符Instruction or derectives 表示一组语句,可以(ky)是代码指令或伪指令第77页/共115页第七十七页,共116页。 GNU编译环境(hunjng)下的ARM伪指令-反汇编代码控制伪操作.eject 用于在汇编符号列表文件中插入一分页符.list 用于产生汇编列表(从.list到.nolist ).nolist 伪操作用于表示汇编列表结束处.title 语法格式为.title “heading”即使用“heading”作为标题(biot)(位于汇编列表文件中文件名的下一行).sbttl语法格式为.sbttl “heading”即使用“heading”作为子标

62、题(biot)(位于.title标题(biot)的下一行)第78页/共115页第七十八页,共116页。 GNU编译(biny)环境下的ARM伪指令-其他常用伪操作.ltorg .ltorg伪操作用于在当前(dngqin)段(一般是.text段)的当前(dngqin)地址(字对齐地址)产生一个文字池.ltorg一般放在跳转指令的后面.语法格式如下(rxi):.ltorg使用示例:#exit from DRAM/SDRAM self refresh modeLDR R0,=REFRESHSTR R3,R0MOV PC,LR.ltorg第79页/共115页第七十九页,共116页。 GNU编译环境下的

63、ARM伪指令-其他(qt)常用伪操作.req .req伪操作为一个特定的寄存器定义名称,以方便(fngbin)程序员记忆该寄存器的功能.语法格式如下:.req name,expr其中expr为某个寄存器的编码(bin m),name为本伪指令给寄存器定义的名称.使用示例:.req COUNT,7 /*定义寄存器7为COUNT*/第80页/共115页第八十页,共116页。 GNU编译环境下的ARM伪指令-其他(qt)常用伪操作.err .err伪操作(cozu)用于使编译时产生错误报告.print.print伪操作用于打印信息到标准(biozhn)输出.例如:.print “Something

64、is broken”.fail格式为.fail expr.fail伪操作用于汇编文件时产生警告.当expr小于500时产生错误信息,否则产生警告.第81页/共115页第八十一页,共116页。ARMARM汇编程序(hu bin chn x)(hu bin chn x)实例 注意:ADS编译环境下的汇编代码与GNU编译环境下(Embest IDE内部集成GNU的开发工具)有较多不同点,主要是符号及伪操作(cozu)的不同.注释行以/* */代替”;”操作数及运算符号(fho)替换伪操作符替换操作数及运算符替换如下所示ADS下的操作数及运算符GNU下的操作数及运算符LDR PC, PC,#&18LD

65、R PC, PC,#0 x18LDR PC, PC,#&18LDR PC, PC,#0 x18第82页/共115页第八十二页,共116页。伪操作数替换(t hun)如下所示ADS下的伪操作符GNU下的伪操作符INCLUDE.incldueTCLK2 EQU PB25.equ TCLK2,PB25EXPORT.globalIMPORT.externDCD.longIF:DEF:.ifdefELSE.elseENDIF.endif:OR:|:SHLRN.reqGBLA.global第83页/共115页第八十三页,共116页。伪操作数替换(t hun)如下所示ADS下的伪操作符GNU下的伪操作符BU

66、SWIDTH SETA 16.equ BUSEIDTH,16MACRO.macroMEND.endmEND.endAREA Word,CODE,READONLY.textAREA Block,DATA,READWRITE.dataCODE32.armCODE16.thumbLTORG.ltorg%.fillEntryEntry:第84页/共115页第八十四页,共116页。5.2 ARM汇编语言语句(yj)格式 ARM汇编(hubin)中的文件格式: ARM源程序文件可由任意一种文件编辑器来编写程序代码,它一般为文件格式。在ARM程序设计中,常用的源文件可简单分为(fn wi)以下几种,不同种类的文件有不同的后缀名。源程序文件文件名说明汇编程序文件*.S用ARM汇编语言编写的ARM程序或Thumb程序C程序文件*.C用C语言编写的程序代码头文件*.H为了简化源程序,把程序中常用到的常量命名,宏定义,数据结构定义等单独放在一个文件中,一般称为头文件第85页/共115页第八十五页,共116页。5.2 ARM汇编语言(hu bin y yn)语句格式 ARM汇编语言(hu bin y yn)语

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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