2009-09-03 12 views
6

Der folgende GCC-Inline-Asm stammt aus der Coco-Bibliothek von LuaJit. Kann jemand eine Zeile für Zeile erklären, was er tut?Erklärung des Asm-Codes

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"); 
} 

Dank

Antwort

10

ist mein ASM ein bisschen unscharf über die Details, aber ich denke, dass ich Ihnen eine allgemeine Vorstellung geben kann.

ESP: Stapelzeiger, EBP: Basiszeiger.

movl $1f, (%0) 

Verschieben Sie den Wert 0x1f in Parameter 0 (von).

movl %%esp, 4(%0) 

Verschieben Sie den Inhalt des Registers ESP in (von + 4).

Verschieben Sie den Inhalt von Register EBP in (von + 8).

movl 8(%1), %%ebp 

Verschieben Sie den Inhalt von (bis + 8) in das Register EBP.

movl 4(%1), %%esp 

Verschieben Sie den Inhalt von (bis + 4) in das Register ESP.

jmp *(%1) 

Springe zu der in (to) enthaltenen Adresse.

Das "1:" ist eine Sprungmarke.

"+ S" deklariert einen "source" (lesen) -Parameter, "+ D" einen Ziel (schreib) -Parameter. Die Liste der Register am Ende der Anweisung ist die "Clobber" -Liste, eine Liste von Registern, die möglicherweise durch den ASM-Code modifiziert wurden, so dass der Compiler Schritte zur Aufrechterhaltung der Konsistenz durchführen kann (dh nicht darauf angewiesen, dass zB ECX immer noch denselben Wert enthält) wie vorher).

Ich denke, dass coco_ctx bedeutet "Coco-Kontext". Also: Die Funktion speichert den aktuellen Stack-Frame in der "from" -Struktur und setzt den Stack-Frame auf das, was in der "to" -Struktur gespeichert ist. Grundsätzlich springt es von der aktuellen Funktion in eine andere Funktion.

+2

, die genau richtig lernen können. Es geht nicht nur darum, von einer Funktion zur nächsten zu springen: Es springt von einem ganzen Call-Stack zum anderen; Es wird die Ausführungskontexte komplett umgeschaltet. (Gosh, aber GCC Inline Assembly Syntax ist bizarr.) – Crashworks

+2

Es ist AT & T-Syntax (http://wiki.osdev.org/Opcode_syntax) in eine C-Funktion-Aufruf-ähnliche Syntax (http://wiki.osdev.org/Inline_Assembly). Sie werden es nicht glauben, aber ich bevorzuge es tatsächlich über die "Standard" -Syntax von Intel. ;-) – DevSolar

+0

Funktioniert der Kontextwechsel auch für C++ oder muss ich etwas anderes für diesen Aufruf schreiben? – jameszhao00

2

DevSolar hat die richtige Antwort - ich werde nur hinzufügen, dass Sie für here. sind ein wenig mehr über das, was EBP und ESP