2009-09-03 56 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.