2009-09-03 16 views
6

निम्नलिखित जीसीसी इनलाइन एएसएम लुआजिट की कोको लाइब्रेरी से लिया गया है। क्या कोई व्यक्ति लाइन के स्पष्टीकरण के आधार पर एक लाइन प्रदान कर सकता है?एएसएम कोड का स्पष्टीकरण

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

मेरे एएसएम विवरण के बारे में थोड़ा अस्पष्ट है, लेकिन मुझे लगता है मैं तुम्हें एक सामान्य विचार दे सकते हैं।

ईएसपी: स्टैक पॉइंटर, ईबीपी: बेस पॉइंटर।

movl $1f, (%0) 

मान 0x1f को पैरामीटर 0 (से) में ले जाएं।

movl %%esp, 4(%0) 

रजिस्टर ईएसपी की सामग्री को + 4 से ले जाएं।

movl %%ebp, 8(%0) 

रजिस्टर ईबीपी की सामग्री को + 8 से स्थानांतरित करें।

movl 8(%1), %%ebp 

पंजीकरण (ई +8) की सामग्री को ईबीपी में ले जाएं।

movl 4(%1), %%esp 

पंजीकरण ईएसपी में (+ 4) की सामग्री को ले जाएं।

jmp *(%1) 

(से) में निहित पते पर जाएं।

"1:" एक कूद लेबल है।

"+ एस" एक "स्रोत" (पढ़ा गया) पैरामीटर, "डी" एक गंतव्य (लिखना) पैरामीटर घोषित करता है। कथन के अंत में रजिस्टरों की सूची "क्लॉबर" सूची है, जो संभवतः एएसएम कोड द्वारा संशोधित रजिस्टरों की एक सूची है, इसलिए संकलक स्थिरता बनाए रखने के लिए कदम उठा सकता है (यानी, ईसीएक्स पर अभी भी वही मूल्य नहीं है पहले जैसा)।

मुझे लगता है कि coco_ctx का अर्थ है "कोको संदर्भ"। तो: फ़ंक्शन "से" संरचना में वर्तमान स्टैक फ्रेम को सहेजता है, और "टू" संरचना में सहेजे गए स्टैक फ्रेम को सेट करता है। असल में, यह वर्तमान फ़ंक्शन से दूसरे फ़ंक्शन में कूदता है।

+2

यही सही है कर रहे हैं के बारे में थोड़ा और अधिक सीख सकते हैं। यह सिर्फ एक समारोह से दूसरे में कूद नहीं रहा है, हालांकि: यह एक पूरे कॉल स्टैक से दूसरे में कूद रहा है; यह निष्पादन संदर्भों को पूरी तरह से स्विच कर रहा है। (इसके अलावा, गोश लेकिन जीसीसी इनलाइन असेंबली सिंटैक्स विचित्र है।) – Crashworks

+2

यह एटी एंड टी सिंटैक्स (http://wiki.osdev.org/Opcode_syntax) सी फंक्शन-कॉल-जैसे वाक्यविन्यास में लपेटा गया है (http://wiki.osdev.org/Inline_Assembly)। आप इसे विश्वास नहीं करेंगे लेकिन मैं वास्तव में इसे "मानक" इंटेल वाक्यविन्यास पर पसंद करता हूं। ;-) – DevSolar

+0

क्या संदर्भ स्विच सी ++ के लिए भी काम करता है या क्या मुझे इस के लिए कुछ अलग लिखना है? – jameszhao00

2

DevSolar सही जवाब है - मैं तो बस जोड़ देंगे कि तुम क्या ईबीपी और ईएसपी के लिए here.

संबंधित मुद्दे