0

変数をアセンブリからCに、Cをアセンブリに渡すだけです。

問題は、固定メモリアドレス指定を使用したくないことです(つまり、値を特定の場所に配置し、ポインターを使用してその特定の場所にアクセスします)。

当初はレジスターが使えると思っていたのですが、全部で16個しかありません!渡したい値が16個以上ある可能性があります。

だから私が考えることができる次のことは、値をスタックにプッシュすることです。しかし、これは、Cでアクセスするためにインラインアセンブリを使用する必要があることを意味しますか?このようなもの:

   asm ( assembler template 
       : output operands                  /* optional */
       : input operands                   /* optional */
       : list of clobbered registers      /* optional */
       );

これについて他の方法はありますか?誰かが私に何かをスタックに置き、Cコードでそれにアクセスするという本当に簡単な例を教えてもらえますか?

アセンブリヌーブ!

4

1 に答える 1

4

通常の C 関数を宣言して C から呼び出し、コンパイラが引数を自動的に処理できるようにすることはできますか?

その場合は、 を使用してその関数を実装asmし、名前付きの C 引数リスト変数を直接参照します。

たとえば、68881 の fsinx 命令を使用すると、次のようになります

float my_fsinx(float angle)
{
    float result;
    asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));
    return result;
}

この例は、 GCC Extended Asm docs に基づいており、さらにいくつかの例を見つけることができるはずです。


コメントに従って、単純なポインターとカウントを介して可変数の引数を処理するように拡張されました...

float my_fsinx_sum(float *angles, int num_angles)
{
    float result, sum;
    int i;
    for (i=0, sum=0; i < num_angles; ++i)
    {
        asm ("fsinx %1,%0" : "=f" (result) : "f" (angles[i]));
        sum += result;
    }
    return sum;
}

いいえ、なぜたくさんの角度のサインを合計したいのかわかりませんが、うまくいけばアイデアが得られます. 私はこれを試していないのでangles[i]、asm の前に値をローカルの float 変数にコピーする必要がある可能性があります。試してみてください。


可変引数リスト関数を使用することもできますが、それはもう少し複雑です。あなたが達成しようとしていることと、すでに試したことについての詳細がなければ、どちらが優れているかはわかりません。

編集- わかりました、上記のコメントを見ましたが、変数引数リスト関数は絶対に必要ありません。これらには、呼び出しサイトでハードコーディングされた多くの引数がまだあります。

于 2012-07-18T15:12:30.677 に答える