以下 GCC 内联汇编取自 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");
}
谢谢
最佳答案
我的ASM对细节有点模糊,但我想我可以给你一个大致的想法。
ESP:堆栈指针,EBP:基指针。
movl $1f, (%0)
将标签 1(在最后一行定义)的地址移动到参数 0(来自)。
movl %%esp, 4(%0)
将寄存器 ESP 的内容移入 (from + 4)。
movl %%ebp, 8(%0)
将寄存器 EBP 的内容移入 (from + 8)。
movl 8(%1), %%ebp
将 (to + 8) 的内容移入寄存器 EBP。
movl 4(%1), %%esp
将 (to + 4) 的内容移入寄存器 ESP。
jmp *(%1)
跳转到 (to) 中包含的地址。
“1:”是跳转标签。
“+S”声明“源”(读)参数,“+D”声明目标(写)参数。语句末尾的寄存器列表是“clobber”列表,可能被 ASM 代码修改的寄存器列表,因此编译器可以采取措施保持一致性(即,不依赖于仍包含相同值的 ECX像之前一样)。
我猜 coco_ctx 的意思是“ cocoa 上下文”。所以:该函数将当前堆栈帧保存在“from”结构中,并将堆栈帧设置为“to”结构中保存的内容。基本上,它从当前函数跳转到另一个函数。