資源描述:
《Inline Assembly in GCC Vs VC 》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在學術(shù)論文-天天文庫。
1、InlineAssemblyinGCCVsVC++ByGurvinderSingh,20Oct2003?Introduction?介紹InlineAssemblyisdifferentinVC++andgcc.VCusesIntelsyntaxwhilegccusesAT&Tsyntax.HerewedefinethedifferenceinsyntaxofAT&TandIntel'sassembly.VC++和gcc的內(nèi)聯(lián)匯編是不同的。VC使用intel匯編語法格式,而gcc使用AT&T語法格式。這里我們簡略說說這兩種語法格式的不同。?So
2、urceandDestinationOrdering?原操作數(shù)和目標操作數(shù)的位置順序InAT&Tsyntaxthesourceisalwaysontheleft,andthedestinationisalwaysontherightwhichisoppositeoftheIntel'ssyntax.在AT&T中,原操作數(shù)始終在左邊,目標操作數(shù)始終在右邊。而intel格式中恰恰相反(即原操作數(shù)始終在右邊,目標操作數(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的沒有這個要求。在AT&T中格式,立即數(shù)必須加上前綴"$",而intel的沒有這個要求。在intel格式中,十六進制和二進制格式的立即數(shù)會分別以'h'和'b'為后綴,如果十六進制數(shù)的第一位數(shù)字是字母的話,號必須加上'0'前綴。InAT&Tthein
5、structionsaresuffixedbyb,w,orl,dependingonwhethertheoperandisabyte,word,orlong.ThisisnotmandatoryasGCCtriestoprovidetheappropriatesuffixbyreadingtheoperands.Butitisrecommendedtoprovidethesuffixesasitimprovescodereadabilityanditpreventscompilerfrommakingamistakewhileguessing
6、.TheequivalentformsforIntelisbyteptr,wordptr,anddwordptronlywhenreferencingmemory在AT&T中,會根據(jù)操作數(shù)的大小是字節(jié),雙字節(jié)還是四字節(jié)分別在指令后面加上字母b,w和l。當然,這對以gcc來說不是強制性的,因為gcc可以根據(jù)讀取的操作數(shù)實際大小自動添加合理的后綴。不過,我們還是推薦通過添加后綴來增強程序的可讀性,也避免當編譯器必須猜測操作數(shù)大小時而犯的錯誤。這種方法在intel語法格式中是通過byteptr,wordptr和dwordptr來實現(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