Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> 情報GCCインラインアセンブリ

情報GCCインラインアセンブリ

  
の一部

インラインアセンブラでは、C言語の式は、オペランドアセンブラ命令として指定することができるが、C言語表現に読み込まれるどのレジスタ値を管理しないように、そしてどのように結果をC言語の変数に書き戻すプログラムのC言語式とアセンブリ命令のオペランドの対応関係を指定するだけで、GCCが自動的にコードを挿入して必要な操作を完了します。別名; __asm__ __volatile __(" HLT");' __ ASM __&'は、'と、次のコードのインラインアセンブリことを示し、ASM'&'である__ ASM __&':

1、単純なインラインアセンブリの実施形態。 ' __ volatile __'は、コンパイラがコードを最適化しないことを示し、以下の命令はそのまま残ります。" volatile"はその別名です。括弧内には組立説明書があります。インラインアセンブラでは、C言語式は、オペランドのアセンブリ命令として指定することができ、そしてどのようにないどのレジスタの値は、C言語の表現に読み込まれ、そしてバックCの変数に結果を書く方法を、あなただけ教えて管理するために、プログラム内のC言語式とアセンブリ命令オペランドの対応は、GCCが自動的にコードを挿入して必要な操作を完了させることになります。別名; __asm__ __volatile __(" HLT");' __ ASM __&'は、'と、次のコードのインラインアセンブリことを示し、ASM'&'である__ ASM __&':

1、単純なインラインアセンブリの実施形態。 ' __ volatile __'は、コンパイラがコードを最適化しないことを示し、以下の命令はそのまま残ります。" volatile"はその別名です。括弧内には組立説明書があります。

2、第アセンブラ命令テンプレートとC言語命令の発現に関連する動作の数で書かれたインラインアセンブリインラインアセンブリを使用して、例えば、これらの操作上の制限がありGCCを伝えます。例えば、次のアセンブリ文で:__asm__ __violate__(" MOVL%1、%0":" = R"(結果):" M"(入力));

' MOVL%1 %0'命令テンプレートである;'%0'と'%1'命令を表すオペランドは、それぞれ、プレースホルダとしてC言語表現と命令オペランドでインラインアセンブリをいいます。括弧で囲まれた後続の命令テンプレートは、C言語表現、本実施形態の2つだけである;結果'と'入力'、出現順序、それぞれ、命令のオペランド'&'%0',&'。 %1&'は、次の順序に注意し、対応する:%1'、&'に対応%0';第二の発現&'に対応する最初のCの発現を、ように、そしてせいぜいオペランドそれぞれ10、'%0'、'%1"…< '%9>各オペランドの前には引用符で囲まれたストリングがあり、そのストリングの内容はオペランドに関する制限事項または要件です。 &Ldquoは、その結果'制限文字列&'を上記; = R'、請求'結果' ='表す&' R'のための&'必要性を表明し、その結果'出力オペランド、&'は、汎用レジスタに関連付けられています、値がレジスタに最初の操作の数を読み取り、その命令に対応するレジスタを使用してではなく、'&結果'それ自体、もちろん、指令値が変数&'に登録する必要が後に行われる;&結果'、表面が命令は直接resultに作用し、実際にはGCCは暗黙の処理を行うので、より少ない命令を書くことができます。 &Ldquoは、入力'上記' R'式レジスタを置く必要性を表し、次にレジスタは、演算命令に参加します。 Cの式や変数とレジスタの関係はGCCによって自動的に処理されるので、GCCがそれをどのように処理するかをガイドするために制限された文字列を使用するだけです。制限文字命令がオペランドを必要と一致しなければならない、または間違っているであろう生成されたアセンブリコードは、読者は上記の例2&'であってもよく; R' M'で&'置換されている(mは放電動作の数を表します。レジスタではなく、メモリでは、コンパイルの結果は次のようになります。movl input、resultこれは不正な命令であることは明らかです。そのため、制限文字列は命令のオペランド要件と一致する必要があります。例えばMOVL命令は直ちに、等をカウントレジスタを登録する登録できますが、使用することができない&'従ってメモリ - メモリ操作、2つのオペランドを許可せず、M&'は、文字として定義されます。インラインアセンブラ構文を次のように__asmの__(アセンブリ文テンプレート:出力セクション:入力部:破壊記述部)は、4つの部品:アセンブラ文テンプレート、出力部、入力部、損傷記述部、':&'を使用して、各部分、グリッドオープンバックの一部であれば、オプション文、他の三つの部分の、基本的なテンプレートのコンパイル、フロントセクションが空である一方で、また使用&'する必要が;:'グリッドオープン、コンテンツの対応する部分は空です。たとえば、次のように__asm__ __volatile __(" CLI" :::"メモリ")

1、usingステートメントの間に文のアセンブラ文のテンプレートアセンブリ文のテンプレートアセンブラシーケンス、';',' \\ n'または' \\ n \\ t'区切ります。命令内のオペランドは、プレースホルダーを使用して、次の名前を持つ最大10個のオペランドプレースホルダーを持つC言語変数を参照できます:%0、%1、…、%9。ワードまたはバイトのオペランドとして使用される命令バイトまたはワードに記載のプレースホルダは、全体が長いタイプ(4バイト)であると考えられる、オペランド命令を表し、その動作が適用されてもよいですの場合、デフォルトは下位ワードまたは下位バイトです。バイト操作は、明示的に低いバイトまたはバイト時間によって指定することができます。 %のH1:B'下位バイトを表し、' H&'の上位バイトを表す、例えば%は、シリアル番号と文字、&'との間に介在しています。

2出力部の出力部は、出力オペランド、異なるオペランド記述子コンマオープングリッドを記述し、各オペランド記述子は、C言語の文字列と変数によって定義されます。各出力オペランドの修飾文字列には、それが出力オペランドであることを示す' ='を含める必要があります。例:__asm__ __volatile __(" pushfl; POPLの%0; CLI":" = G"(x))をGCCがどのように、レジスタを割り当てる方法を、これらの条件に応じて決定することができるように、ディスクリプタ列は、制約その変数を表します処理コード命令オペランドCとCの変数または式の間に必要なリンクを生成します。

3、入力部の入力部が、異なるオープンセル記述子のオペランドの間にコンマを使用して、入力オペランドを記述し、各オペランド記述子は、C言語の文字列と言語表現、または可変組成物Cによって定義されます。実施例1:__asm__ __volatile__("%0" LIDT; ::" M"(real_mode_idt));例えば、2つ(bitops.h):静的__inline__ボイド__set_bit(int型NR、揮発性ボイド*のADDR){__asmの__(" BTSL %1、%0":" = M"(ADDR):" IR"(NR));}

実施例関数の後にある(* ADDR)NRビットが1に設定されています。 C言語変数、C言語に対応する第二のプレースホルダ%1個のNR変数に対応する最初のプレースホルダ%0 ADDR。したがって、擬似コードと同等以上の以下のアセンブリコードステートメント:BTSLのNR、ADDR、命令の二つのオペランドは、すべてのメモリ変数ではなく、定義されたNR&'として指定し、従って文字列; IR'、そして直ちにNRまたはメモリ変数ADDRに2つだけのオペランドように、関連するレジスタの数。

Copyright © Windowsの知識 All Rights Reserved