質問: アセンブリ言語を勉強しています。 C言語の中にasm文で命令をかく練習をしています。 ``` #include int test(int x) { __asm__(" \n\ movl %esp,%ebp \n\ movl x,%eax \n\ "); } main(){ int x; printf("整数を入力してください"); scanf("%d",&x); printf("%d\n",test(x)); } ``` 上のプログラムは、まだ書き途中なのですが、すでにエラーが出てしまっているので、質問させてください。 test関数では、xを引数としています。main関数で引数を渡します。 この引数xをasm文でレジスタに格納するにはどのようにしたら良いかわかりません。 上のプログラムだと、[movl x, %eax]の部分で、「xは定義されていません」とエラーが出てしまいます。 まだ、勉強を始めたばかりで、基本的な質問ですが、どうしても分からないので教えてほしいです。よろしくお願いします。
回答: インラインアセンブラって、アセンブラというより、コンパイラに依存する筈と思って、検索してみたら、○GCC x86インラインアセンブラ がありました。 > > 関数の引数はフレームポインタebpを使ってアクセスする > > asm ("movl 8(%ebp),%eax"); > > > との事。 "8(%ebp)"はintの第一引数 とすると、 > > movl %esp,%ebp \n\ > > movl x,%eax \n\ > > > は、 > > movl 8(%ebp) %eax > > > でしょうか? (サンプル、そのまんま、、元は、別の変数に入れていたが、、)