Pregunta

La siguiente GCC asm en línea se toma de la biblioteca de coco de LuaJit. Alguien puede proporcionar una línea por línea explicación de lo que hace?

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

¿Fue útil?

Solución

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

ESP: puntero de pila, EBP:. Puntero Base

movl $1f, (%0)

Mover el valor 0x1f en el parámetro 0 (desde).

movl %%esp, 4(%0)

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

movl %%ebp, 8(%0)

Mover el contenido de EBP registro en (de + 8).

movl 8(%1), %%ebp

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

movl 4(%1), %%esp

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

jmp *(%1)

Ir a dirección contenida en (a).

El "1:" es una marca de salto

.

"+ S" declara un parámetro de "fuente" (leer), "D +", un parámetro de destino (escritura). La lista de registros en el final de la instrucció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 consistencia (es decir, no depender de por ejemplo ECX que contiene todavía el mismo valor como antes).

supongo que coco_ctx significa "contexto coco". Por lo tanto: La función guarda el marco de pila actual en la estructura "de", y establece el marco de la pila a lo que está guardado en la estructura "a". Básicamente, se salta de la función actual en otra función.

Otros consejos

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top