以下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"); }
谢谢
我的ASM对细节有点模糊,但我想我可以给你一个大概的想法.
ESP:堆栈指针,EBP:基指针.
movl $1f, (%0)
将值0x1f移动到参数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)中包含的地址.
"1:"是跳转标签.
"+ S"声明"源"(读)参数,"+ D"表示目标(写入)参数.语句末尾的寄存器列表是"clobber"列表,可能由ASM代码修改的寄存器列表,因此编译器可以采取措施来保持一致性(即,不依赖于例如ECX仍然包含相同的值像之前一样).
我猜coco_ctx的意思是"coco context".因此:该函数将当前堆栈帧保存在"from"结构中,并将堆栈帧设置为"to"结构中保存的内容.基本上,它从当前函数跳转到另一个函数.