Asm代码说明

问题描述 投票:6回答:2

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

谢谢

gcc assembly lua x86 inline-assembly
2个回答
10
投票

我的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的信息


2
投票

[DevSolar的答案正确-我要补充一点,您可以学到更多有关here.的EBP和ESP的信息

© www.soinside.com 2019 - 2024. All rights reserved.