2009-09-03 7 views
6

L'asm en ligne GCC suivant est tiré de la bibliothèque coco de LuaJit. Quelqu'un peut-il fournir une explication ligne par ligne de ce qu'il fait?Explication du code 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"); 
} 

Merci

Répondre

10

Mon ASM est un peu floue sur les détails, mais je pense que je peux vous donner une idée générale.

ESP: pointeur de pile, EBP: pointeur de base.

movl $1f, (%0) 

Déplacez la valeur 0x1f dans le paramètre 0 (à partir de).

movl %%esp, 4(%0) 

Déplacez le contenu du registre ESP dans (à partir de + 4).

movl %%ebp, 8(%0) 

Déplacez le contenu du registre EBP dans (à partir de + 8).

movl 8(%1), %%ebp 

Déplacez le contenu de (à + 8) dans le registre EBP.

movl 4(%1), %%esp 

Déplacez le contenu de (à + 4) dans le registre ESP.

jmp *(%1) 

Aller à l'adresse (en).

Le "1:" est une étiquette de saut. "+ S" déclare un paramètre "source" (lecture), "+ D" un paramètre destination (écriture). La liste des registres à la fin de l'instruction est la liste "clobber", une liste de registres éventuellement modifiée par le code ASM, donc le compilateur peut prendre des mesures pour maintenir la cohérence (ie ne pas compter sur ECX contenant toujours la même valeur comme avant).

Je suppose que coco_ctx signifie "contexte coco". Donc: La fonction enregistre le cadre de pile actuel dans la structure "de", et définit le cadre de la pile à ce qui est enregistré dans la structure "à". Fondamentalement, il passe de la fonction actuelle à une autre fonction.

+2

C'est tout à fait exact. Cependant, ce n'est pas seulement passer d'une fonction à l'autre: c'est passer d'une pile d'appels à une autre; cela change totalement les contextes d'exécution. (Aussi, mais la syntaxe d'assemblage en ligne de GCC est bizarre.) – Crashworks

+2

Sa syntaxe AT & T (http://wiki.osdev.org/Opcode_syntax) est enveloppée dans une syntaxe semblable à une fonction C (http://wiki.osdev.org/Inline_Assembly). Vous ne le croirez pas mais je préfère en fait la syntaxe Intel "standard". ;-) – DevSolar

+0

Est-ce que le changement de contexte fonctionne également pour C++ ou est-ce que je dois en écrire d'autres pour thiscall? – jameszhao00

2

DevSolar a la bonne réponse - je vais juste ajouter que vous pouvez en apprendre un peu plus sur ce que RASE et ESP sont pour here.

Questions connexes