7

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

谢谢

4

2 回答 2

11

我的 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 的意思是“可可上下文”。所以:该函数将当前堆栈帧保存在“from”结构中,并将堆栈帧设置为保存在“to”结构中的内容。基本上,它从当前函数跳转到另一个函数。

于 2009-09-03T06:28:51.070 回答
2

DevSolar 有正确的答案——我只想补充一点,您可以在这里了解更多关于 EBP 和 ESP 的用途。

于 2009-09-03T06:43:40.877 回答