[DevSolar的答案正确-我要补充一点,您可以学到更多有关here.的EBP和ESP的信息
以下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寄存器的内容移入(从+ 4中。)>
movl %%ebp, 8(%0)
将寄存器EBP的内容移入(从+ 8开始。)>
movl 8(%1), %%ebp
将(到+ 8)的内容移到寄存器EBP中。
movl 4(%1), %%esp
将(至+4的内容移到寄存器ESP中。
jmp *(%1)
跳转到(to)中包含的地址。
“”:是跳转标签。
“ + S”声明“源”(读取)参数,“ + D”声明目标(写入)参数。语句末尾的寄存器列表是“ Clobber”列表,这是可能由ASM代码修改的寄存器列表,因此编译器可以采取步骤来保持一致性(即,不依赖于例如仍包含相同值的ECX)和以前一样。
我想coco_ctx的意思是“可可上下文”。因此:该函数将当前的堆栈框架保存为“从”结构,并将堆栈框架设置为“至”结构中保存的内容。基本上,它从当前功能跳转到另一个功能。
[DevSolar的答案正确-我要补充一点,您可以学到更多有关here.的EBP和ESP的信息
[DevSolar的答案正确-我要补充一点,您可以学到更多有关here.的EBP和ESP的信息