Asm代码的说明

时间:2009-09-03 05:24:27

标签: gcc assembly lua x86 inline-assembly

以下GCC内联asm取自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");
}

由于

2 个答案:

答案 0 :(得分:10)

我的ASM对细节有点模糊,但我想我可以给你一个大致的想法。

ESP:堆栈指针,EBP:基指针。

movl $1f, (%0)

将值0x1f移动到参数0(from)。

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”表示目标(写入)参数。语句末尾的寄存器列表是“clobber”列表,可能由ASM代码修改的寄存器列表,因此编译器可以采取措施来保持一致性(即,不依赖于例如ECX仍然包含相同的值和以前一样)。

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

答案 1 :(得分:2)

DevSolar有正确的答案 - 我只想补充一点,你可以了解更多关于EBP和ESP的内容here.