ARM汇编器与GCC汇编器支持的汇编语言差别

上传人:沈*** 文档编号:125615214 上传时间:2022-07-27 格式:DOC 页数:12 大小:182.50KB
收藏 版权申诉 举报 下载
ARM汇编器与GCC汇编器支持的汇编语言差别_第1页
第1页 / 共12页
ARM汇编器与GCC汇编器支持的汇编语言差别_第2页
第2页 / 共12页
ARM汇编器与GCC汇编器支持的汇编语言差别_第3页
第3页 / 共12页
资源描述:

《ARM汇编器与GCC汇编器支持的汇编语言差别》由会员分享,可在线阅读,更多相关《ARM汇编器与GCC汇编器支持的汇编语言差别(12页珍藏版)》请在装配图网上搜索。

1、ARM汇编器与GCC汇编器支持的汇编语言差别将ARMSDT下的汇编代码移植到GCCforARM编译器时,经常要做如下修改:1、注释;=/*/或者/2、伪操作符替换JUMPADDR=JUMPADDR:-符号定义加:INCLUDE=INCLUDEEQU=equTCLK2EQUPB25=equTCLK2APB25TCLK2EQUPB25=equTCLK2APB25DCD=.longwordIF:DEF:=#ifdefined(MACRO_SAMPLE)ELSE=#elseENDIF=#endif:0R:=|:SHL:=Entry:END=.endAREAWord,CODE,READONLY=text

2、AREABlock,DATA,READWRITE=dataCODE32=armC0DE16=thumbLTORG=ltorg%=.fillMACRO=maeroMEND=endmEXPORT=giobalIMPORT=externGBLLGBLA=globalSETLSETA=#define或者.equEQU=#defineGEToptiona=#includeHoption.a?=align3、操作数及运算符号替换Idrpc,pc,#&18替换成ldrpc,pc,#+0x18=u+Oxldrpc,pc,#-&20替换成ldrpc,pc,#-0x20、一&”=-Ox宏及条件编译控制伪操作伪操作

3、语法格式作用macro、xitm及.endm macroacronameparameter,parameter .endm.macro伪操作标识宏定义的开始,.sdm标识宏定义的结束。用.macroVjendm宗审一即什?H.禾宋九屯屯勺lfdef,.else及.endif.lfdefcondition.elseendif当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。其中elsenJ以缺省。问题:请解释卜面的一小段汇编语言程序:_mainEXPORTBootResetBootResetBresetvecreqsetIMPORTBootEntryIMPORT|Image$R

4、O$Limit|AREABOOTROM,CODE,READONLYLDRrO,=|Image?$R0$LimitBEQldrpc,pcr#-&F20回答:上而是ARM公司编译器支持的汇编语言,移植成ges支持的汇编语言为:_mainglobalBootReset/*定义全局符号BootReset*/BootReset:Bresetvecreqset/*跳转到resetvec*/externBootEntry/*定义引用的外部符号(函数严/.externImage_RO_Limit/*Image_RO_Limit为外部符号,一般定义*/*在连接定位文件中.表示ROM区大小/AREABOOTROM

5、,CODE,READONLYLDRrOz=Image_RO_Limit/*将Image_RO_Lim11值存储到R0/BEQFUNCI/*如果等于则跳转到符号FUNC1*/ldrpczpcf#-0xF2O/*将PC-0XF20的值存储到PC*/armtogw的转换的经常需耍改动的地方sdt/ads和gcc支持的at&t格式汇编是有语法上的不同的。gcc的汇编语法,makefile,linkerscriptfile等可以参考uboot的项目在AT&T汇编格式中,寄存器名要加上,帮作为前缀;而在Intel汇编格式中,寄存器名不需要加前缀内嵌汇编语法如下:asm_(汇编语句模板:输出部分:输入部分:

6、破坏描述部分)其中,asm和_dsm_是完全一样的。共四个部分:汇编语句模板,输出部分,输入部分,破坏描述部分,各部分使用:格开,汇编语句模板必不可少,其他三部分可选,如果使用了后而的部分,而前面部分为空,也需要用:格开,相应部分内容为空。例如:asmvolatile(nclin:memory”)汇编基本语法简介在AT&T汇编格式中,寄存器名要加上沁,作为前缀;而在Intel汇编格式中,寄存器名不需要加前缀。例如:AT&T格式Intel格式pushl%eaxpusheax在AT&T汇编格式中,用,$,前缀表示一个立即操作数;而在Intel汇编格式中,立即数的表示不用带任何前缀。例如:AT&T格

7、式Intel格式pushl$1push1AT&T和Intel格式中的源操作数和目标操作数的位置正好相反。在Intel汇编格式中,目标操作数在源操作数的左边:而在AT&T汇编格式中,目标操作数在源操作数的右边。例如:AT&T格式Intel格式addl$1,%eaxaddeaxf1在AT&T汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀,b,、分别表示操作数为字节(byte,8比特)、字(word,16比特)和长字(long,32比特):而在Intel汇编格式中,操作数的字长是用byteptrn和wordptr等前缀來表示的。例如:AT&T格式Intel格式movbval,%almova

8、l,byteptrval在AT&T汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上作为前缀,而在Intel格式中则不需要。远程转移指令和远程子调用指令的操作码,在AT&T汇编格式中为ljump-和nlcalln而在Intel汇编格式中则为njmpfar11和Mcallfar,即:AT&T格式Intel格式1jump$section,$offsetjmpfarsection:offsetlcall$section,$offsetcallfarsection:offset与Z相应的远程返回指令则为:AT&T格式Intel格式lret$stack_adjustretfarstac

9、k_adjust在AT&T汇编格式中,内存操作数的寻址方式是AT&T格式Intel格式section:disp(base,index,scale)section:base+index*scale+disp由J:Linux工作在保护模式卜,用的是32位线性地址,所以在计算地址时不用考虑段基址和偏移屋,而是采用女II卜的地址计算方法:disp+base+index*scale卜而是一些内存操作数的例子:AT&T格式Intel格式movl-4(%ebp),%eaxmoveax,ebp一4movlarray(,%eax,4),%eaxmoveax,eax*4+arraymovwarray(%ebx,%

10、eax,4),%cxmovex,ebx+4*eax+arraymovb$4,%fs:(%eax)movfs:eax,4内嵌汇编格式简介内嵌汇编语法如F:asm(汇编语句模板:输出部分:输入部分:破坏描述部分)其中,asm和asm_是完全一样的。共四个部分:汇编语句模板,输出部分,输入部分,破坏描述部分,各部分使用:格开,汇编语句模板必不可少,其他三部分可选,如果使用了后而的部分,而前面部分为空,也需要用:格开,相应部分内容为空。例如:asmvolatile(c1i:memory)Is汇编语句模板汇编语句模板由汇编语句序列组成,语句2间使用;、n或nt分开。指令中的操作数可以使用占位符引用C语言

11、变量,操作数占位符最多10个,名称如卜:%0,卵,.,約。指令中使用占位符表示的操作数,总被视为long型(4个字节),但对其施加的操作根据指令可以是字或者字节,当把操作数当作字或者字节使用时,默认为低字或者低字节。対字节操作可以显式的指明是低字节还是次字节。方法是在和序号之间插入一个字母,b代表低字节,h代表高字节,例如:%hlo2、输出部分输出部分描述输出操作数,不同的操作数描述符Z间用逗号格开,每个操作数描述符由限定字符串和C语言变最组成。每个输出操作数的限定字符串必须包含=表示他是一个输出操作数。例:asmvolatile(pushfl;popl%0;clin:n=gMx)描述符字符串

12、表示对该变量的限制条件,这样GCC就可以根据这些条件决定如何分配寄存器,如何产生必耍的代码处理指令操作数与C表达式或C变鼠之间的联系。3、输入部分输入部分描述输入操作数,不同的操作数描述符Z间使用逗号格开,每个操作数描述符由限定字符串和C语言表达式或者C语言变最组成。例1:asmvolatile(nlicit%0n:nmHreal_mode_idt);例二(bitops.h):Staticinlinevoidset_bit(intnr,volatilevoid*addr)asm(tsl%lz%0H:n=mH(ADDR)后例功能是将(*addr)的第nr位设为第一个占位符0与C语言变帛二ADDR

13、炖应,第二个占位符1与c语言变Inr対应。因此上面的汇编语句代码与I、而的伪代码等价:btslnrzADDR,该指令的两个操作数不能全是内存变量,因此将址的限定字符串指定为“,将卓与立即数或者寄存器相关联,这样两个操作数中只有ADDR为内存变量。4、限制字符4. K限制字符列表限制字符有很多种,有些是与特定体系结构相关,此处仅列出常用的限定字符和i386中可能用到的一些常用的限定符。它们的作用是指示编译器如何处理其后的c语言变最与指令操作数Z间的关系。分类限定符描述a将输入变量放入eax这里有一个问题:假设eax已经被使用,那怎么办?其实很简单:因为GCC知道eax已经被使用,它在这段汇编代码

14、的起始处插入一条语句pushl%eax,将eax内容保存到堆栈,然后在这段代码结束处再增加一条语句popl%eax,恢复eax的内容b将输入变量放入ebxc将输入变量放入ecx通用寄存器d将输入变量放入edxs将输入变量放入esid将输入变量放入ediq将输入变量放入ecx,ebx,ecx,edx中的一个r将输入变崑放入通用寄存器,也就eaxebx,ecxedxesiedi中的一个A把ecx和edx合成一个64位的寄存器(uselonglongs)m内存变量o操作数为内存变鼠,但是其寻址方式是偏移最类型,也即是基址寻址,或者是基址加变址寻址内存V操作数为内存变量,但寻址方式不是偏移量类型操作数

15、为内存变量,但寻址方式为自动增量P操作数是一个合法的内存地址(指针)寄存器或内存g将输入变量放入eax,ebx,ecx,edx中的一个或者作为内存变量X操作数可以是任何类型I0-31之间的立即数(用于32位移位指令)j0-63之间的立即数(用于64位移位指令)N0-255之间的立即数(用于out指令)立即数1立即数n立即数,有些系统不支持除字以外的立即数,这些系统应该使用5而不是0表示用它限制的操作数与某个指定的操作数匹配,1也即该操作数就是指定的那个操作数,例如0“匹配9去描述“1操作数,那么畀引用的其实就是化0操作数,注意作为限定符字母的09与指令中的0一9的区别,前者描述操作数,后者代表

16、操作数。&该输出操作数不能使用过和输入操作数相同的寄存器=操作数在指令中是只写的(输出操作数)操作数类型+操作数在指令中是读写类型的(输入输出操作数)f浮点寄存器t第一个浮点寄存器u第二个浮点寄存器G标准的80387浮点常数浮点数%该操作数可以和卜一个操作数交换位置例如add丄的两个操作数可以交换顺序(当然两个操作数都不能是立即数)#部分注释,从该字符到其后的逗号之间所有字母被忽略表示如果选用寄存器,则其后的字母被忽略5、破坏描述部分破坏描述符用J:通知编译器我们使用了哪些寄存器或内存,由逗号格开的字符串组成,每个字符串描述一种情况,一般是寄存器名:除寄存器外还有memory。例如:eax,/

17、y%ebxzSmemory等。ARM汇编ReaisterAK:NameUsaoeru31PirstfunctionargumentIntegerrunctfonresultScratchreaisterrl32SecondfunctionargumentScratchregisterr2a3ThirdfunctionargumentScratchreaistcrr3a4FourthtunchonargumentScratchregisterrdV1R.egisfce-rymrimblmr5v2Reoiistervariabler6v3Reoistervariabler7v4Reaisterva

18、riabler8v5Reaistervanabler9v6rfpRegistervanableRealframepofnterrlOsiStacklimitrllfpAroumentpointerrl2PTemporaryworkspacerl3SPStackpointerrL4IrLinkreaisterWorkspacer15puProgramcounter代码示范:#defineBYTESWAP(val)asm_volatileneorr3,%lz%1,ror#16ntnnbicr3,r3,#0x00FF0000ntnnmov%0z%lzror#8ntnneor%0z%0zr3,lsr#8”:n=rn(val):nOn(val):nr3nznccn);CstubfunctionsunsignedlongByteSwap(unsignedlongval)asmvolatileneorr3,%lz%1,ror#16ntnnbicr3,r3,#0x00FF0000ntnnmov%0z%lzror#8ntnneor%0z%0zr3,lsr#8”:n=rn(val)nOn(val)nr3nreturnval;

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