資源描述:
《Inline Assembly in GCC Vs VC 》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、InlineAssemblyinGCCVsVC++ByGurvinderSingh,20Oct2003?Introduction?介紹InlineAssemblyisdifferentinVC++andgcc.VCusesIntelsyntaxwhilegccusesAT&Tsyntax.HerewedefinethedifferenceinsyntaxofAT&TandIntel'sassembly.VC++和gcc的內(nèi)聯(lián)匯編是不同的。VC使用intel匯編語法格式,而gcc使用AT&T語法格式。這里我們簡(jiǎn)略說說這兩種語法格式的不同。?So
2、urceandDestinationOrdering?原操作數(shù)和目標(biāo)操作數(shù)的位置順序InAT&Tsyntaxthesourceisalwaysontheleft,andthedestinationisalwaysontherightwhichisoppositeoftheIntel'ssyntax.在AT&T中,原操作數(shù)始終在左邊,目標(biāo)操作數(shù)始終在右邊。而intel格式中恰恰相反(即原操作數(shù)始終在右邊,目標(biāo)操作數(shù)始終在左邊);AT&TIntelMoveebxtoeaxmovl%ebx,%eaxmoveax,ebxMove100toebxMov
3、l$100,%ebxMovebx,100?Prefixes/SuffixesforregisternamingandImmediateValues?寄存器以及立即數(shù)的前綴和后綴Registernamesareprefixedwith"%"inAT&TwhileinIntelsyntaxtheyarereferencedasis.InAT&Tsyntax$isprefixedtoalltheimmediatevalueswhilenoprefixisrequiredinIntel'sformat.InIntelsyntaxhexadecimal
4、orbinaryimmediatedataaresuffixedwith'h'and'b'respectively.Alsoifthefirsthexadecimaldigitisaletterthena'0'prefixesthevalue.在AT&T格式中,寄存器必須加上前綴"%",而intel的沒有這個(gè)要求。在AT&T中格式,立即數(shù)必須加上前綴"$",而intel的沒有這個(gè)要求。在intel格式中,十六進(jìn)制和二進(jìn)制格式的立即數(shù)會(huì)分別以'h'和'b'為后綴,如果十六進(jìn)制數(shù)的第一位數(shù)字是字母的話,號(hào)必須加上'0'前綴。InAT&Tthein
5、structionsaresuffixedbyb,w,orl,dependingonwhethertheoperandisabyte,word,orlong.ThisisnotmandatoryasGCCtriestoprovidetheappropriatesuffixbyreadingtheoperands.Butitisrecommendedtoprovidethesuffixesasitimprovescodereadabilityanditpreventscompilerfrommakingamistakewhileguessing
6、.TheequivalentformsforIntelisbyteptr,wordptr,anddwordptronlywhenreferencingmemory在AT&T中,會(huì)根據(jù)操作數(shù)的大小是字節(jié),雙字節(jié)還是四字節(jié)分別在指令后面加上字母b,w和l。當(dāng)然,這對(duì)以gcc來說不是強(qiáng)制性的,因?yàn)間cc可以根據(jù)讀取的操作數(shù)實(shí)際大小自動(dòng)添加合理的后綴。不過,我們還是推薦通過添加后綴來增強(qiáng)程序的可讀性,也避免當(dāng)編譯器必須猜測(cè)操作數(shù)大小時(shí)而犯的錯(cuò)誤。這種方法在intel語法格式中是通過byteptr,wordptr和dwordptr來實(shí)現(xiàn)的。AT&TIn
7、telRegisters%eax%ebx%ecxeaxebxecxedx%edxMoveebxtoeaxmovl%ebx,%eaxmoveax,ebxMoveFFinebxmovl$0xff,%ebxmovebx,0ffh?AccessingvariablesfrominsideInlineASM?在內(nèi)聯(lián)匯編中訪問變量Foraccessingvaluesofglobalvariablesanunderscorehastobeprefixedinbothcases.Letssayxisaglobalorstaticvariable.InInte
8、l'sformat_xgivespointertothevariablewhile[_x]givesitsvalue.InAT&Tformat$_xgivesthe