《arm汇编快速入门.docx》由会员分享,可在线阅读,更多相关《arm汇编快速入门.docx(16页珍藏版)》请在优知文库上搜索。
1、ARM汇编语言ARM汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令作成.ARM汇编语言的设计根底是汇编伪指令,汇编伪操作和宏指令.伪操作,是ARM汇编语言程序里的一些特别的指令助记符,其作用主要是为完成汇编程序做各种打算工作,在源程序运行汇编程序处理,而不是在计算机运行期间有机器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编完毕,伪操作的使命也就随之消逝.宏指令,是一段独立的程序代码,可以插在程序中,它通过伪操作来定义,宏在被运用之前必需提前定义好,宏之间可以相互调用,也可自己递归调用.通过干脆书写宏名来运用宏.并本具宏指令的格式输入输出参数.宏定义本身不产生代码,只是在调用
2、它时把宏体插入到原程序中.宏与C语言中的子函数形参和实参的调用相像,调用宏时通过实际的指令来代替宏体实现相关的一段代码,但宏的调用与子程序的调用有本质的区分,既宏并不会节约程序的空间,其优点是简化程序代码,提高程序的可读性以及宏内容可以同步修改.伪操作,宏指令一般与编译程序有关,因此ARM汇编语言的伪操作,宏指令在不同的编译环境下有不同的编写形式和规那么.伪指令也是ARM汇编语言程序里的特别助记符,也不在处理器运行期间由机器执行,他们在汇编时将被相宜的机器指令代替成ARM或ThUmb指令,从而实现真正的指令操作.目前常用的ARM编译环境有2种.1. ADS/SDTIDE:ARM公司开发,运用了
3、CodeWarriOr公司的编译器.2. 集成了GNU开发工具的IDE开发环境;它由GNU的汇编器as,穿插汇编器gcc和连接器id组成.ADS编译环境下的ARM伪操作和宏指令,可参考北航出版社的ARM微限制器根底与实践?周立功这里主要讲解并描述ARMGNU常用汇编语言4ARMGNU常用汇编语言介绍4.1 ARMGNU常用汇编伪指令介绍1. abort.abort:停顿汇编.alignabsexpr1,absexpr2:以某种对齐方式,在未运用的存储区域填充值.第一个值表示对齐方式,4,8,16或32.其次个表达式值表示填充的值.2. if.eIse.endif.if.else.endif:支
4、持条件预编译3. incIude.includefile:包含指定的头文件,可以把一个汇编常量定义放在头文件中.4. commmsymbol,Iength:在bss段申请一段命名空间,该段空间的名称叫SymboI,长度为Iength.1.d连接器在连接会为它留出空间.5. data.datasubsection:说明接下来的定义归属于S1.lbSeCtion数据段.6. equ.equsymboI,expression:把某一个符号(SymbOl)定义成某一个值(expression).该指令并不安排空间.7. globaI.globalsymbol:定义一个全局符号,通常是为Id运用.8.
5、ascii.asciistring:定义一个字符串并为之安排空间.9. byte.byteexpressions:定义一个字节,并为之安排空间.10. short.shortexpressions:定义一个短整型,并为之安排空间.11. int.intexpressions:定义y个整型,并为之安排空间.12. long.longexpressions:定义一个长整型,并为之安排空间.13. word.wordexpressions:定义一个字,并为之安排空间,4bytes.14. macro/endm.macro:定义一段宏代码,.macro表示代码的开场,.endm表示代码的完毕.15.
6、reqname.reqregistername:为存放器定义一个别名.16. code,code16132:指定指令代码产生的长度,16表示ThUmb指令,32表示ARM指令.17. Itorg.torg:表示当前往下的定义在归于当前段,并为之安排空间.4.2ARMGNU专有符号1. 表示注释从当前位置到行尾的字符.2. #注释掉一整行3. ;新行分隔符.4. 3操作码1. NOPnop空操作,相当于MOVr,r2. 1.DRIdr,=相当于PC存放器或其它存放器的长转移.3. ADRadr相于PC存放器或其它存放器的小范围转移.ADR1.adrI相于PC存放器或其存放器的中范围转移.5可执行
7、生成说明5.1 Ids文件说明5.1.1 主要符号说明1. OUTPUT.FORMAT(bfdname)指定输出可执行文件格式.2. OUTPUT_ARCH(bfdname)指定输出可执行文件所运行CPU平台3. ENTRY(SymboI)指定可执行文件的入口段5.1.2段定义说明1.段定义格式SECTIONS.段名:(内容)前言:以前用ARM的IDE工具,运用的是ARM标准的汇编语言。现在要运用GMJ的工具,当然要了解一点GMJARM汇编的不同之处。其实特别的简洁,阅读一下文档然后再看看程序就完全可以搞定了,或者你硬着头皮看GNUARv的汇编程序,用不了多少时间你就就可以无师自通了。个人比拟
8、健忘,还是把文档翻译了一下,算是给闩己一个防止遗忘的理由吧。ARM汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令作成.ARM汇编语言的设计根底是汇编伪指令,汇编伪操作和宏指令.目前常用的ARv编译环境有2种:RMSM:ARM公司的IDE中运用了CodeWarrior的编译器,绝大多数windows下的开发者都在运用这一环境,完全根据ARM的规定;GNUARMASM:GNU工具的ARM版本,与ARMASM略有不同;关于CodeWarrirorARM汇编的书和文堂许多,本文假定你已经完全了解ARMASM,这里只说明GNUARM汇编,并针对ARMASM给出说明。本文翻译自:GNURMAsse
9、mblerQuickReference,本人水平有限,错误难免,转载随意,请注明出处。英文原文地址不详。GNUARM汇编快速入门任何汇编行都是如下构造::comment:卜指令Q注释GMJARM汇编中,任何以冒号结尾的都被认为是一个标签,而不肯定非要在一行的开场。下面是一个简洁的例子,这段汇编程序定义了一个add”的函数,该函数返回两个参数的和:.section.text,.globaladdQgivethesymboladdexternallinkageadd:ADDr,r,riaddinputargumentsMOVpc,Irreturnfromsubroutineendofprogram
10、GNUARM汇编伪指令下面列出了一些GUARM汇编伪指令,并给出了相应说明。.ascii”string)”在汇编中定义字符串并为之安排存储空间(与armasm中的DCB功能类似)。.ascizstring”和.ascii类似,但不安排存储空间。.balign,以某种排列方式在内存中填充数值。(该指令与armasm中的A1.IGN类似)。PoWeJOf1.2表示排列方式,其值可为4,8,16或32,单位是byte:fiI1.value是要填充的值:max_Padding最大的填充界限,恳求填充的bytes数超过该值,将被忽视。.byte,定义一个或多个Byte,并为之安排空间(与armasm的D
11、CB类似)。.code设定指令宽度,16表示ThUmb,32表示ARMassembly(和armasm中的CODE16C0DE32一样)0.if.else.endif预编译宏(与armasm中的IFE1.SEENDlF一样)。,end汇编文件完毕标记,经常省略不用。.endm宏完毕标记。.cxitm宏跳出。.macroarg_l)(,(,定义一段名为name的宏,arg_xxx为参数。必需有对应的.endm结尾。可以运用.exitm从中间跳出宏。(与armasm中的MACRO,MEND,MEXIT一样)。在运用宏参数时必需这样运用:“Karg。例如:CODE.macroSHIFT1.EFTa,
12、b.ifb0MOVa,a,ASR#-b.exitm.endifMOVa,a.1.S1.#b.endm.rept循环执行.endr前的代码段number_of_times次。(与armasn中的WEN相像).irp,循环执行.endr前的代码段,param依次取后面给出的值。在循环执行的代码段中必需以表示参数。.endr完毕循环(与armasm中的WEND相像).equ,为一个标号赋值,类似C中的#defineo(与armasm中的EQU-*样).err编译错误报告,将引起编译的终止。.global全局声明标记,这样声明的标号将可以被外部运用。(与armasm中的EXPORT一样)。.hword
13、(,插入一个16-bit的数据队列。(与armasm中的DCW一样).ifdef假如symbol被定义,该快代码将被编译。以.endif完毕。.ifndef假如symbol未被定义,该快代码将被编译。以.endif完毕。.include”包含文件。(与armasm中的INC1.UDE或者C中的#include一样)req定义一个存放器,.req的左边是定义的存放器名,右边是运用的真正运用的存放器。(与armasm中的RN类似)例如:acc.reqrCODE,section,“w开场一个新的代码或数据段tcxl,代码段;.data,初始化数据段;.bss,未初始化数据段。这些段都有缺省的标记(flags),联接器可以识别这些标记。(与armasm中的AREA一样)。下面是E1.F格式允许的段标记标记含义a允许段W可写段X执行段.set,变量赋值。(与armasm中的SETA一样).space,安排number_of_bytes字节的数据空间,并填充其值为fill.byte,假设未指定该值,缺省填充0。(与armasm中的SP.CE功能