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