Explanation of Asm code

北慕城南 提交于 2019-12-07 03:47:58

问题


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


回答1:


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 the value 0x1f into parameter 0 (from).

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.

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" declares a "source" (read) parameter, "+D" a destination (write) parameter. The list of registers at the end of the statement is the "clobber" list, a list of registers possibly modified by the ASM code, so the compiler can take steps to maintain consistency (i.e., not relying on e.g. ECX 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.




回答2:


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



来源:https://stackoverflow.com/questions/1371547/explanation-of-asm-code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!