以下GCC内联asm取自LuaJit的coco库。有人可以逐行解释它的作用吗?
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");
}
由于
答案 0 :(得分:10)
我的ASM对细节有点模糊,但我想我可以给你一个大致的想法。
ESP:堆栈指针,EBP:基指针。
movl $1f, (%0)
将值0x1f移动到参数0(from)。
movl %%esp, 4(%0)
将注册ESP的内容移入(从+ 4开始)。
movl %%ebp, 8(%0)
将寄存器EBP的内容移入(从+ 8开始)。
movl 8(%1), %%ebp
将(到+ 8)的内容移动到寄存器EBP中。
movl 4(%1), %%esp
将(到+ 4)的内容移动到寄存器ESP中。
jmp *(%1)
跳转到(至)中包含的地址。
“1:”是跳转标签。
“+ S”声明“源”(读)参数,“+ D”表示目标(写入)参数。语句末尾的寄存器列表是“clobber”列表,可能由ASM代码修改的寄存器列表,因此编译器可以采取措施来保持一致性(即,不依赖于例如ECX仍然包含相同的值和以前一样)。
我猜coco_ctx的意思是“coco context”。因此:该函数将当前堆栈帧保存在“from”结构中,并将堆栈帧设置为“to”结构中保存的内容。基本上,它从当前函数跳转到另一个函数。
答案 1 :(得分:2)
DevSolar有正确的答案 - 我只想补充一点,你可以了解更多关于EBP和ESP的内容here.