Asm代码解释

发布于 2024-08-03 12:39:26 字数 420 浏览 2 评论 0原文

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

谢谢

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

dawn曙光 2024-08-10 12:39:26

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

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 address of label 1 (defined on last line) 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.

请爱~陌生人 2024-08-10 12:39:26

DevSolar 有正确的答案 - 我只是补充一点,您可以更多地了解 EBP 和 ESP 的用途 这里。

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文