2009-09-03 110 views
6

下面的GCC inline asm取自LuaJit的coco库。有人可以提供一行一行的解释它的功能吗?Asm代码的说明

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

感谢

回答

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”结构中保存的内容。基本上,它从当前函数跳转到另一个函数。

+2

完全正确。然而,它不仅仅是从一个功能跳到另一个功能:它从一个整个调用堆栈跳到另一个;它完全切换执行上下文。 (另外,天哪,但是GCC内联汇编语法是奇怪的。) – Crashworks 2009-09-03 06:40:30

+2

它是用C函数调用类语法包装的AT&T语法(http://wiki.osdev.org/Opcode_syntax)(http://wiki.osdev.org/Inline_Assembly)。你不会相信它,但我更喜欢它,而不是“标准”英特尔语法。 ;-) – DevSolar 2009-09-03 06:47:16

+0

上下文切换是否也适用于C++,还是我必须为此调用写一些不同的内容? – jameszhao00 2009-09-03 13:17:52

2

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