gcc - Asm 代码说明

标签 gcc assembly lua x86 inline-assembly

以下 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”结构中保存的内容。基本上,它从当前函数跳转到另一个函数。

关于gcc - Asm 代码说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1371547/

相关文章:

c - 用于打印字符串的自包含 C 例程

lua - (错误)ERR错误编译脚本(新功能):user_script:2: '='附近应为 'local'

c++ - 奇怪的编译代码

c - 如何在 gcc/mingw 内联汇编中添加简单的 float4

c - 在 mac os 上将两个变量名相乘

c++ - 为什么 C++ 可执行文件在与较新的 libstdc++.so 链接时运行速度如此之快?

http - 使用 Lua 的基本 CGI

lua - 将时间字符串(例如 "1d")转换为秒

objective-c - 为声明的属性合成了哪些等效代码?

c++ - 使用 g++ 连接两个具有相同函数签名的强函数符号的结果,为什么?