2009-09-03 33 views
6

Aşağıdaki GCC satıri asmı, LuaJit'in coco kütüphanesinden alınmıştır. Birisi ne yaptığıyla ilgili bir satır açıklama sağlayabilir mi?Asm kodunun açıklaması

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

Teşekkür

cevap

10

Benim ASM detayları hakkında biraz bulanık, ama sana genel bir fikir verebilir düşünüyorum.

ESP: Yığın işaretçisi, EBP: Temel işaretçi.

movl $1f, (%0) 

0x1f değerini 0 (yukarı) parametresine taşıyın.

movl %%esp, 4(%0) 

Kayıt ESP içeriğini (+ 4'ten) içine taşıyın.

movl %%ebp, 8(%0) 

Kayıt EBP içeriğini (+ 8'den) içine taşıyın.

movl 8(%1), %%ebp 

(+ 8) arasındaki içeriği, kayıt EBP'ye taşıyın.

movl 4(%1), %%esp 

(+4) içeriğini ESP'ye kaydedin.

jmp *(%1) 

(to) içinde bulunan adrese atlayın.

"1:" bir atlama etiketidir.

"+ S" bir "source" (read) parametresi, "+ D" bir hedef (write) parametresini bildirir. İfadenin sonunda bulunan yazmaç listesi "klobber" listesidir, muhtemelen ASM kodu tarafından değiştirilmiş olan yazmaçların listesidir, bu yüzden derleyici tutarlılığı korumak için gerekli adımları atabilir (örneğin, aynı değeri içeren ECX'e güvenmemek gibi) eskisi gibi).

Sanırım coco_ctx "coco içeriği" anlamına gelir. Yani: İşlev, geçerli yığın çerçevesini "from" yapısına kaydeder ve yığın çerçevesini "to" yapısına kaydedilene ayarlar. Temel olarak, mevcut işlevden başka bir işleve atlar.

+2

içindir hakkında biraz daha fazla bilgi edinebilmesi ekleyeceğiz. Ancak, sadece bir işlevden diğerine atlamak değil, bir bütün çağrı yığından diğerine atlamak; Tamamen yürütme bağlamlarını değiştiriyor. (Ayrıca, gosh ama GCC satır içi derleme sözdizimi tuhaftır.) – Crashworks

+2

Bir C işlev çağrısı benzeri sözdizimi (http://wiki.osdev.org/Opcode_syntax) sarılmış bir AT & T sözdizimi (http://wiki.osdev.org/Inline_Assembly). İnanmayacaksın ama ben aslında "standart" Intel sözdizimini tercih ederim. ;-) – DevSolar

+0

İçerik anahtarı C++ için de çalışıyor mu yoksa bu arama için farklı mı yazmalıyım? – jameszhao00

2

DevSolar doğru cevabı vardır - Sadece EBP ve ESP Kesinlikle doğru here.