2009-09-03 14 views
6

El siguiente asma en línea GCC se toma de la biblioteca de coco de LuaJit. ¿Puede alguien proporcionar una explicación línea por línea de lo que hace?Explicación del código 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"); 
} 

Gracias

Respuesta

10

Mi ASM es un poco difusa sobre los detalles, pero creo que le puede dar una idea general.

ESP: Puntero de pila, EBP: Puntero de base.

movl $1f, (%0) 

Mueva el valor 0x1f al parámetro 0 (desde).

movl %%esp, 4(%0) 

Mueva el contenido del registro ESP a (desde + 4).

movl %%ebp, 8(%0) 

Mueva el contenido del registro EBP a (desde + 8).

movl 8(%1), %%ebp 

Mueva el contenido de (a + 8) en el registro EBP.

movl 4(%1), %%esp 

Mueva el contenido de (a + 4) en el registro ESP.

jmp *(%1) 

Salta a la dirección contenida en (a).

El "1:" es una etiqueta de salto.

"+ S" declara un parámetro "fuente" (lectura), "+ D" un parámetro de destino (escritura). La lista de registros al final de la declaración es la lista "clobber", una lista de registros posiblemente modificados por el código ASM, por lo que el compilador puede tomar medidas para mantener la coherencia (es decir, no confiar, por ejemplo, ECX que todavía contiene el mismo valor como antes).

Supongo que coco_ctx significa "contexto de coco". Entonces: la función guarda el marco de pila actual en la estructura "de", y establece el marco de pila en lo que se guardó en la estructura "a". Básicamente, salta de la función actual a otra función.

+2

eso es exactamente correcto. Sin embargo, no se trata solo de saltar de una función a otra: está saltando de una pila de llamadas completa a otra; está cambiando por completo los contextos de ejecución. (También, Dios mío, pero la sintaxis de ensamblado en línea de GCC es extraña). – Crashworks

+2

Es la sintaxis de AT & T (http://wiki.osdev.org/Opcode_syntax) envuelta en una sintaxis de llamada a función C (http://wiki.osdev.org/Inline_Assembly). No lo creerá, pero en realidad lo prefiero por encima de la sintaxis Intel "estándar". ;-) – DevSolar

+0

¿El cambio de contexto también funciona para C++ o tengo que escribir algo diferente para esta llamada? – jameszhao00

2

DevSolar tiene la respuesta correcta - voy a añadir que se puede aprender un poco más sobre lo que EBP y ESP son para here.

Cuestiones relacionadas