jameszhao00
jameszhao00

Reputation: 7321

Explanation of Asm code

The following GCC inline asm is taken from LuaJit's coco library. Can someone provide a line by line explanation of what it does?

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

Thanks

Upvotes: 7

Views: 2354

Answers (2)

DevSolar
DevSolar

Reputation: 70391

My ASM is a bit fuzzy about the details, but I think I can give you a general idea.

ESP: Stack pointer, EBP: Base pointer.

movl $1f, (%0)

Move address of label 1 (defined on last line) into parameter 0 (from, see below).

movl %%esp, 4(%0)

Move the content of register ESP into (from + 4).

movl %%ebp, 8(%0)

Move the content of register EBP into (from + 8).

movl 8(%1), %%ebp

Move the content of (to + 8) into register EBP. (to being the second parameter, i.e. index 1. See below.)

movl 4(%1), %%esp

Move the content of (to + 4) into register ESP.

jmp *(%1)

Jump to address contained in (to).

The 1: is a jump label.

"+S" (from) puts from into the ESI register as a read-write parameter (i.e. the ASM instructions may modify ESI).

"+D" (to) puts to into the EDI register as a read-write parameter.

The list of registers at the end of the statement is the "clobber" list, a list of registers beyond the aforementioned parameter registers that may be modified by the ASM code. The compiler really has no idea what the ASM code does, and the parameter list and clobber list allow the compiler to maintain consistency (i.e., not relying on those registers still containing the same value as before).

I guess that coco_ctx means "coco context". So: The function saves the current stack frame in the "from" structure, and sets the stack frame to what's saved in the "to" structure. Basically, it jumps from the current function into another function.


And from Crashwork's answer-comment below:

Upvotes: 12

Crashworks
Crashworks

Reputation: 41482

DevSolar has the right answer -- I'll just add that you can learn a little more about what EBP and ESP are for here.

Upvotes: 3

Related Questions