2016-06-20 1 views
0

gcc(Linuxの場合)でインラインアセンブラを使用しています。私はRCXレジスタ内の文字列のアドレスを書き込むために、この奇妙な構文を使用していますインラインgccアセンブラ(linux)で可変アドレスを渡す方法

  char *str="hello world"; 

      int main(int argc, char *argv[] 
      { 
      ... 
       asm("mov %0, %%rcx" 
         : 
         : "g" (str)); 
      ... 
      } 

: 私はこの簡単なプログラムを書いてきました。 しかし、バイナリを逆アセンブルすると、データが最初にraxで転送され、次にrcxで転送されることがわかります。 ...なぜ

  asm("mov _str, rcx") 

が、それは、Linuxのgccの上では動作しません:あなたが想像できるように、これは私のプログラムでは、いくつかのBORD効果を導入することができます...私は若い頃 は、私はそのような何かを書くために使用しました?

+0

GCCのインラインアセンブラを使用すると、新しいもので経験豊富なユーザーに問題が発生する可能性があります。まずMSVCのインラインアセンブラとは違って - GCCのインラインでは、実際にはテンプレート内の命令については何も知らないが、テキストの置換を行うことを除いては、入力が何であるか、出力は何か、リストにない他のレジスタ出力オペランドではclobberリスト内にある必要があります。これを行うには、_RCX_の値を出力制約のある変数に代入する必要があります。 –

+0

なぜあなたはstringのアドレスをRCXに入れようとしているのでしょうか?これはXYの問題かもしれません。インラインアセンブラで実際に何を達成しようとしていますか?もしそれが_C_で行えるのであれば、それはそこで行われるべきです。 –

+0

GCCの出力を '-O0'のような最適化なしで見ると、不必要なオーバーヘッド(余計な負荷とデータを不必要に前後に移動させる)が多く発生します。 –

答えて

-1
  char *str="hello world"; 
... 
      asm("mov _str, rcx") 

が、それは、Linuxのgccの上では動作しません...なぜ?

なぜgccのエラーメッセージにその理由があるのでしょうか。最も可能性の高い原因は

  • ノーアンダースコア

    は、パーセント記号がasm("mov str, %cx")作品のよう

何かレジスタ名の前に付加されなければならないグローバル変数名

  • の前に付加されている必要があります。

  • 関連する問題