汇编代码解释
2009-10-17 8:17:17
收藏:0
阅读:290
评论:2
以下是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
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我的 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”结构中保存的内容。基本上,它从当前函数跳转到另一个函数。