arm汇编快速入门.docx
注杼掉整行.3.;新行分隔符.4.3操作码1. NOPnop空掾作,相当干MOV(O,r2. 1.DRIdr<register>,=expression相"i于PC存放号或其它存放器的K找限3. ADRadrregister<label>KU-PC存放静或共它在放号的小费用杆格.ADR1.adrl<register><labd>出IPC存放器或其存放潺的中范国转移.5可执行生成说明5.1IdS文件说明51.1 主器符号说明1. OUTPUT_FoRMAT(bfdname)指定输出可执行文件格式.2. OuTPUT_ARCH(bfdname)指定输出可执行文件所运行CPUF-台3. ENTRY(SymboI)指定可执行文件的人口改5.1.2段定义i明1.段定义格式SECTIONS段名:内容)以前用ARM的IDE工具.运用的是ARM标准的花编悟吉.现在要运用GNU的工具,当然Jg了解一点GNUARM汇编的不同之处.共实特别的简洁.阅谈一下文档然后再行看程序就完全可以黯定了,或打你硬存头皮看GNUARM的汇编程序,用不了多少时间你就就可以无师自通了,个人比拟健忘,还是把文档翻评了一下,律是给门己个防止遗忘的理由吧.ARM汇编语言源程序语甸,一般由指令,伪6作,除指令和伪指令作成.ARMiT编语票的设计极感是汇编伪指令,汇编伪操作和宏指令.目前常用的ARM旧译环境有2种:ARMASM:ARM公司的IDE中运用了COdeWarriOr的编年器.绝大多数WIndOWS下的开发者都在运用这环境,完全根据ARM的规定:GNUARMASM:GNU二具的ARM版本,与ARMASM略有不同:关JCodeWarrirorARM汇编的归和文京许多,本文假定你己经完全了斜ARMASM,这里只说HJJGNUARM汇隔、并针对ARMASM给出说明.本文翻译自GNUARMAssemblerQuickReference.本人水平力限.指误难免.转我的刍,请注明出处.英文媒文地址不详.GNUARM汇快建入门任何汇编行都是如卜构造:<label>:<instructionordirective>commentv标签>:v指令>>注择GNUARM汇编中,任何以日号结尾的都被认为是个标篮,而不附定非要在一行的开场,下面是一个简洁的例子,这段汇辨程序定义/一个"add”的函数,该函数返回两个参数的和:.section.text,"x".globaladd©givethesymboladdexternallinkageadd:ADDr,r,rladdinputargumentsMOVpc,Irreturnfromsubroutine>endofprogramGNUAnf汇伪指令下面列出了一些GNUARM汇编伪指令,弁绐出了相应说明.ascii“<slring>”在汇编中定义字符串并为之安排存储空间与HIlnaSnl中的DCB功能类似)。.asciz4,<string>*和.ascii类似,但不安排存储空间.balign<power_of_2>,<fill-value>,<ma×-padding>以某种排列方式在内存中埴充数值。(该指令与armasm中的A1.lGN类似)。powerof_2表示排列方式,其值可为4,8,16或32,单位是byte:fiI1.value是要填充的值:max_Padding最大的填充界限,恳求填充的bytes数§1过该假,将被忽视.byte<bytcl>,<byte2>定义个或多个Byte,并为之安排空间(与armasm的DCB类似).code<numberof_bits>设定指令宽度,16表示ThUmb,32表示ARMassembly(和armasm中的CODE16,CODI32一样.if.else.endif预编译宏(与armasm中的IFE1.SEENDIF一样),end汇编文件完毕标记,经常省略不用。.ends宏完毕标记.CXitm宏跳出.macro<na11e><argI),<arg2>)(,<argN>)定义一段名为name的宏,arg_xxx为参数O必需有对应的cndm结尾。可以运用.exltm从中间跳出宏.(与armasm中的MACRO,MEND,MEX11一样).在运用宏参数时必需这样运肋”varg>"。例如:CODE.macroSHIFT1.EFTa,b,ifb<0MOVa,a,ASR#-b.e×ltm.endifMOVa,a,1.S1.#b.edm,rept<number_of_times>循环执行.endr前的代码段numberof_times次。(与armasm中的IEN相像).irp<param>,<vall>(,<val2>)循环执行endr的的代码段PaQm依次取后面给出的值。在循环执行的代码段中必需以、<param>”丧示您数.,endr完毕循环(与armasm中的WEND相像).equ<symbolname>,<value>为一个标号赋值,类似C中的#define.(与armasm中的EQU一样).err编译错误报告,将引起编译的终止.global<synbol>全局声明标记,这样声明的标号将可以被外部运用.(与armasm中的EXPORT一样)。.hword<shortl><,<short2>.插入一个16-bit的数据队列,(与armasm中的DCW一样).ifdef<symbol>假如symbol被定义,该快代码将被编译。以.endif完毕。.ifndef<symbol>假如<sy三bol未被定义,该快代码将被编译.以.endif完毕。.include包含文件。(与armasm中的INC1.UDE或者C中的#include一样)<registername>.req<registern<me>定义个存放器,.req的左边是定义的存放器名,右边是运用的真正运用的存放器.与armasm中的RN类似)例如:acc.reqrCODE.section<section_name><,<flags>,开场一个新的代码或数据段,.text,代码段;.data,初始化数据段;.bss,未初始化数据段.这些段都有缺省的标记fags),联接错可以联别这些标记.(IjarmaSm中的AREA佯).下面是E1.F格式允许的段标记<标记>含义a允许段w可写段X执行段.set<variablen<me>,<variablevalue>变址赋值。(与armasm中的SETA-样).space<numberof_bytes>(,<fi1l_byte>安排numberof.bytes字节的数据空间,并填充其值为fiIlJyte,假设未指定该值,缺省填充0。(与a1111asrn中的SPACE功能样).word<wordl><,<word2>.插入个32-bit的数据队列.(与armasm中的DCD功能一样)GNUAHf汇"转别字符和法代码行中的注糅符号:'<§>'整行注择符号:语句别离符号:干脆操作数前缀:、#'或'$'.arm以arm格式编用.同COde32.thumb以thumb格式编译,jcode16.code16以thumb格式编课.code32以arm格式编译K后语,更具体的运用说明请参照:ARMArchitectureReferenceManual,Addison-WesleyISBN0-201-73719-1