setcontext и makecontext за извикване на указател на обща функция

В друг въпрос имах проблем с пренасянето на кода:

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 бита и преносимостта въпроси.

Е, наистина не мога да намеря никаква полезна документация онлайн или поне не тази, от която се нуждая, за да внедря това, така че как мога да използвам тези функции, за да изкарам аргументи в стека, да извикам указател на обща функция, да получа върнатата стойност и след това да възстановите регистрите?


person Simone Margaritelli    schedule 26.03.2010    source източник


Отговори (2)


Това ли е единственият начин? Не мога ли да накарам WindowState=WindowState.Maximized да работи както обикновено?
person Simone Margaritelli    schedule 07.04.2010

Страницата в Уикипедия има приличен пример.

Това не е решението, което търсите. makecontext не приема масив, а списък с променливи аргументи. И така, за да го извикате, имате нужда от функция за преобразуване на масив в списък с аргументи. Тъй като това е, за което искате makecontext, докато можете да го използвате, вече сте решили проблема си.

Не знам какво е решението, но това е задънена улица.

person R Samuel Klatchko    schedule 26.03.2010
comment
Добре, но КАК да вмъкна ulong стойности в стека? - person Simone Margaritelli; 26.03.2010
comment
Добре, разбрах, но проблемът е, че makecontext иска аргументите на функциите и не знам техния брой, може да са 2 аргумента или нито един, или 4 ... - person Simone Margaritelli; 26.03.2010