Moja ASM jest nieco rozmyty o szczegółach, ale myślę, że mogę dać Ci ogólne pojęcie.
ESP: Wskaźnik stosu, EBP: Wskaźnik bazowy.
movl $1f, (%0)
Przenieś wartość 0x1f do parametru 0 (z).
movl %%esp, 4(%0)
Przenieś zawartość rejestru ESP do (z + 4).
movl %%ebp, 8(%0)
przenieść zawartość rejestrów do EBP (z + 8).
movl 8(%1), %%ebp
Przenieś zawartość (do + 8) do rejestru EBP.
movl 4(%1), %%esp
Przenieś zawartość (do + 4) do rejestru ESP.
jmp *(%1)
Przejdź do adresu zawartego w (do).
"1:" jest etykietą skoku.
"+ S" deklaruje parametr "źródło" (odczyt), "+ D" parametr miejsce docelowe (zapis). Lista rejestrów na końcu wyciągu to lista "clobber", lista rejestrów ewentualnie zmodyfikowana przez kod ASM, więc kompilator może podjąć kroki w celu zachowania spójności (tj. Nie polegając na np. ECX wciąż zawierającym tę samą wartość jak wcześniej).
Domyślam się, że coco_ctx oznacza "kontekst kokosowy". So: Funkcja zapisuje bieżącą ramkę stosu w strukturze "od" i ustawia ramkę stosu na to, co jest zapisane w strukturze "do". Zasadniczo przeskakuje z bieżącej funkcji do innej funkcji.
to dokładnie. Jednak nie przeskakuje on z jednej funkcji do drugiej: przeskakuje z jednego całego stosu wywołań do drugiego; to całkowicie zmienia konteksty wykonawcze. (Także składnia wbudowana w GCC, ale GCC jest dziwaczna.) – Crashworks
To jest składnia AT & T (http://wiki.osdev.org/Opcode_syntax) zawijana w składnię podobną do funkcji C (http://wiki.osdev.org/Inline_Assembly). Nie uwierzysz w to, ale ja naprawdę wolę to od "standardowej" składni Intel. ;-) – DevSolar
Czy przełącznik kontekstowy działa również w C++ lub czy muszę napisać coś innego na ten temat? – jameszhao00