別の質問で、コードを移植する際に問題が発生しました。
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()関数を使用する必要があると言われました。
ええと、私は本当に有用なドキュメントをオンラインで見つけることができません、または少なくともこれを実装するために必要な種類ではないので、これらの関数を使用して引数をスタックにプッシュし、ジェネリック関数ポインターを呼び出し、戻り値を取得するにはどうすればよいですか?その後、レジスタを復元しますか?