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