`
cloudtech
  • 浏览: 4578129 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

GCC内联汇编入门

 
阅读更多
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 12"> <meta name="Originator" content="Microsoft Word 12"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ctutu%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"> <link rel="themeData" href="file:///C:%5CDOCUME%7E1%5Ctutu%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx"> <link rel="colorSchemeMapping" href="file:///C:%5CDOCUME%7E1%5Ctutu%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml"> <!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:DontVertAlignCellWithSp/> <w:DontBreakConstrainedForcedTables/> <w:DontVertAlignInTxbx/> <w:Word11KerningPairs/> <w:CachedColBalance/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="--><smallfrac m:val="off"><dispdef><lmargin m:val="0"><rmargin m:val="0"><defjc m:val="centerGroup"><wrapindent m:val="1440"><intlim m:val="subSup"><narylim m:val="undOvr"></narylim></intlim></wrapindent><!--[endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267"> <w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" Priority="39" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" Name="toc 9"/> <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/> <w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/> <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/> <w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/> <w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/> </w:LatentStyles> </xml><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:黑体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimHei; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} @font-face {font-family:Cambria; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1073741899 0 0 159 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@黑体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} h1 {mso-style-priority:9; mso-style-unhide:no; mso-style-qformat:yes; mso-style-link:"标题 1 Char"; mso-style-next:正文; margin-top:17.0pt; margin-right:0cm; margin-bottom:16.5pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:240%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:1; font-size:22.0pt; font-family:"Times New Roman","serif"; mso-font-kerning:22.0pt;} h2 {mso-style-priority:9; mso-style-qformat:yes; mso-style-link:"标题 2 Char"; mso-style-next:正文; margin-top:13.0pt; margin-right:0cm; margin-bottom:13.0pt; margin-left:0cm; text-align:justify; text-justify:inter-ideograph; line-height:173%; mso-pagination:lines-together; page-break-after:avoid; mso-outline-level:2; font-size:16.0pt; font-family:"Cambria","serif"; mso-font-kerning:1.0pt;} p.MsoToc1, li.MsoToc1, div.MsoToc1 {mso-style-update:auto; mso-style-priority:39; mso-style-unhide:no; mso-style-next:正文; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; line-height:150%; mso-pagination:none; tab-stops:10.5pt right dotted 470.1pt; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} p.MsoToc2, li.MsoToc2, div.MsoToc2 {mso-style-update:auto; mso-style-priority:39; mso-style-unhide:no; mso-style-next:正文; margin-top:0cm; margin-right:0cm; margin-bottom:0cm; margin-left:24.0pt; margin-bottom:.0001pt; mso-para-margin-top:0cm; mso-para-margin-right:0cm; mso-para-margin-bottom:0cm; mso-para-margin-left:2.0gd; mso-para-margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; line-height:150%; mso-pagination:none; tab-stops:52.5pt right dotted 470.1pt; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} a:link, span.MsoHyperlink {mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:purple; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;} span.1Char {mso-style-name:"标题 1 Char"; mso-style-priority:9; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"标题 1"; mso-ansi-font-size:22.0pt; mso-bidi-font-size:22.0pt; mso-font-kerning:22.0pt; font-weight:bold;} span.2Char {mso-style-name:"标题 2 Char"; mso-style-priority:9; mso-style-unhide:no; mso-style-locked:yes; mso-style-link:"标题 2"; mso-ansi-font-size:16.0pt; mso-bidi-font-size:16.0pt; font-family:"Cambria","serif"; mso-ascii-font-family:Cambria; mso-hansi-font-family:Cambria; mso-font-kerning:1.0pt; font-weight:bold;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; mso-ascii-font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-hansi-font-family:"Times New Roman"; mso-font-kerning:0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:1027178182; mso-list-type:hybrid; mso-list-template-ids:1637005382 326418520 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-tab-stop:none; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l1 {mso-list-id:1524174140; mso-list-template-ids:-797658514;} @list l1:level1 {mso-level-tab-stop:none; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l1:level2 {mso-level-legal-format:yes; mso-level-text:"%1/.%2"; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:30.0pt; text-indent:-30.0pt;} @list l1:level3 {mso-level-legal-format:yes; mso-level-text:"%1/.%2/.%3"; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:36.0pt; text-indent:-36.0pt;} @list l1:level4 {mso-level-legal-format:yes; mso-level-text:"%1/.%2/.%3/.%4"; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:36.0pt; text-indent:-36.0pt;} @list l1:level5 {mso-level-legal-format:yes; mso-level-text:"%1/.%2/.%3/.%4/.%5"; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:54.0pt; text-indent:-54.0pt;} @list l1:level6 {mso-level-legal-format:yes; mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6"; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:54.0pt; text-indent:-54.0pt;} @list l1:level7 {mso-level-legal-format:yes; mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7"; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:54.0pt; text-indent:-54.0pt;} @list l1:level8 {mso-level-legal-format:yes; mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7/.%8"; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:72.0pt; text-indent:-72.0pt;} @list l1:level9 {mso-level-legal-format:yes; mso-level-text:"%1/.%2/.%3/.%4/.%5/.%6/.%7/.%8/.%9"; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:72.0pt; text-indent:-72.0pt;} @list l2 {mso-list-id:1877348061; mso-list-type:hybrid; mso-list-template-ids:-69725110 -995869650 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l2:level1 {mso-level-tab-stop:none; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l2:level2 {mso-level-number-format:alpha-lower; mso-level-text:"%2/)"; mso-level-tab-stop:none; mso-level-number-position:left; margin-left:42.0pt; text-indent:-21.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman","serif";} </style> <![endif]--><p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">原文为GCC-Inline-Assembly-HOWTO,在google上可以找到原文,欢迎指出翻译错误。</span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;"><br></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">中文版说明</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">由于译者水平有限,故译文出错之处,还请见谅。</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言的关键字不译,一些单词或词组(如</span><span style="font-size: 12pt;" lang="EN-US">colbber</span><span style="font-size: 12pt; font-family: 宋体;">等)由于恐怕译后词不达意,故并不翻译,由下面的单词表代为解释,敬请见谅。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">英文原文中的单词和词组:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">operand</span><span style="font-size: 12pt; font-family: 宋体;">:操作数,可以是寄存器,内存,立即数。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">volatile</span><span style="font-size: 12pt; font-family: 宋体;">:易挥发的,是</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言的关键字。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">constraint</span><span style="font-size: 12pt; font-family: 宋体;">:</span><span style="font-size: 12pt;"> </span><span style="font-size: 12pt; font-family: 宋体;">约束。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">register</span><span style="font-size: 12pt; font-family: 宋体;">:</span><span style="font-size: 12pt;"> </span><span style="font-size: 12pt; font-family: 宋体;">本文指</span><span style="font-size: 12pt;" lang="EN-US">CPU</span><span style="font-size: 12pt; font-family: 宋体;">寄存器。</span><span style="font-size: 12pt; text-transform: uppercase;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">:“</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">”和“</span><span style="font-size: 12pt;" lang="EN-US">__asm__</span><span style="font-size: 12pt; font-family: 宋体;">”在</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言中是关键字。原文中经常出现这个单词,是指嵌入到</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言(或者其它语言)的汇编程序片断。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 114pt; text-indent: -114pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">basic inline assembly</span><span style="font-size: 12pt; font-family: 宋体;">:指</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言中内联汇编程序的一种形式,和</span><span style="font-size: 12pt;" lang="EN-US">extended asm</span><span style="font-size: 12pt; font-family: 宋体;">对应。基本格式如下:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; line-height: 20pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm("assembly code");<p></p></span></p> </div> <p class="MsoNormal" style="margin-left: 102pt; text-indent: -102pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">extended assembly</span><span style="font-size: 12pt; font-family: 宋体;">:和</span><span style="font-size: 12pt;" lang="EN-US">basic inline assembly</span><span style="font-size: 12pt; font-family: 宋体;">对应,比它多了一些特性,如可以指明输入,输出等。基本格式如下:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; line-height: 20pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm ( assembler template <p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; line-height: 20pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: output operands<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; line-height: 20pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: input operands<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; line-height: 20pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: list of clobbered registers<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; line-height: 20pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<p></p></span></p> </div> <p class="MsoNormal" style="margin-left: 66pt; text-indent: -66pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">clobber list</span><span style="font-size: 12pt; font-family: 宋体;">:实际上就是被使用的寄存器的列表,用来告诉</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">它们已经被</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">使用了,不要在</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">程序外使用它们。不然可能带来不可预见的后果。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">clobbered registers</span><span style="font-size: 12pt; font-family: 宋体;">:它和</span><span style="font-size: 12pt;" lang="EN-US">clobber list</span><span style="font-size: 12pt; font-family: 宋体;">对应。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">assembler template</span><span style="font-size: 12pt; font-family: 宋体;">:就是汇编模板,所有内联汇编代码都有按一定的格式。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 102pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">见</span><span style="font-size: 12pt;" lang="EN-US">extended assembly</span><span style="font-size: 12pt; font-family: 宋体;">的说明</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">作者:</span><span style="font-size: 12pt;" lang="EN-US">Sandeep.S<p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">译者:吴遥</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">版本号</span><span style="font-size: 12pt;" lang="EN-US"> v0.1<span style=""> </span>2003</span><span style="font-size: 12pt; font-family: 宋体;">年</span><span style="font-size: 12pt;" lang="EN-US">3</span><span style="font-size: 12pt; font-family: 宋体;">月</span><span style="font-size: 12pt;" lang="EN-US">01</span><span style="font-size: 12pt; font-family: 宋体;">日</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">翻译版更新日期</span><span style="font-size: 12pt;" lang="EN-US"> 2008/06/11 <p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这篇</span><span style="font-size: 12pt;" lang="EN-US">HOWTO</span><span style="font-size: 12pt; font-family: 宋体;">解释</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">提供的内联汇编特性的用途和用法。学习这篇文章只须具备两个前提条件,显然那就是对</span><span style="font-size: 12pt;" lang="EN-US">x86</span><span style="font-size: 12pt; font-family: 宋体;">汇编语言和</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言有基本的了解。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><b><span style="font-size: 16pt; font-family: 黑体;">目</span></b><b><span style="font-size: 16pt;"> <span style=""></span></span></b><b><span style="font-size: 16pt; font-family: 黑体;">录</span></b><b><span style="font-size: 16pt;" lang="EN-US"><p></p></span></b></p> <p class="MsoToc1"><!--[if supportFields]><span lang=EN-US><span style='mso-element:field-begin'></span><span style='mso-spacerun:yes'></span>TOC /o &quot;1-3&quot; /h /z /u <span style='mso-element:field-separator'></span></span><![endif]--><span lang="EN-US"><span class="MsoHyperlink"><span style=""><a href="#_Toc200964849">1.<span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif"; color: windowtext; text-decoration: none;'><span style=""> </span></span><span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">前言</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964849 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">4</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800340039000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc2" style="margin-left: 21pt;"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964850">1.1<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">版权与许可证</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964850 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">4</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800350030000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc2" style="margin-left: 21pt;"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964851">1.2<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">回馈与更正</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964851 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">4</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800350031000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc2" style="margin-left: 21pt;"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964852">1.3<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">感谢</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style=""> </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964852 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">4</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800350032000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc1"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964853">2.<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">简介</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964853 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">5</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800350033000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc1"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964854">3.GCC<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">汇编语法</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964854 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">6</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800350034000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc1"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964855">4.<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">基本内联汇编</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964855 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">8</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800350035000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc1"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964856">5.<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">扩展内联汇编</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964856 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">9</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800350036000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc2" style="margin-left: 21pt;"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964857">5.1<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">汇编程序模板</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964857 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">10</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800350037000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc2" style="margin-left: 21pt;"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964858">5.2<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">操作数</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964858 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">10</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800350038000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc2" style="margin-left: 21pt;"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964859">5.3 Clobber<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">列表</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964859 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">12</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800350039000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc2" style="margin-left: 21pt;"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964860">5.4 Volatile … ?<span style="color: windowtext; display: none; text-decoration: none;"><span style="">. </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964860 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">12</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800360030000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc1"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964861">6.<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">更多关于约束条件</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964861 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">14</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800360031000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc2" style="margin-left: 21pt;"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964862">6.1 <span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">常用的约束</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964862 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">14</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800360032000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc2" style="margin-left: 21pt;"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964863">6.2 <span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">约束修饰符</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964863 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">16</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800360033000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc1"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964864">7. <span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">一些有用的诀窍</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964864 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">17</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800360034000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc1"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964865">8. <span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">结束语</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964865 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">19</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800360035000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoToc1"><span class="MsoHyperlink"><span style="" lang="EN-US"><a href="#_Toc200964866">9. <span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">参考</span></span><span style="color: windowtext; display: none; text-decoration: none;"><span style="">... </span></span><!--[if supportFields]><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'><span style='mso-element:field-begin'></span></span><span style='color:windowtext;display:none;mso-hide:screen;text-decoration:none; text-underline:none'> PAGEREF _Toc200964866 /h </span><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-separator'></span></span><![endif]--><span style="color: windowtext; display: none; text-decoration: none;">20</span><span style="color: windowtext; display: none; text-decoration: none;"><!--[if gte mso 9]><xml> <w:data>08D0C9EA79F9BACE118C8200AA004BA90B02000000080000000E0000005F0054006F0063003200300030003900360034003800360036000000</w:data> </xml><![endif]--></span><!--[if supportFields]><span style='color:windowtext; display:none;mso-hide:screen;text-decoration:none;text-underline:none'><span style='mso-element:field-end'></span></span><![endif]--></a></span></span><span style='font-size: 10.5pt; line-height: 150%; font-family: "Calibri","sans-serif";' lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><!--[if supportFields]><span lang=EN-US style='font-size:12.0pt'><span style='mso-element:field-end'></span></span><![endif]--><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h1 style="margin: 0cm 0cm 0.0001pt 18pt; text-align: center; text-indent: -18pt;" align="center"><a name="_Toc200964849"><!--[if !supportLists]--><span style="" lang="EN-US"><span style="">1.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-family: 宋体;">前言</span></a></h1> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <h2 style="margin: 0cm 0cm 0.0001pt;"> <a name="_Toc200964850"><span lang="EN-US">1.1</span></a><span style=""><span style="font-family: 宋体;">版权与许可证</span></span><span style=""></span><span style="font-size: 9pt; line-height: 173%;" lang="EN-US"><p></p></span> </h2> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">版权所有</span><span style="font-size: 12pt;" lang="EN-US"> (c)2003 Sandeep S.<p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这篇文档是免费的,你可以在依据自由软件组织</span><span style="font-size: 12pt;" lang="EN-US">GNU</span><span style="font-size: 12pt; font-family: 宋体;">通用公共许可证条款下重新发布或者修改它。无论是版本</span><span style="font-size: 12pt;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">的许可证还是后来的版本(由你自己选择)。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这份文档的发布是希望它有用,但是并没有任何保证。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h2 style="margin: 0cm 0cm 0.0001pt;"> <a name="_Toc200964851"><span lang="EN-US">1.2</span></a><span style=""><span style="font-family: 宋体;">回馈与更正</span></span> </h2> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">欢迎善意的回馈和批评,我感谢每一个指出本文错误的人并尽快地更正错误。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <h2 style="margin: 0cm 0cm 0.0001pt;"> <a name="_Toc200964852"><span lang="EN-US">1.3</span></a><span style=""><span style="font-family: 宋体;">感谢</span></span><span style=""></span><span style="font-size: 9pt; line-height: 173%;" lang="EN-US"><p></p></span> </h2> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">我向</span><span style="font-size: 12pt;" lang="EN-US">GNU</span><span style="font-size: 12pt; font-family: 宋体;">开发者提供这个功能强大的特性表达最诚挚的感谢。感谢</span><span style="font-size: 12pt;" lang="EN-US">Mr.Pramode C E</span><span style="font-size: 12pt; font-family: 宋体;">的帮助。感谢政府工程学院的朋友尤其是</span><span style="font-size: 12pt;" lang="EN-US">Nisha Kurur</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">Sakeeb S</span><span style="font-size: 12pt; font-family: 宋体;">精神上的支持。感谢政府工程学院老师对我的帮助。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">另外,还要感谢</span><span style="font-size: 12pt;" lang="EN-US"> Phillip</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">Brennan</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">Underwood </span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;"> <span lang="EN-US">colin@nyx.net </span></span><span style="font-size: 12pt; font-family: 宋体;">,他们解决了很多难题。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h1 style="margin: 0cm 0cm 0.0001pt; text-align: center;" align="center"> <a name="_Toc200964853"><span lang="EN-US">2.</span></a><span style=""><span style="font-family: 宋体;">简介</span></span> </h1> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">现在我们开始学</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">内联汇编。内联意味着什么?</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">我们可以指示编译器插入一个函数的代码到调用者的代码中,也就是实际上调用产生的地方。这样的函数就是内联函数。看上去很像宏?实际上它们很相似。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">内联函数有什么好处呢?</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">内联的方法减少了函数调用的额外开销。而且如果有实际的参数值是常数,那么在编译的时候编译器知道可能充许参数值的单一化,所以并不是所有的内联函数的代码都要</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">包含进来。对可执行代码大小的影响是不可预测的,它视乎对特定的情况。声明一个内联函数,我们声明中使用关键字</span><span style="font-size: 12pt;" lang="EN-US">inline</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">现在我们站在一个位置来猜什么是内联汇编。它只是一些写在函数内的汇编语言的程序。在系统编程时候它们会显得很便利,快速,非常有用。我们的主要目标是学习</span><span style="font-size: 12pt;" lang="EN-US">GCC<p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">内联汇编函数的基本格式和用法。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">内联汇编之所以如此重要主要是因为它操作的能力和让它的输出在</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言变量中可见。(这个句话译得不太好)因为这样的能力,“</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">”(译者:</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">指内联函数)就像一个汇编指令和包含它的</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言程序之间的接口。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h1 style="margin: 0cm 0cm 0.0001pt; text-align: center;" align="center"> <a name="_Toc200964854"><span lang="EN-US">3.GCC</span></a><span style=""><span style="font-family: 宋体;">汇编语法</span></span> </h1> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">,即</span><span style="font-size: 12pt;" lang="EN-US">Linux</span><span style="font-size: 12pt; font-family: 宋体;">平台下的</span><span style="font-size: 12pt;" lang="EN-US">GNU C</span><span style="font-size: 12pt; font-family: 宋体;">语言编译器,它使用</span><span style="font-size: 12pt;" lang="EN-US">AT&amp;T&amp;sol</span><span style="font-size: 12pt; font-family: 宋体;">(译者:应该是指</span><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法,但是</span><span style="font-size: 12pt;" lang="EN-US">sol</span><span style="font-size: 12pt; font-family: 宋体;">就不知道是什么);</span><span style="font-size: 12pt;" lang="EN-US">UNIX</span><span style="font-size: 12pt; font-family: 宋体;">汇编语法。现在让我们使用</span><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法来进行汇编编码。如果你对</span><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法不熟悉也不用担心,我将会教你。这种语法和</span><span style="font-size: 12pt;" lang="EN-US">Intel</span><span style="font-size: 12pt; font-family: 宋体;">语法有很大的不同。以下我将给出主要的不同。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">、来源地-目的地</span><span style="font-size: 12pt;"> </span><span style="font-size: 12pt; font-family: 宋体;">定序</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法和</span><span style="font-size: 12pt;" lang="EN-US">Intel</span><span style="font-size: 12pt; font-family: 宋体;">语法在操作数的方向上是相反的。</span><span style="font-size: 12pt;" lang="EN-US">Intel</span><span style="font-size: 12pt; font-family: 宋体;">语法的第一个操作数是目的地,第二个是来源地。然而</span><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法的第一个操作数是来源地,第二的是目的地。也即:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">“</span><span style="font-size: 12pt;" lang="EN-US">Op-code dst src</span><span style="font-size: 12pt; font-family: 宋体;">”在</span><span style="font-size: 12pt;" lang="EN-US">Intel</span><span style="font-size: 12pt; font-family: 宋体;">语法中变为“</span><span style="font-size: 12pt;" lang="EN-US">Op-code src dst</span><span style="font-size: 12pt; font-family: 宋体;">”</span><span style="font-size: 12pt;" lang="EN-US">AT&amp;T</span><span style="font-size: 12pt; font-family: 宋体;">语法。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">、寄存器命名</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">寄存器名字要有前缀“</span><span style="font-size: 12pt;" lang="EN-US">%</span><span style="font-size: 12pt; font-family: 宋体;">”。也即如果寄存器</span><span style="font-size: 12pt;" lang="EN-US">eax</span><span style="font-size: 12pt; font-family: 宋体;">被使用,应写作</span><span style="font-size: 12pt;" lang="EN-US">%eax</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">3</span><span style="font-size: 12pt; font-family: 宋体;">、立即操作数</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">立即操作数之前要有一个“</span><span style="font-size: 12pt;" lang="EN-US">$</span><span style="font-size: 12pt; font-family: 宋体;">”符号。对于静态</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言变量也要有前缀“</span><span style="font-size: 12pt;" lang="EN-US">$</span><span style="font-size: 12pt; font-family: 宋体;">”。在</span><span style="font-size: 12pt;" lang="EN-US">Intel</span><span style="font-size: 12pt; font-family: 宋体;">语法里,十六进制常数要有“</span><span style="font-size: 12pt;" lang="EN-US">h</span><span style="font-size: 12pt; font-family: 宋体;">”作为后缀。在</span><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法里我们用“</span><span style="font-size: 12pt;" lang="EN-US">0x</span><span style="font-size: 12pt; font-family: 宋体;">”作为代</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">替。所以,对于十六进制的数,我们看到一个“</span><span style="font-size: 12pt;" lang="EN-US">$</span><span style="font-size: 12pt; font-family: 宋体;">”,然后一个“</span><span style="font-size: 12pt;" lang="EN-US">0x</span><span style="font-size: 12pt; font-family: 宋体;">”,最后才是常数本身。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">4</span><span style="font-size: 12pt; font-family: 宋体;">、操作数大小</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法里内存操作数的大小取决于操作码名字的最后一个字母。操作码后“</span><span style="font-size: 12pt;" lang="EN-US">b</span><span style="font-size: 12pt; font-family: 宋体;">”,“</span><span style="font-size: 12pt;" lang="EN-US">w</span><span style="font-size: 12pt; font-family: 宋体;">”和“</span><span style="font-size: 12pt;" lang="EN-US">l</span><span style="font-size: 12pt; font-family: 宋体;">”分别指定</span><span style="font-size: 12pt;" lang="EN-US">byte</span><span style="font-size: 12pt; font-family: 宋体;">(</span><span style="font-size: 12pt;" lang="EN-US">8</span><span style="font-size: 12pt; font-family: 宋体;">字节长度),</span><span style="font-size: 12pt;" lang="EN-US">word</span><span style="font-size: 12pt; font-family: 宋体;">(</span><span style="font-size: 12pt;" lang="EN-US">16</span><span style="font-size: 12pt; font-family: 宋体;">字节长度)和</span><span style="font-size: 12pt;" lang="EN-US">long</span><span style="font-size: 12pt; font-family: 宋体;">(</span><span style="font-size: 12pt;" lang="EN-US">32</span><span style="font-size: 12pt; font-family: 宋体;">字节长度)的内存引用。</span><span style="font-size: 12pt;" lang="EN-US">Intel</span><span style="font-size: 12pt; font-family: 宋体;">语法采用对内存操作数</span><span style="font-size: 12pt;" lang="EN-US">(</span><span style="font-size: 12pt; font-family: 宋体;">不是操作码</span><span style="font-size: 12pt;" lang="EN-US">)</span><span style="font-size: 12pt; font-family: 宋体;">加上前缀“</span><span style="font-size: 12pt;" lang="EN-US">tyte ptr</span><span style="font-size: 12pt; font-family: 宋体;">”,“</span><span style="font-size: 12pt;" lang="EN-US">word ptr</span><span style="font-size: 12pt; font-family: 宋体;">”和“</span><span style="font-size: 12pt;" lang="EN-US">dword ptr</span><span style="font-size: 12pt; font-family: 宋体;">”的方法来实现。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这样,</span><span style="font-size: 12pt;" lang="EN-US">Intel</span><span style="font-size: 12pt; font-family: 宋体;">语法的“</span><span style="font-size: 12pt;" lang="EN-US">mov al, byte ptr foo</span><span style="font-size: 12pt; font-family: 宋体;">”等同于</span><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法的“</span><span style="font-size: 12pt;" lang="EN-US">movb foo, %al</span><span style="font-size: 12pt; font-family: 宋体;">”。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">5</span><span style="font-size: 12pt; font-family: 宋体;">、内存操作数</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">在</span><span style="font-size: 12pt;" lang="EN-US">Intel</span><span style="font-size: 12pt; font-family: 宋体;">语法里寄存器包含在“[”和“]”里,而在</span><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法里却改为“(”和“)”。另外,在</span><span style="font-size: 12pt;" lang="EN-US">Intel</span><span style="font-size: 12pt; font-family: 宋体;">语法一个非直接内存引用是这样的:</span><span style="font-size: 12pt;" lang="EN-US">section&amp;colon;[base &amp;plus; index&amp;ast;scale &amp;plus; disp],</span><span style="font-size: 12pt; font-family: 宋体;">而在</span><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法里却是这样的:</span><span style="font-size: 12pt;" lang="EN-US">section&amp;colon;disp(base, index, scale)</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">有一点要记住的是当一个常数当作</span><span style="font-size: 12pt;" lang="EN-US">disp&amp;sol;scale</span><span style="font-size: 12pt; font-family: 宋体;">时,“</span><span style="font-size: 12pt;" lang="EN-US">$</span><span style="font-size: 12pt; font-family: 宋体;">”符号不能前缀。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">现在我们来看一下</span><span style="font-size: 12pt;" lang="EN-US">Intel</span><span style="font-size: 12pt; font-family: 宋体;">语法和</span><span style="font-size: 12pt;" lang="EN-US">AT</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">T</span><span style="font-size: 12pt; font-family: 宋体;">语法的主要不同点。我只是写了很少的一部分。如果要了解全部的内容,请参考</span><span style="font-size: 12pt;" lang="EN-US">GNU</span><span style="font-size: 12pt; font-family: 宋体;">汇编文档(</span><span style="font-size: 12pt;" lang="EN-US">GNU Assembler documentations</span><span style="font-size: 12pt; font-family: 宋体;">)。现在让我们看一些例子来帮助理解。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <table class="MsoNormalTable" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0"><tbody> <tr style=""> <td style="border: 1pt solid black; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><span lang="EN-US">Intel Code</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> <td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><span lang="EN-US">AT&amp;T Code</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">mov<span style=""> </span>eax,1</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">movl<span style=""> </span>$1,%eax</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">mov<span style=""> </span>ebx,0ffh</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">movl<span style=""> </span>$0xff,%ebx</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">int<span style=""> </span>80h</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">int<span style=""> </span>$0x80</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">mov<span style=""> </span>ebx, eax</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">movl<span style=""> </span>%eax, %ebx</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">mov<span style=""> </span>eax,[ecx]</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">movl<span style=""> </span>(%ecx),%eax</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">mov<span style=""> </span>eax,[ebx&amp;plus;3]</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">movl<span style=""> </span>3(%ebx),%eax</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">mov<span style=""> </span>eax,[ebx+20h]</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">movl<span style=""> </span>0x20(%ebx),%eax</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">add<span style=""> </span>eax,[ebx+ecx*2h]</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">addl<span style=""> </span>(%ebx,%ecx,0x2),%eax</span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">lea<span style=""> </span>eax,[ebx+ecx]</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">leal<span style=""> </span>(%ebx,%ecx),%eax</span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">sub<span style=""> </span>eax,[ebx+ecx*4h-20h]</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">subl<span style=""> </span>-0x20(%ebx,%ecx,0x4),%eax</span></p> </td> </tr> </tbody></table> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h1 style="margin: 0cm 0cm 0.0001pt; text-align: center;" align="center"> <a name="_Toc200964855"><span lang="EN-US">4.</span></a><span style=""><span style="font-family: 宋体;">基本内联汇编</span></span> </h1> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">基本内联汇编的格式是非常简单的,如下:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; line-height: 20pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm("assembly code");<p></p></span></p> </div> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 24pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">例子如下:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm("movl %ecx %eax");/*</span><span style="font-size: 12pt; font-family: 宋体; color: black;">将<span lang="EN-US">ecx</span>的值传给<span lang="EN-US">eax</span>了<span lang="EN-US">/<p></p></span></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">__asm__("movb %bh (%eax)");/*</span><span style="font-size: 12pt; font-family: 宋体; color: black;">将<span lang="EN-US">bh</span>的值传到<span lang="EN-US">eax</span>指向的内存处<span lang="EN-US">*/<p></p></span></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">你可能已经注意到在这里我使用</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">__asm__</span><span style="font-size: 12pt; font-family: 宋体;">两个关键字。它们都是正确的。如果</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">关键字与程序里的某些程序发生冲突,那么你可以使用</span><span style="font-size: 12pt;" lang="EN-US">__asm__</span><span style="font-size: 12pt; font-family: 宋体;">代替。如果我们有不止一条指令,那么我们每行在双引号里写一条指令,并且在指令最后加上一个</span><span style="font-size: 12pt;" lang="EN-US">'/n'</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">'/t'</span><span style="font-size: 12pt; font-family: 宋体;">。这是因为</span><span style="font-size: 12pt;" lang="EN-US">gcc</span><span style="font-size: 12pt; font-family: 宋体;">以字符串的形式发送每条指给</span><span style="font-size: 12pt;" lang="EN-US">as</span><span style="font-size: 12pt; font-family: 宋体;">(</span><span style="font-size: 12pt;" lang="EN-US">GAS</span><span style="font-size: 12pt; font-family: 宋体;">),并且通过使用</span><span style="font-size: 12pt;" lang="EN-US">newline</span><span style="font-size: 12pt; font-family: 宋体;">&</span><span style="font-size: 12pt;" lang="EN-US">tab</span><span style="font-size: 12pt; font-family: 宋体;">的方法发送正确的行格式给汇编器。例子:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">__asm__ ("movl %eax, %ebx/n/t"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"movl $56, %esi/n/t"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"movl %ecx, $label(%edx,%ebx,$4)/n/t"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"movb %ah, (%ebx)");<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如果在我们的代码中我们改变了一些寄存器的值并且没有记下这些改变便返回,可能会导致错误的发生。这是因为</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">并不知道寄存器的值改变了,这会给我们带来麻烦,尤其是编译器对程序进行一些优化处理时。假设有这样的情况发生:某些寄存器保存着某些变量的值,而我们没有有告诉</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">便改变了它,程序会如常地运行。这就是我们所的扩展功能的原因。扩展</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">提供我们这种的功能。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h1 style="margin: 0cm 0cm 0.0001pt; text-align: center;" align="center"> <a name="_Toc200964856"><span lang="EN-US">5.</span></a><span style=""><span style="font-family: 宋体;">扩展内联汇编</span></span> </h1> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">在基本汇编内联里,我们只使用了指令。而在扩展汇编内联里,我们能够指定操作数。它允许我们指定输入寄存器,输出寄存器和一列</span><span style="font-size: 12pt;" lang="EN-US">clobbered registers</span><span style="font-size: 12pt; font-family: 宋体;">(译者注:实际就是指一些被内联汇编使用的寄存器,不知道如何翻译,所以下文也是以英文写出)。没有强性规定一定要指定使用寄存器,我们可以把头痛的事情留给</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">,并且这样可能更有利于</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">对程序优化。基本的格式如下:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm ( assembler template <p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: output operands<span style=""> </span>/* optional */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-left: 0cm; text-align: left; text-indent: 12pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: input operands<span style=""> </span>/* optional */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: list of clobbered registers<span style=""> </span>/* optional */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span><span style=""></span>);<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">汇编程序模板(</span><span style="font-size: 12pt;" lang="EN-US">The assembler template</span><span style="font-size: 12pt; font-family: 宋体;">)由汇编指令组成。每一个操作数由在括号内的</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言表达式后的操作数约束字符串描述。第一个冒号把汇编程序模板和第一个输出操作数分开,第二个冒号则把最后一个输出操作数和第一个输入操作数分开,假设有这样的操作数。逗号则在每组中分开操作数。操作数的量最多为</span><span style="font-size: 12pt;" lang="EN-US">10,</span><span style="font-size: 12pt; font-family: 宋体;">或者机器描述里最大操作数的的指令模式,这取决于那一个比较大。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如果没有输出操作数却有输入操作数,就要写上两个连续冒号,以说明没有输出操作数。例子:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>asm ("cld/n/t"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"rep/n/t"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"stosl"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: /* no output registers */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "c" (count), "a" (fill_value), "D" (dest)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "%ecx", "%edi" <p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">现在,看看这代码都做了什么。上面的内联代码把</span><span style="font-size: 12pt;" lang="EN-US">fill_value</span><span style="font-size: 12pt; font-family: 宋体;">的值写到</span><span style="font-size: 12pt;" lang="EN-US">edi</span><span style="font-size: 12pt; font-family: 宋体;">指向的内存地址</span><span style="font-size: 12pt;" lang="EN-US">count</span><span style="font-size: 12pt; font-family: 宋体;">次。并且告诉</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">寄存器</span><span style="font-size: 12pt;" lang="EN-US">eax</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">edi</span><span style="font-size: 12pt; font-family: 宋体;">不可以再用了(也则是说被使用了)。让我们看多一个例子来更好地理解。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">int a=10, b;<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm ("movl %1, %%eax; <p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>movl %%eax, %0;"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>:"=r"(b)<span style=""> </span>/* output */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>:"r"(a)<span style=""> </span>/* input */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>:"%eax"<span style=""> </span>/* clobbered register */<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<span style=""> </span></span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这里我们使用汇编指令让“</span><span style="font-size: 12pt;" lang="EN-US">b</span><span style="font-size: 12pt; font-family: 宋体;">”的值等于“</span><span style="font-size: 12pt;" lang="EN-US">a</span><span style="font-size: 12pt; font-family: 宋体;">”的值。下面是</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">一些要点:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">“</span><span style="font-size: 12pt;" lang="EN-US">b</span><span style="font-size: 12pt; font-family: 宋体;">”是一个输出操作数,通过</span><span style="font-size: 12pt;" lang="EN-US">%0</span><span style="font-size: 12pt; font-family: 宋体;">联系起来;而“</span><span style="font-size: 12pt;" lang="EN-US">a</span><span style="font-size: 12pt; font-family: 宋体;">”是一个输入操作数,通过</span><span style="font-size: 12pt;" lang="EN-US">%1</span><span style="font-size: 12pt; font-family: 宋体;">联系起来。“</span><span style="font-size: 12pt;" lang="EN-US">r</span><span style="font-size: 12pt; font-family: 宋体;">”是对操作数的一个约束。在后面我们将会谈到关于约束的细节。“</span><span style="font-size: 12pt;" lang="EN-US">r</span><span style="font-size: 12pt; font-family: 宋体;">”告诉</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">使用任何一个寄存器来存储操作数的值。输出操作数的约束必须包含一个约束修饰符“</span><span style="font-size: 12pt;" lang="EN-US">=</span><span style="font-size: 12pt; font-family: 宋体;">”。这个修饰符说明输出操作数是只写的。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这里有两个“</span><span style="font-size: 12pt;" lang="EN-US">%</span><span style="font-size: 12pt; font-family: 宋体;">”在寄存器之前。这样可以帮助</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">辨别操作数和寄存器,操作数只有一个“</span><span style="font-size: 12pt;" lang="EN-US">%</span><span style="font-size: 12pt; font-family: 宋体;">”作为前缀。第三个冒号后的</span><span style="font-size: 12pt;" lang="EN-US">clobbered register %eax</span><span style="font-size: 12pt; font-family: 宋体;">告诉</span><span style="font-size: 12pt;" lang="EN-US">GCC%eax</span><span style="font-size: 12pt; font-family: 宋体;">的值将会在“</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">”里被修改,所以</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">不会使用这个寄存器去存储其它的数值。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">当“</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">”程序执行完后,“</span><span style="font-size: 12pt;" lang="EN-US">b</span><span style="font-size: 12pt; font-family: 宋体;">”会映射出更新后的值,因为它被指定为一个输出操作数。换句话说,在“</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">”里对“</span><span style="font-size: 12pt;" lang="EN-US">b</span><span style="font-size: 12pt; font-family: 宋体;">”的改变将会影响到“</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">”的外面的程序。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">现在我们来看看各部分的细节。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h2 style="margin: 0cm 0cm 0.0001pt;"> <a name="_Toc200964857"></a><a name="_Toc200877605"><span style=""><span lang="EN-US">5.1</span></span></a><span style=""></span><span style=""><span style="font-family: 宋体;">汇编程序模板</span></span><span style=""></span><span style="font-size: 9pt; line-height: 173%;" lang="EN-US"><p></p></span> </h2> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">汇编程序模板包含被插入到</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言程序里的汇编指令的集合。它的格式像这样:每一个指令必须包括在双引号里面,或者全部的指令包括在双引号里面。每一个指令还必须以一个定界符(</span><span style="font-size: 12pt;" lang="EN-US">delimiter</span><span style="font-size: 12pt; font-family: 宋体;">)结束。合法的定界符可以是</span><span style="font-size: 12pt;" lang="EN-US">newline(/n)</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">semicolon(&amp;semi;)</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US">'/n'</span><span style="font-size: 12pt; font-family: 宋体;">可以接一个</span><span style="font-size: 12pt;" lang="EN-US">tab(/t)</span><span style="font-size: 12pt; font-family: 宋体;">。我们都知道了使用</span><span style="font-size: 12pt;" lang="EN-US">newline/tab</span><span style="font-size: 12pt; font-family: 宋体;">的理由了吧?对应于</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言表达式的操作数被表示为</span><span style="font-size: 12pt;" lang="EN-US">%0</span><span style="font-size: 12pt; font-family: 宋体;">,</span><span style="font-size: 12pt;" lang="EN-US">%1...</span><span style="font-size: 12pt; font-family: 宋体;">等等。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h2 style="margin: 0cm 0cm 0.0001pt;"> <a name="_Toc200964858"><span lang="EN-US">5.2</span></a><span style=""><span style="font-family: 宋体;">操作数</span></span> </h2> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言表达式在“</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">”里作为汇编指令的操作数。每一个操作数首先要有一个在双引号里的一个操作数约束。对于输出操作数,还必须要有一个约束修饰符(它也是在引号里面),最后才是一个</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言表达式表示这个操作数。也就是说,</span><span style="font-size: 12pt;" lang="EN-US">"constraint"(C expression)</span><span style="font-size: 12pt; font-family: 宋体;">是一般的形式,对于输出操作数则会有一个额外的修饰符。约束主要用来决定操作数的寻址模式。约束同样能够用来指定使用哪个寄存器。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如果我们使用不止一个操作数,那么它们用逗号分开。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">在汇编程序模板里,每一个操作数通过号码来引用。编码方式如下。如果总共有</span><span style="font-size: 12pt;" lang="EN-US">n</span><span style="font-size: 12pt; font-family: 宋体;">个操作数(包括输入和输出),那么第一个输出操作数编号为</span><span style="font-size: 12pt;" lang="EN-US">0</span><span style="font-size: 12pt; font-family: 宋体;">,,第二个编号为</span><span style="font-size: 12pt;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">,以此类推,最后一个输入操作数编号为</span><span style="font-size: 12pt;" lang="EN-US">n-1</span><span style="font-size: 12pt; font-family: 宋体;">。最大的操作数号如上一节所说的。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">输出操作数必须是值。而输入操作数则没有这么严格,它们可以是表达式。扩展</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">属性经常用于机器指令,编译器本身并不知道它的存在。如果输出表达式不能直接地寻址(例如,它是一个</span><span style="font-size: 12pt;" lang="EN-US">bit</span><span style="font-size: 12pt; font-family: 宋体;">范围的值),我们的约束就必须允许使用一个寄存器。那样的话,</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">将会使用这个寄存器作为</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">的输出,然后把这个寄存器的内容保存到输出。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">正如上面所说的,普通的输出操作数必须是只写的(</span><span style="font-size: 12pt;" lang="EN-US">write-only</span><span style="font-size: 12pt; font-family: 宋体;">)</span><span style="font-size: 12pt;" lang="EN-US">;GCC</span><span style="font-size: 12pt; font-family: 宋体;">将会假设在指令之前的这样的操作数的值是没有用的,并且不须要被产生。扩展</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">也支持</span><span style="font-size: 12pt;" lang="EN-US">input-output</span><span style="font-size: 12pt; font-family: 宋体;">或者</span><span style="font-size: 12pt;" lang="EN-US">read-write</span><span style="font-size: 12pt; font-family: 宋体;">操作数。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">现在让我们专注于一些例子。我们想要一个数乘于</span><span style="font-size: 12pt;" lang="EN-US">5</span><span style="font-size: 12pt; font-family: 宋体;">,我们使用</span><span style="font-size: 12pt;" lang="EN-US">lea</span><span style="font-size: 12pt; font-family: 宋体;">指令。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm ("leal (%1,%1,4), %0"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "=r" (five_times_x)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "r" (x) <p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这里我们的输入是“</span><span style="font-size: 12pt;" lang="EN-US">x</span><span style="font-size: 12pt; font-family: 宋体;">”。我没有指定使用哪一个寄存器。</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">会选择某个寄存器来作为输入,另外某个来作为输出。如果我们想输入和输出都在同一个寄存器,我们可以命令</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">这样做。这里我们使用读写类型(</span><span style="font-size: 12pt;" lang="EN-US">types of read write</span><span style="font-size: 12pt; font-family: 宋体;">)的操作数。通过指定合适的约束,下面我们实现它:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm ("leal (%0,%0,4), %0"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "=r" (five_times_x)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "0" (x) <p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">现在输入和输出操作数都在同一个寄存器里,但是我们还是不知道是哪一个寄存器。如果我们想指定寄存器,可以这样:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm ("leal (%%ecx,%%ecx,4), %%ecx"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "=c" (x)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "c" (x) <p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">在以上的三个例子中,我们没有在</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表上指定任何寄存器。为什么呢?在前两个例子中,</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">决定了使哪个寄存器并且它知道什么改变了?在最后一个例子中,我们也不用在</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表加入</span><span style="font-size: 12pt;" lang="EN-US">ecx</span><span style="font-size: 12pt; font-family: 宋体;">,</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">知道它和</span><span style="font-size: 12pt;" lang="EN-US">x</span><span style="font-size: 12pt; font-family: 宋体;">之间传递数值。所以</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">知道</span><span style="font-size: 12pt;" lang="EN-US">ecx</span><span style="font-size: 12pt; font-family: 宋体;">的值,不用考虑把它加入</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h2 style="margin: 0cm 0cm 0.0001pt;"> <a name="_Toc200964859"><span lang="EN-US">5.3 Clobber</span></a><span style=""><span style="font-family: 宋体;">列表</span></span> </h2> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如果指令连续使用一些寄存器。我们必须把这么寄存器列在</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表之中,也则是内联汇编程序里第三个冒号后的范围。这样是为了告诉</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">我们自己将会使用并且修改它们。这样</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">将不会认为这些寄存器里的值是可用的。我们没有必要列出用于输入和输出的寄存器。因为</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">知道</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">程序使用到它们(因为它们在约束中明显地指出来)。如果指令使用任何其它的寄存器,无论是显式还是隐式的指出(同是这样的寄存器也没有在输入或者输出约束列表中出现),那么这些寄存器必须在</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表中出现。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如果我们的指令会改变寄存器的值,我们必须加上</span><span style="font-size: 12pt;" lang="EN-US">"cc"</span><span style="font-size: 12pt; font-family: 宋体;">到</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表上。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如果我们的指令在不可预知的情况修改了内存,则要增加这个到</span><span style="font-size: 12pt;" lang="EN-US">clobber </span><span style="font-size: 12pt; font-family: 宋体;">列表增加</span><span style="font-size: 12pt;" lang="EN-US">”memory”</span><span style="font-size: 12pt; font-family: 宋体;">。这样的话</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">在执行汇编指令时就不会在寄存器中保存这个内存的值。如果对内存的影响并没有列在</span><span style="font-size: 12pt;" lang="EN-US">input</span><span style="font-size: 12pt; font-family: 宋体;">或者</span><span style="font-size: 12pt;" lang="EN-US">output</span><span style="font-size: 12pt; font-family: 宋体;">中,那么我们还要增加</span><span style="font-size: 12pt;" lang="EN-US">volatile</span><span style="font-size: 12pt; font-family: 宋体;">这个关键字。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">我们可以读写无限多次</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">寄存器。考虑到模板里多指令的例子,程序假设子程序</span><span style="font-size: 12pt;" lang="EN-US">_foo</span><span style="font-size: 12pt; font-family: 宋体;">从寄存器</span><span style="font-size: 12pt;" lang="EN-US">eax</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">ebx</span><span style="font-size: 12pt; font-family: 宋体;">接收参数:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm ("movl %0,%%eax;<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>movl %1,%%ecx;<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>call _foo"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: /* no outputs */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "g" (from), "g" (to)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "eax", "ecx"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; text-indent: 23.25pt; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">);<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h2 style="margin: 0cm 0cm 0.0001pt;"><a name="_Toc200964860"><span lang="EN-US">5.4 Volatile … ?</span></a></h2> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如果你熟悉内核代码之类的代码,你一定经常看到许多函数被声明为</span><span style="font-size: 12pt;" lang="EN-US"> volatile </span><span style="font-size: 12pt; font-family: 宋体;">或者</span><span style="font-size: 12pt;" lang="EN-US"> __volatile__</span><span style="font-size: 12pt; font-family: 宋体;">,这个声明在</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">或者</span><span style="font-size: 12pt;" lang="EN-US">__asm__</span><span style="font-size: 12pt; font-family: 宋体;">后面。前面我们说到了很多关于</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">__asm__</span><span style="font-size: 12pt; font-family: 宋体;">。那么什么是</span><span style="font-size: 12pt;" lang="EN-US">volatile</span><span style="font-size: 12pt; font-family: 宋体;">呢?</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如果我们写的汇编语句一个要在我们写的地方执行(例如,一定不可以为了优化从一个循环里移出来),那么把关键字</span><span style="font-size: 12pt;" lang="EN-US">volatile</span><span style="font-size: 12pt; font-family: 宋体;">放在</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">和括号之间。这样就能够避免移动,删除代码。声明如下:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm volatile ( ... : ... : ... : ...);<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">使用</span><span style="font-size: 12pt;" lang="EN-US">__volatile__</span><span style="font-size: 12pt; font-family: 宋体;">关键字时我们必须很小心。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如果我们写的汇编语句只是为了做一些计算,并且对外面不造成任何影响,那么最好还是不要用</span><span style="font-size: 12pt;" lang="EN-US">volatile</span><span style="font-size: 12pt; font-family: 宋体;">关键字。这样做有利于</span><span style="font-size: 12pt;" lang="EN-US">gcc</span><span style="font-size: 12pt; font-family: 宋体;">对代码的优化和美化。对于这一章的一些有用的技巧,我已经提供了很多内联</span><span style="font-size: 12pt;" lang="EN-US">asm</span><span style="font-size: 12pt; font-family: 宋体;">函数的例子。详细内容可以查看</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h1 style="margin: 0cm 0cm 0.0001pt; text-align: center;" align="center"> <a name="_Toc200964861"><span lang="EN-US">6.</span></a><span style=""><span style="font-family: 宋体;">更多关于约束条件</span></span> </h1> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">到目前为止,你可能已经知道了约束跟内联汇编关系密切。但是我们还没有详细地说到约束。约束可以用来说明一个操作数是否存放在一个寄存器中,并且在哪个寄存器中;也可以用来说明是否在内存中,并且是什么类型的地址;说明是否是一个立即数,并且可能取什么值(比如取值范围)等等。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h2 style="margin: 0cm 0cm 0.0001pt;"> <a name="_Toc200964862"><span lang="EN-US">6.1 </span></a><span style=""><span style="font-family: 宋体;">常用的约束</span></span> </h2> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">约束有很多种,但是常用的比较不多,现在让我们来了解一下这些约束。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">1.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;">寄存器操作数约束</span><span style="font-size: 12pt;" lang="EN-US">(r)<p></p></span></p> <p class="MsoNormal" style="text-indent: 18pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">当操作数被指定使用以下的约束时,它们就会被保存在通用寄存器</span><span style="font-size: 12pt;" lang="EN-US">(General Purpose Registers)</span><span style="font-size: 12pt; font-family: 宋体;">,请看下面的例子:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm ("movl %%eax, %0/n" :"=r"(myval));<p></p></span></p> </div> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">变量</span><span style="font-size: 12pt;" lang="EN-US">myval</span><span style="font-size: 12pt; font-family: 宋体;">被保存在寄存器里,寄存器</span><span style="font-size: 12pt;" lang="EN-US">eax</span><span style="font-size: 12pt; font-family: 宋体;">的值被复制到这个寄存器,接着变量</span><span style="font-size: 12pt;" lang="EN-US">myval</span><span style="font-size: 12pt; font-family: 宋体;">的值从这个寄存器传到内存中,更新内存的值。当</span><span style="font-size: 12pt;" lang="EN-US">"r"</span><span style="font-size: 12pt; font-family: 宋体;">约束声明时,</span><span style="font-size: 12pt;" lang="EN-US">gcc</span><span style="font-size: 12pt; font-family: 宋体;">会保存变量的值到任何一个可用的通用寄存器中。想要指定某个寄存器,你必须使用专用的寄存器约束符直接指定寄存器的名称。这些约束符如下所示:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <table class="MsoNormalTable" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0"><tbody> <tr style=""> <td style="border: 1pt solid black; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><span style="font-size: 12pt;" lang="EN-US">r<p></p></span></p> </td> <td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><span lang="EN-US">Register(s)</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><span style="font-size: 12pt;" lang="EN-US">a<p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">%eax, %ax, %al</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><span style="font-size: 12pt;" lang="EN-US">b<p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">%ebx, %bx, %bl</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><span style="font-size: 12pt;" lang="EN-US">c<p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">%ecx, %cx, %cl</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><span style="font-size: 12pt;" lang="EN-US">d<p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">%edx, %dx, %dl</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><span style="font-size: 12pt;" lang="EN-US">S<p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">%esi, %si</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> <tr style=""> <td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="text-align: center; line-height: 20pt;" align="center"><span style="font-size: 12pt;" lang="EN-US">D<p></p></span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 238.15pt;" valign="top" width="318"> <p class="MsoNormal" style="line-height: 20pt;"><span lang="EN-US">%edi, %di</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> </td> </tr> </tbody></table> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">2.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;">内存操作数约束</span><span style="font-size: 12pt;" lang="EN-US">(m)<p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">对于寄存器操作数约束,先保存要运算的值到一个寄存器,运算后再把值传到内存中去。内丰操作数约束与相反,当操作数在内存中时,任何运算都会直接在内存中执行。寄存器约束经常在指令能够大大地提高进程运行的速度时被使用。而在</span><span style="font-size: 12pt;" lang="EN-US">C</span><span style="font-size: 12pt; font-family: 宋体;">语言变量须要在内联汇编语句中更新和不须要使用寄存器保存这个变量值时,内存约束则是最有效的。如下面的例子,</span><span style="font-size: 12pt;" lang="EN-US">idtr</span><span style="font-size: 12pt; font-family: 宋体;">的值被保存在内存</span><span style="font-size: 12pt;" lang="EN-US">loc</span><span style="font-size: 12pt; font-family: 宋体;">中:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 37.4pt; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">asm("sidt %0/n" : :"m"(loc));<p></p></span></p> </div> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">3.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt; font-family: 宋体;">匹配(数字)约束</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">有时候,一个变量同时作为输入和输出的变量。这样的情况在内联汇编里可以用“匹配约束”来说明:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span>asm ("incl %0" :"=a"(var):"0"(var));<p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">上一节,我们看到了一些关于操作数的例子。而这个例子是为了说明匹配约束,寄存器</span><span style="font-size: 12pt;" lang="EN-US">%eax</span><span style="font-size: 12pt; font-family: 宋体;">同时作为输入和输出的变量。输入的</span><span style="font-size: 12pt;" lang="EN-US">var</span><span style="font-size: 12pt; font-family: 宋体;">被读到</span><span style="font-size: 12pt;" lang="EN-US">%eax</span><span style="font-size: 12pt; font-family: 宋体;">里,在</span><span style="font-size: 12pt;" lang="EN-US">%eax</span><span style="font-size: 12pt; font-family: 宋体;">自增后,</span><span style="font-size: 12pt;" lang="EN-US">%eax</span><span style="font-size: 12pt; font-family: 宋体;">的值又保存在</span><span style="font-size: 12pt;" lang="EN-US">var</span><span style="font-size: 12pt; font-family: 宋体;">里。在这里</span><span style="font-size: 12pt;" lang="EN-US">"0"</span><span style="font-size: 12pt; font-family: 宋体;">说明和第</span><span style="font-size: 12pt;" lang="EN-US">0</span><span style="font-size: 12pt; font-family: 宋体;">个输入变量使用同样的约束。也即是</span><span style="font-size: 12pt;" lang="EN-US">var</span><span style="font-size: 12pt; font-family: 宋体;">的值只保存在</span><span style="font-size: 12pt;" lang="EN-US">%eax</span><span style="font-size: 12pt; font-family: 宋体;">。这种约束能够用在:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">。输入和输出是同一个变量</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">。输入和输出的操作数实例是不重要的。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">使用匹配约束最重要的影响就是这样能够更加高效地利用可用的寄存器。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">其它被使用的约束有:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">1. "m"</span><span style="font-size: 12pt; font-family: 宋体;">:允许使用一个内存操作数,通常这个内存的地址可以是机器支持的任何值。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 42pt; text-indent: -42pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">2. "o"</span><span style="font-size: 12pt; font-family: 宋体;">:允许使用一个内存操作数,不过这个地址必须是可移位的。例如,这个地址增加一个较小的位移后,这个地址还是可用的。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">3. "V"</span><span style="font-size: 12pt; font-family: 宋体;">:一个内存操作数,它是不可移位的。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 42pt; text-indent: -42pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">4. "i"</span><span style="font-size: 12pt; font-family: 宋体;">:允许使用一个立即整型数(一个常数),这包括一个符号常量,它的值在汇编时知道。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">5. "n"</span><span style="font-size: 12pt; font-family: 宋体;">:允许使用一个立即整型数,它是一个已知的数字值。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">6. "g"</span><span style="font-size: 12pt; font-family: 宋体;">:允许使用任意通用寄存器、内存和立即数。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">下面的约束是</span><span style="font-size: 12pt;" lang="EN-US">x86</span><span style="font-size: 12pt; font-family: 宋体;">专用的:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">1.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“r”</span><span style="font-size: 12pt; font-family: 宋体;">:寄存器操作数据约束;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">2.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“q”</span><span style="font-size: 12pt; font-family: 宋体;">:寄存器</span><span style="font-size: 12pt;" lang="EN-US">a</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">b</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">c</span><span style="font-size: 12pt; font-family: 宋体;">、</span><span style="font-size: 12pt;" lang="EN-US">d</span><span style="font-size: 12pt; font-family: 宋体;">;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">3.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“I”</span><span style="font-size: 12pt; font-family: 宋体;">:</span><span style="font-size: 12pt;"> </span><span style="font-size: 12pt; font-family: 宋体;">常量</span><span style="font-size: 12pt;" lang="EN-US">0</span><span style="font-size: 12pt; font-family: 宋体;">到</span><span style="font-size: 12pt;" lang="EN-US">31</span><span style="font-size: 12pt; font-family: 宋体;">;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">4.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“J”</span><span style="font-size: 12pt; font-family: 宋体;">:</span><span style="font-size: 12pt;"> </span><span style="font-size: 12pt; font-family: 宋体;">常量</span><span style="font-size: 12pt;" lang="EN-US">0</span><span style="font-size: 12pt; font-family: 宋体;">到</span><span style="font-size: 12pt;" lang="EN-US">63</span><span style="font-size: 12pt; font-family: 宋体;">;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">5.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“K”</span><span style="font-size: 12pt; font-family: 宋体;">:</span><span style="font-size: 12pt;" lang="EN-US">0xff</span><span style="font-size: 12pt; font-family: 宋体;">;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">6.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“L”</span><span style="font-size: 12pt; font-family: 宋体;">:</span><span style="font-size: 12pt;" lang="EN-US">0xffff</span><span style="font-size: 12pt; font-family: 宋体;">;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">7.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“M”</span><span style="font-size: 12pt; font-family: 宋体;">:</span><span style="font-size: 12pt;" lang="EN-US">0, 1, 2, 3</span><span style="font-size: 12pt; font-family: 宋体;">;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">8.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“N”</span><span style="font-size: 12pt; font-family: 宋体;">:</span><span style="font-size: 12pt;" lang="EN-US">0</span><span style="font-size: 12pt; font-family: 宋体;">到</span><span style="font-size: 12pt;" lang="EN-US">255</span><span style="font-size: 12pt; font-family: 宋体;">的常量;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">9.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“f”</span><span style="font-size: 12pt; font-family: 宋体;">:浮点数寄存器;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">10.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“t”</span><span style="font-size: 12pt; font-family: 宋体;">:第一个浮点数寄存器;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">11.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“u”</span><span style="font-size: 12pt; font-family: 宋体;">:第二个浮点数寄存器;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; text-indent: -18pt; line-height: 20pt;"><!--[if !supportLists]--><span style="font-size: 12pt;" lang="EN-US"><span style="">12.<span style='font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;'> </span></span></span><!--[endif]--><span style="font-size: 12pt;" lang="EN-US">“A”</span><span style="font-size: 12pt; font-family: 宋体;">:指定为寄存器</span><span style="font-size: 12pt;" lang="EN-US">a</span><span style="font-size: 12pt; font-family: 宋体;">或者</span><span style="font-size: 12pt;" lang="EN-US">d</span><span style="font-size: 12pt; font-family: 宋体;">,主要用于</span><span style="font-size: 12pt;" lang="EN-US">64</span><span style="font-size: 12pt; font-family: 宋体;">位的值;</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 18pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h2 style="margin: 0cm 0cm 0.0001pt;"> <a name="_Toc200964863"><span lang="EN-US">6.2 </span></a><span style=""><span style="font-family: 宋体;">约束修饰符</span></span> </h2> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">使用约束时,为了使对约束效果的控制更加精确,</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">为我们提供了约束修饰符。常用的约束修饰符如下:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">1. "=" <span style=""></span>: </span><span style="font-size: 12pt; font-family: 宋体;">意味着操作数对于这个指令只写,之前的值被放弃并且被输入值代替。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="margin-left: 48pt; text-indent: -48pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">2. "&amp;" : </span><span style="font-size: 12pt; font-family: 宋体;">意味着操作数在</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表中,并且在被用来作为输入操作数之前就已经被改过。因此操作数不能作为输入操作数存放在寄存器里。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">上面的列表和说明并不完全,学习例子能够更好地了解到内联汇编的使用方法。下一章我们将会学习一些例子,这些例子里有更多关于</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表和约束。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h1 style="margin: 0cm 0cm 0.0001pt; text-align: center;" align="center"> <a name="_Toc200964864"><span lang="EN-US">7. </span></a><span style=""><span style="font-family: 宋体;">一些有用的诀窍</span></span> </h1> <p class="MsoNormal"><span lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">上面所说的覆盖了</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">内联汇编的基本原理,现在我们开始关注一些简单的例子。用宏来写内联汇编函数总是方便的。我们能在内核代码里找到很多内联汇编函数。(</span><span style="font-size: 12pt;" lang="EN-US">/usr/src/linux/include/asm/*.h</span><span style="font-size: 12pt; font-family: 宋体;">)</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">、首先我们以一个简单的例子开始。我们要写一个程序对两个数据进行相加。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 0cm; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">int main(void)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">{<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>int foo = 10, bar = 15;<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>__asm__ __volatile__("addl<span style=""> </span>%%ebx,%%eax"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>:"=a"(foo)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>:"a"(foo), "b"(bar)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>printf("foo+bar=%d/n", foo);<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>return 0;<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">}<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">上面的例子我们把</span><span style="font-size: 12pt;" lang="EN-US">foo</span><span style="font-size: 12pt; font-family: 宋体;">存放到</span><span style="font-size: 12pt;" lang="EN-US">%eax</span><span style="font-size: 12pt; font-family: 宋体;">,</span><span style="font-size: 12pt;" lang="EN-US">bar</span><span style="font-size: 12pt; font-family: 宋体;">到</span><span style="font-size: 12pt;" lang="EN-US">%ebx</span><span style="font-size: 12pt; font-family: 宋体;">,并且把结果放到</span><span style="font-size: 12pt;" lang="EN-US">%eax</span><span style="font-size: 12pt; font-family: 宋体;">。符号</span><span style="font-size: 12pt;" lang="EN-US">"="</span><span style="font-size: 12pt; font-family: 宋体;">说明它是一个输出寄存器。我们也可以用另一种方式给变量加一个数值</span><span style="font-size: 12pt;" lang="EN-US">:<p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 0cm; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">__asm__ __volatile__(<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"<span style=""> </span>lock<span style=""> </span>;/n"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"<span style=""> </span>addl %1,%0 ;/n"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "=m"<span style=""> </span>(my_var)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "ir"<span style=""> </span>(my_int), "m" (my_var)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>:<span style=""> </span>/* no clobber-list */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<p></p></span></p> </div> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这是一个原子式的加法。我们可以去除指令</span><span style="font-size: 12pt;" lang="EN-US">"lock"</span><span style="font-size: 12pt; font-family: 宋体;">来去除它的原子性。在输出区域,</span><span style="font-size: 12pt;" lang="EN-US">"=m"</span><span style="font-size: 12pt; font-family: 宋体;">说明</span><span style="font-size: 12pt;" lang="EN-US">my_var</span><span style="font-size: 12pt; font-family: 宋体;">是一个输出并且存放在内存里。同样的,</span><span style="font-size: 12pt;" lang="EN-US">"ir"</span><span style="font-size: 12pt; font-family: 宋体;">说明</span><span style="font-size: 12pt;" lang="EN-US">my_int</span><span style="font-size: 12pt; font-family: 宋体;">是一个数字并且应该放在某些寄存器里。</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表上没有寄存器。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">、现在我们执行一些程序在变量或者寄存器上并且比较它们的值。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 0cm; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">__asm__ __volatile__(<span style=""> </span>"decl %0; sete %1"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "=m" (my_var), "=q" (cond)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "m" (my_var) <p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "memory"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">my_var</span><span style="font-size: 12pt; font-family: 宋体;">的值自减</span><span style="font-size: 12pt;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">,如果自减的结果是</span><span style="font-size: 12pt;" lang="EN-US">0</span><span style="font-size: 12pt; font-family: 宋体;">,那么变量</span><span style="font-size: 12pt;" lang="EN-US">cond</span><span style="font-size: 12pt; font-family: 宋体;">的值被设置。我们能够加入一句</span><span style="font-size: 12pt;" lang="EN-US">"lock;/n/t"</span><span style="font-size: 12pt; font-family: 宋体;">来增加程序的原子性。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">同理,我们可以使用</span><span style="font-size: 12pt;" lang="EN-US">"incl %0"</span><span style="font-size: 12pt; font-family: 宋体;">来代替</span><span style="font-size: 12pt;" lang="EN-US">"decl %0"</span><span style="font-size: 12pt; font-family: 宋体;">,来自增</span><span style="font-size: 12pt;" lang="EN-US">my_var</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">说明:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">(i)my_var</span><span style="font-size: 12pt; font-family: 宋体;">是在内存里的一个变量</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">(ii)cond</span><span style="font-size: 12pt; font-family: 宋体;">是寄存器</span><span style="font-size: 12pt;" lang="EN-US">eax, ebx, ecx</span><span style="font-size: 12pt; font-family: 宋体;">和</span><span style="font-size: 12pt;" lang="EN-US">edx</span><span style="font-size: 12pt; font-family: 宋体;">里的任一个</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">(iii)</span><span style="font-size: 12pt; font-family: 宋体;">我们能看到</span><span style="font-size: 12pt;" lang="EN-US">"memorg"</span><span style="font-size: 12pt; font-family: 宋体;">是在</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表上。例如:代码修改内存的内容。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">3</span><span style="font-size: 12pt; font-family: 宋体;">、怎么设置,请空一个寄存器的任一个二进制位。作为一个技巧,请看下面的例子:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 0cm; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">__asm__ __volatile__(<span style=""> </span>"btsl %1,%0"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "=m" (ADDR)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "Ir" (pos)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "cc"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span></span><span style="font-size: 12pt; font-family: 宋体;">在上面的例子里,内存“</span><span style="font-size: 12pt;" lang="EN-US">ADDR</span><span style="font-size: 12pt; font-family: 宋体;">”的第</span><span style="font-size: 12pt;" lang="EN-US">pos</span><span style="font-size: 12pt; font-family: 宋体;">个位被设置为</span><span style="font-size: 12pt;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">。我们可以用“</span><span style="font-size: 12pt;" lang="EN-US">btrl</span><span style="font-size: 12pt; font-family: 宋体;">”代替“</span><span style="font-size: 12pt;" lang="EN-US">btsl</span><span style="font-size: 12pt; font-family: 宋体;">”来清空这个位。</span><span style="font-size: 12pt;" lang="EN-US">pos</span><span style="font-size: 12pt; font-family: 宋体;">的约束符“</span><span style="font-size: 12pt;" lang="EN-US">Ir</span><span style="font-size: 12pt; font-family: 宋体;">”说明</span><span style="font-size: 12pt;" lang="EN-US">pos</span><span style="font-size: 12pt; font-family: 宋体;">在一个寄存器里面,并且它的值的范围为是</span><span style="font-size: 12pt;" lang="EN-US">0</span><span style="font-size: 12pt; font-family: 宋体;">到</span><span style="font-size: 12pt;" lang="EN-US">31</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">4</span><span style="font-size: 12pt; font-family: 宋体;">、现在我们来看看一些复杂但是有用的功能——字符串拷贝。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 0cm; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">static inline char * strcpy(char * dest,const char *src)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">{<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">int d0, d1, d2;<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">__asm__ __volatile__(<span style=""> </span>"1:/tlodsb/n/t"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"stosb/n/t"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span><span style=""></span>"testb %%al,%%al/n/t"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"jne 1b"<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "=&amp;S" (d0), "=&amp;D" (d1), "=&amp;a" (d2)<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "0" (src),"1" (dest) <p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "memory");<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">return dest;<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">}<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span></span><span style="font-size: 12pt; font-family: 宋体;">拷贝源的地址存放到</span><span style="font-size: 12pt;" lang="EN-US">esi</span><span style="font-size: 12pt; font-family: 宋体;">,拷贝目标的地址到</span><span style="font-size: 12pt;" lang="EN-US">edi</span><span style="font-size: 12pt; font-family: 宋体;">。紧接着开始拷贝。遇到</span><span style="font-size: 12pt;" lang="EN-US">0</span><span style="font-size: 12pt; font-family: 宋体;">时,拷贝结束。约束符</span><span style="font-size: 12pt;" lang="EN-US">”&amp;S”, ”&amp;D”, ”&amp;a”</span><span style="font-size: 12pt; font-family: 宋体;">说明寄存器</span><span style="font-size: 12pt;" lang="EN-US">esi, edi, eax</span><span style="font-size: 12pt; font-family: 宋体;">是之前被用到的</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表。也即是说,在函数结束之前它们的内容会被改变。内存在</span><span style="font-size: 12pt;" lang="EN-US">clobber</span><span style="font-size: 12pt; font-family: 宋体;">列表的原因也是显而易见的。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span></span><span style="font-size: 12pt; font-family: 宋体;">下面是一个类似的函数移动一块双字节,函数被声明为宏:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 0cm; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">#define mov_blk(src, dest, numwords) /<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">__asm__ __volatile__ (<span style=""> </span>/<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span><span style=""></span>"cld/n/t"<span style=""> </span>/<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"rep/n/t"<span style=""> </span>/<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"movsl"<span style=""> </span>/<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>:<span style=""> </span>/<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span><span style=""></span>: "S" (src), "D" (dest), "c" (numwords)<span style=""> </span>/<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "%ecx", "%esi", "%edi"<span style=""> </span>/<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>)<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">5</span><span style="font-size: 12pt; font-family: 宋体;">、在</span><span style="font-size: 12pt;" lang="EN-US">Linux</span><span style="font-size: 12pt; font-family: 宋体;">内核里,系统调用就是用内联汇编来实现的。现在我们来看看一个系统调用是怎么实现的。所有的系统调用都被写成宏(在文件</span><span style="font-size: 12pt;" lang="EN-US">Linux/unistd.h</span><span style="font-size: 12pt; font-family: 宋体;">里)。例如,一个被定义为宏的有三个参数的系统调用如下:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 0cm; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) /<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">type name(type1 arg1,type2 arg2,type3 arg3) /<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">{ /<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">long __res; /<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">__asm__ volatile (<span style=""> </span>"int $0x80" /<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "=a" (__res) /<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>: "0" (__NR_##name),"b" ((long)(arg1)),"c" ((long)(arg2)), /<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>"d" ((long)(arg3))); /<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">__syscall_return(type,__res); /<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">}<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span></span><span style="font-size: 12pt; font-family: 宋体;">系统调用号被放到寄存器</span><span style="font-size: 12pt;" lang="EN-US">eax</span><span style="font-size: 12pt; font-family: 宋体;">里,然后三个参数放到</span><span style="font-size: 12pt;" lang="EN-US">ebx, ecx, edx</span><span style="font-size: 12pt; font-family: 宋体;">里。最后是指令</span><span style="font-size: 12pt;" lang="EN-US">”int $0x80”</span><span style="font-size: 12pt; font-family: 宋体;">调用这个系统调用。返回值被放到</span><span style="font-size: 12pt;" lang="EN-US">eax</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span></span><span style="font-size: 12pt; font-family: 宋体;">每一个系统调用都可以用类似的方法实现。</span><span style="font-size: 12pt;" lang="EN-US">”Exit”</span><span style="font-size: 12pt; font-family: 宋体;">是一个只有一个参数的系统调用,我们来看看它的代码是怎样的:</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <div style="border-style: solid; border-color: black; border-width: 1pt 1.5pt 1.5pt 1pt; padding: 2pt; background: rgb(231, 231, 231) none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 0cm; margin-right: 37.4pt;"> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">{<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>asm("movl $1,%%eax; <span style=""></span>/* SYS_exit is 1 */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>xorl %%ebx,%%ebx;<span style=""> </span>/* Argument is in ebx, it is 0 */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>int<span style=""> </span>$0x80"<span style=""> </span>/* Enter kernel mode */<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><span style=""> </span>);<p></p></span></p> <p class="MsoNormal" style="border: medium none ; padding: 0cm; background: rgb(231, 231, 231) none repeat scroll 0% 0%; margin-right: 0cm; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US">}<p></p></span></p> </div> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><span style=""> </span></span><span style="font-size: 12pt; font-family: 宋体;">它的调用号是</span><span style="font-size: 12pt;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">,参数是</span><span style="font-size: 12pt;" lang="EN-US">0</span><span style="font-size: 12pt; font-family: 宋体;">。所以执行</span><span style="font-size: 12pt;" lang="EN-US">”int $0x80”</span><span style="font-size: 12pt; font-family: 宋体;">时,我们将</span><span style="font-size: 12pt;" lang="EN-US">eax</span><span style="font-size: 12pt; font-family: 宋体;">设置为</span><span style="font-size: 12pt;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">,</span><span style="font-size: 12pt;" lang="EN-US">ebx</span><span style="font-size: 12pt; font-family: 宋体;">为</span><span style="font-size: 12pt;" lang="EN-US">0</span><span style="font-size: 12pt; font-family: 宋体;">。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h1 style="margin: 0cm 0cm 0.0001pt; text-align: center;" align="center"> <a name="_Toc200964865"><span lang="EN-US">8. </span></a><span style=""><span style="font-family: 宋体;">结束语</span></span> </h1> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">这篇文章介绍</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">内联汇编的基础。只要你能理解它的基本概念,就不难靠自己一步步学习。我们已经学习了一些有助于理解</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">内联汇编特性的常用例子。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">内联是一个很大的内容,同时这个文章在这个意义上并不完整。关于语法的更多的细节可以在</span><span style="font-size: 12pt;" lang="EN-US">GNU Assembler</span><span style="font-size: 12pt; font-family: 宋体;">的官方文档上找到。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">当然,</span><span style="font-size: 12pt;" lang="EN-US">Linux</span><span style="font-size: 12pt; font-family: 宋体;">内核里大量地用到了</span><span style="font-size: 12pt;" lang="EN-US">GCC</span><span style="font-size: 12pt; font-family: 宋体;">内联汇编。所以我们可以在源代码上找到各种各样的例子。它们能为我带来很多的帮助。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="text-indent: 21pt; line-height: 20pt;"><span style="font-size: 12pt; font-family: 宋体;">如果你找到任何的排版出错,或者过时的信息,请让我们都知道。</span><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <h1 style="margin: 0cm 0cm 0.0001pt; text-align: center;" align="center"> <a name="_Toc200964866"><span lang="EN-US">9. </span></a><span style=""><span style="font-family: 宋体;">参考</span></span> </h1> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">1. Brennan’s Guide to Inline Assembly <p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">2. Using Assembly Language in Linux <p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">3. Using as, The GNU Assembler <p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">4. Using and Porting the GNU Compiler Collection (GCC) <p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US">5. Linux Kernel Source<p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p> <p class="MsoNormal" style="line-height: 20pt;"><span style="font-size: 12pt;" lang="EN-US"><p></p></span></p></defjc></rmargin></lmargin></dispdef></smallfrac>
分享到:
评论

相关推荐

    wheel-0.13.0-py2.py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    三菱PLC例程源码ST反弹限位器焊机14

    三菱PLC例程源码ST反弹限位器焊机14本资源系百度网盘分享地址

    asp代码asp教师信息管理系统(源代码+论文)

    asp代码asp教师信息管理系统(源代码+论文)本资源系百度网盘分享地址

    tensorflow_serving_api_gpu-2.3.3-py2.py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    tensorflow_serving_api-2.0.0-py2.py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    tensorflow_model_remediation-0.1.6.tar.gz

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    三菱PLC例程源码PID程序

    三菱PLC例程源码PID程序本资源系百度网盘分享地址

    tensorflow_recommenders-0.5.0-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于ssm珠宝首饰交易平台.zip

    基于ssm珠宝首饰交易平台.zip

    tensorflow_protobuf-2.11.0-py3-none-any.whl

    算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于ssm的小区物业管理系统.zip

    基于ssm的小区物业管理系统.zip

    tensorflow_serving_api_gpu-2.2.0-py2.py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于javaweb+ssm的企业人事信息管理系统.zip

    基于javaweb+ssm的企业人事信息管理系统.zip

    asp代码asp旅游信息管理系统(源代码+论文)

    asp代码asp旅游信息管理系统(源代码+论文)本资源系百度网盘分享地址

    WeRoBot-1.7.0-py3-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    三菱PLC例程源码步进对标定位

    三菱PLC例程源码步进对标定位本资源系百度网盘分享地址

    (完整word版)单片机_温度控制系统_外文翻译_外文文献_英文文献_中英翻译.doc

    (完整word版)单片机_温度控制系统_外文翻译_外文文献_英文文献_中英翻译.doc

    tensorflow_transform-0.1.8-py2-none-any.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    asp代码ASP基于Web的C语言教学系统的研究与实现(源代码+论文)

    asp代码ASP基于Web的C语言教学系统的研究与实现(源代码+论文)本资源系百度网盘分享地址

    三菱PLC例程源码String-32bit-Logging-Mitsubishi-cn

    三菱PLC例程源码String_32bit_Logging_Mitsubishi_cn本资源系百度网盘分享地址

Global site tag (gtag.js) - Google Analytics