5

GCC インライン アセンブラーでは、入力制約と出力制約を別々にリストする必要があります。ただし、マニュアルによると、出力制約の前に「=」を指定する必要もあります「このオペランドは書き込み専用です」という意味です。修飾子なしは読み取り専用を意味します。さて、読み取り専用/書き込み専用と入力/出力には微妙な違いがあるように思われます。したがって、これらは異なる方法で扱われます。しかし、「入力」と「読み取り専用」が同一でない場合、gcc は実際にどのように区別するのでしょうか? 入力制約に「=」を付けたり、出力制約でそれを省略したりするケースはありますか? 「+」(読み取りと書き込みの両方) パラメーターの場合、このパラメーターを入力セクションと出力セクションに配置することに違いはありますか? パラメータを「+」制約として指定することと、次のように指定することの間に違いはありますか?

"some instruction" : "=r" : 0 :
4

1 に答える 1

3

gcc-4.7.2 の texinfo マニュアルでは、「=」は出力制約に必須であり、出力オペランドの「+」は入力にもなり得ることを意味すると述べています。ルールはやや複雑なので、マニュアルをよく読んでください。

私が理解しているように、入力の '=' は意味がありません (書き込みのみの 入力?!)。入力が変更された場合、それを出力としてリストし (いくつかあるかもしれません!)、おそらくそれをジャンク変数に関連付け、数の制約によって出力と結び付けます。

はい、これはかなり紛らわしいです。制約は、操作を記述するために GCC が使用する内部言語に由来し、時間の経過とともに進化してきました (いくつかの下位互換性がスパイスのためにスローされています)。いくつかのスタイルを採用し、それに固執します。コンパイラはasm()スニペットをブラック ボックスとして扱い、プリプロセッサ マクロが処理されるのと同じように、指定された場所で引数を置き換えるだけでコピーされることに注意してください。それはしません命令のアドレッシング モードが意味を成しているかどうかを確認してください。命令が現在のマシン向けのものである場合は、何もしません。マクロ展開してアセンブリ出力にコピーするテキストのみ。言いたいことを注意深く確認してください (できれば、命令のアドレス指定モードが許す限りリベラルであり、不要な制限に準拠するためにコンパイラーがゆがみを経験することは望ましくありませんが、命令が処理しないものは許可されません)。生成されたアセンブリを確認してください!

于 2013-02-04T17:42:07.127 に答える