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.
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
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
Est-ce que le changement de contexte fonctionne également pour C++ ou est-ce que je dois en écrire d'autres pour thiscall? – jameszhao00