- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
GNU for x86汇编语法
GNU?for?x86汇编语法Using?as?The?GNU?Assembler?January?1994”。Tornado随机文档“GNUToolkit?Users?Guide。
GNUAssembler
80386?Dependent?Features
■?ATT语法vs.?Intel语法
gcc的输出的兼容性,as支持ATTSystem?V/386汇编语法,它和Intel语法有相当大的差别。强调这个是因为几乎所有的80386文档只使用Intel语法。两者之间的显著区别是:
ATT的立即数有前缀$,Intel的立即数没有前缀(Intelpush?4为ATTpush?$4)。ATT的寄存器有前缀%,Intel的寄存器没有前缀。ATT的绝对跳转(和相对PC的跳转相反)jump/call操作数有前缀*,Intel没有前缀。
ATT和Intel语法的源和目的操作数的顺序相反。Intel的addeax,?4等效于ATT的addl,?%eax。使用source,dest规范的目标是为了和以前的Unix汇编器保持兼容。
ATT语法中的内存操作数的宽度是根据操作码名称的最后一个字符决定的。操作码后缀b,w,和l指定了byte(8-bit),word(16-bit),和long(32-bit)的内存引用。Intel语法则对内存操作数(不是操作码)加前缀:byteptr,wordptr和dwordptr。这样,Intelmov?al,?byte?ptr?foo等效于ATT的movbfoo,?$al。
ATT中的longjumps和calls的立即形式为lcall/ljmp$section,?$offset;Intel语法为call/jmpfar?section:offset。同样,ATT的远程返回指令为lret$stack-adjust,而Intel格式为retfar?stack-adjust。
ATT汇编器不提供对多节(multiplesection)程序的支持。Unix风格的系统希望所有的程序都是单节的。
opcode?naming)
b,w,和l指定了byte,word,和long型的操作数。如果指令中没有后缀并且不包含内存操作数,那么as将基于目标寄存器操作数(指令中的最后一个寄存器)填充这个缺少的后缀。所以,mov%ax,?%bx等效于movw%ax,?%bx;同样,mov?,?%bx等效于movw?,?%bx。注意这个特点不和ATT的Unix汇编器兼容,后者假定缺少的后缀为long型操作数宽度。(这个不兼容型并不影响编译器的输出,因为编译器总是显式地指定操作码后缀。)
ATT和Intel中的操作码的格式几乎全部一样,但有一个例外。ATT的符号扩展(signextend)和零扩展(zeroexten)指令需要指定2个宽度,一个宽度用来指定sign/zero扩展的from,另一个用来零扩展to。在ATT语法中使用2个操作码后缀。符号扩展和零扩展的基本名称是movs...和movz...(Intel格式为movsx和movzx)。操作码后缀加在这个基本名称后,from在之前。所以,ATT语法中movxbl%al,?%edx意思为”movesign?extend?from?%al?to?%edx“。所以可能的后缀有bl(从byte到long),bw(从byte到word),和wl(从word到long)。
Intel风格的指令:
cbw?-?符号扩展byte?%al到word%ax,cwde?-?符号扩展word?%ax到long%eax,cwd?-?符号扩展word?%ax到long%dx:%ax,cdq?-?符号扩展dword?%eax到quad%edx:%eax,
ATT中分别叫cbtw,cwtl,cwtd,和cltd。
call/jump指令在ATT中分别为lcall和ljmp,而Intel的格式为callfar和jumpfar。
register?naming)
%。80386的寄存器包括:
8个32-bit寄存器%eax(accumulator),%ebx,%ecx,%edx,%edi,%esi,%ebp(Iframe/Ipointer),和%esp(stackpointer)。8个低16-bit的以上寄存器:%ax,%bx,%cx,%dx,%di,%si,%bp,和%sp。6个节寄存器%cs(代码节),%ds(数据节),%ss(堆栈节),%es,%fs,和%gs。3个处理器控制寄存器%cr0,%cr2,和%cr3。6个调试寄存器%db0,%db1,%db2,%db3,%db6,和%db7。2个测试寄存器%tr6和%tr7。8个浮点寄存器栈%st或等效的%st(0),%st(1),%st(2),
文档评论(0)