2009-09-03 16 views
6

Następujący GCC inline asm pochodzi z biblioteki Coco LuaJita. Czy ktoś może wyjaśnić, co robi, wiersz po linii?Wyjaśnienie kodu Asm:

static inline void coco_switch(coco_ctx from, coco_ctx to) 
{ 
    __asm__ __volatile__ (
    "movl $1f, (%0)\n\t" 
    "movl %%esp, 4(%0)\n\t" 
    "movl %%ebp, 8(%0)\n\t" 
    "movl 8(%1), %%ebp\n\t" 
    "movl 4(%1), %%esp\n\t" 
    "jmp *(%1)\n" "1:\n" 
    : "+S" (from), "+D" (to) : : "eax", "ebx", "ecx", "edx", "memory", "cc"); 
} 

Dzięki

Odpowiedz

10

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.

+2

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

+2

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

+0

Czy przełącznik kontekstowy działa również w C++ lub czy muszę napisać coś innego na ten temat? – jameszhao00

2

DevSolar ma właściwą odpowiedź - dodam tylko, że można dowiedzieć się nieco więcej o tym, co EBP i ESP są dla here.