汇编代码解释

以下是LuaJit的coco库中的GCC inline asm。能否有人逐行解释它的作用?

static inline void coco_switch(coco_ctx from, coco_ctx to)
{
  __asm__ __volatile__ (
    "movl $1f, (%0)\n\t"  // 将 1f 的地址保存到 from 指针指向的内存地址中
    "movl %%esp, 4(%0)\n\t"  // 将 esp 寄存器的值保存到 from 指针指向的偏移量为 4 的内存地址中
    "movl %%ebp, 8(%0)\n\t"  // 将 ebp 寄存器的值保存到 from 指针指向的偏移量为 8 的内存地址中
    "movl 8(%1), %%ebp\n\t"  // 将 to 指针加上偏移量 8 的地址中的值存入 ebp 寄存器中
    "movl 4(%1), %%esp\n\t"  // 将 to 指针加上偏移量 4 的地址中的值存入 esp 寄存器中
    "jmp *(%1)\n" "1:\n"  // 跳转到 to 指针指向的地址的位置,1: 标号为后面的跳转提供位置
    : "+S" (from), "+D" (to) : : "eax", "ebx", "ecx", "edx", "memory", "cc");
}

原文链接 https://stackoverflow.com/questions/1371547

点赞
stackoverflow用户60281
stackoverflow用户60281

我的 ASM 对细节有些模糊,但我认为我可以给你一个大致的想法。

ESP:堆栈指针,EBP:基指针。

movl $1f, (%0)

将标签 1 的地址(在上一行定义)移动到参数 0(从)中。

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” 声明一个目标(写入)参数。语句末尾的寄存器列表是“破坏”列表,可能被 ASM 代码修改的寄存器列表,因此编译器可以采取措施维护一致性(即不依赖于例如 ECX 仍然包含与之前相同的值)。

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

2009-09-03 06:28:51
stackoverflow用户53543
stackoverflow用户53543

DevSolar 有正确的答案 - 我只想补充一下,您可以在这里了解一些有关 EBP 和 ESP 的资料。

2009-09-03 06:43:40