В другой вопрос У меня была проблема с портированием кода
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-битной платформе, и многие ребята сказали мне, что вместо этого я должен использовать функции setcontext и makecontext, установленные из-за различий в вызывающих преобразованиях между 32 и 64 битами и проблем переносимости.
Что ж, я действительно не могу найти какую-либо полезную документацию в Интернете, или, по крайней мере, не ту, которая мне нужна для реализации, поэтому как я могу использовать эти функции для переноса аргументов в стек, вызова общего указателя на функцию, получения возвращаемое значение, а затем восстановить регистры?