2010-03-22 19 views
8
#include <stdlib.h> 

static inline uint 
xchg(volatile unsigned int *addr, unsigned int newval) 
{ 
    uint result; 
    asm volatile("lock; xchgl %0, %1" : "+m" (*addr), "=a" (result) : "1" (newval) : "cc"); 

return result;  
} 

क्या कोई मुझे बता सकता है कि यह कोड वास्तव में क्या करता है? मेरा मतलब है कि मेरे पास एक विचार या इस आदेश के कुछ हिस्से हैं। "1" नया इनपुट इनपुट है, "= ए" अपने पिछले मान को फ्लश करना और इसे अपडेट करना है। "एम" मेमोरी ऑपरेशन के लिए है लेकिन मैं इस फ़ंक्शन की कार्यक्षमता के बारे में उलझन में हूं। "+ एम" चिह्न क्या करता है? क्या यह कार्य कुछ ऐसा करता है जैसे m = a; एम = newval;जीसीसी में कॉलिंग असेंबली?

उत्तर

2

पर वापस जाएं constraints। वे चर, लेकिन मोड, "डब्ल्यू", "आर" की तरह नहीं हैं, "आर +" का fopen()

उनमें से कुछ यहां

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

हिस्सा 6. कमी के बारे में अधिक से वर्णित हैं।

और अंतिम "सीसी" क्लॉबर है।

यदि हमारा निर्देश हालत कोड रजिस्टर बदल सकता है, तो हमें क्लॉबर सूची में "cc" जोड़ना होगा।

एएसएम का पूरा प्रारूप

asm (assembler template 
     : output operands     /* optional */ 
     : input operands     /* optional */ 
     : list of clobbered registers  /* optional */ 
     ); 
6

= और + बाधा संशोधक हो रहा है।

http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers

`= 'इसका मतलब है कि इस संकार्य लिखने केवल इस निर्देश के लिए है: पिछले मान त्याग दिया जाता है और आउटपुट डेटा द्वारा बदल दिया।

`+ 'मतलब है कि यह ऑपरेंड दोनों निर्देशों को पढ़ और लिखा है।

बेसिक constrains यहाँ

http://gcc.gnu.org/onlinedocs/gcc/Simple-Constraints.html#Simple-Constraints

m एक स्मृति संकार्य हैं पते के किसी भी प्रकार कि मशीन सामान्य रूप में समर्थन करता है, के साथ, की अनुमति है।

.. 1 .. निर्दिष्ट ऑपरेंड नंबर से मेल खाता एक ऑपरेंड की अनुमति है। यदि एक ही अंक के साथ अक्षरों के साथ एक अंक का उपयोग किया जाता है, तो अंकों को अंतिम बार आना चाहिए।

'एक' i386 विशिष्ट

http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints

एक एक (eax) रजिस्टर है।

+0

यहां भी http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s6 – osgx

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