2

別の質問で、コードを移植する際に問題が発生しました。

unsigned long stack[] = { 1, 23, 33, 43 };

/* save all the registers and the stack pointer */
unsigned long esp;
asm __volatile__ ( "pusha" );
asm __volatile__ ( "mov %%esp, %0" :"=m" (esp));

for( i = 0; i < sizeof(stack); i++ ){
    unsigned long val = stack[i];
    asm __volatile__ ( "push %0" :: "m"(val) );
}

unsigned long ret = function_pointer();

/* restore registers and stack pointer */
asm __volatile__ ( "mov %0, %%esp" :: "m" (esp) );
asm __volatile__ ( "popa" );

64ビットプラットフォームと多くの人に、32ビットと64ビットの呼び出し変換の違いと移植性の問題のために、代わりにsetcontext( )関数とmakecontext()関数を使用する必要があると言われました。

ええと、私は本当に有用なドキュメントをオンラインで見つけることができません、または少なくともこれを実装するために必要な種類ではないので、これらの関数を使用して引数をスタックにプッシュし、ジェネリック関数ポインターを呼び出し、戻り値を取得するにはどうすればよいですか?その後、レジスタを復元しますか?

4

2 に答える 2

2

最後に、libffiを使用しています。

于 2010-04-07T10:48:02.120 に答える
1

ウィキペディアのページにはまともながあります。

これはあなたが探している解決策ではありません。 makecontext配列ではなく、可変引数リストを取ります。したがって、それを呼び出すには、配列を引数リストに変換する関数が必要です。それがあなたが望んmakecontextでいることなので、あなたがそれを使うことができる時までに、あなたはすでにあなたの問題を解決しました。

解決策はわかりませんが、これは行き止まりです。

于 2010-03-26T00:38:00.790 に答える