c - unistd.h constants linux x86_64 -


अगर मैं 64 बिट लिनक्स पर एक साधारण प्रोग्राम में printf __ एनआर_एक्सिट , मान 60 & lt; asm / unistd_64.h & gt; में हालांकि, यह कोड (नोस्टडिब्ब के साथ संकलित किया गया है) segfaults:

  void _start () {asm ("movl $ 60,% eax;" xorl% ebx,% ebx; "" int $ 0x80 "); }   

लेकिन, यह अपेक्षित रूप से चलाता है:

  void _start () {asm ("movl $ 1,% eax;" "xorl% ebx,% ईबीएक्स; "" इंट $ 0 एक्स 80 "); }   

जहां __ एनआर_एक्सिट को 32 बिट संस्करण में & lt; unistd.h & gt; <पी में परिभाषित किया गया है > स्पष्ट रूप से 1 सही स्थिरांक है 32 बिट syscall मानों का उपयोग क्यों किया जा रहा है?

  $ uname -a लिनक्स गैलोइस 3.14.6-1-एआरएच # 1 एसएमपी प्रीपेप्ट सूर्य जून 8 10:08:38 सीईटी 2014 x86_64 जीएनयू / लिनक्स    

x86-64 सिस्टम पर कॉलिंग सम्मेलन अलग है। लिनक्स ने सिस्टम वी एबीआई को अपनाया, जिसमें उसका कॉलिंग सम्मेलन भी शामिल है।

सिस्टम कोड को % rax में जमा किया जाता है, और तर्क % rdi % rsi , % rdx , % r10 , % r8 , और % r9 उस क्रम में, और syscall निर्देश का उपयोग int $ 0x80 के स्थान पर किया जाता है। MEMORY वर्ग से संबंधित के रूप में वर्गीकृत केवल पूर्णांक और मदों को पारित किया जा सकता है, और केवल उन रजिस्टरों का उपयोग किया जा सकता है कक्षा <मद> मेमोरी के आइटम स्टैक के माध्यम से पारित किए जाते हैं। आप केवल 6 तर्कों या सिस्कल में कम कर सकते हैं।

उपयोगकर्ता-मोड फ़ंक्शंस को उसी रजिस्टरों का उपयोग करके कहा जाता है, जिसमें पहले फंक्शन तर्क को % rdi में संग्रहीत किया जाता है, % r10 के स्थान पर कोड>% आरसीएक्स का उपयोग किया जाता है, और % rax का उपयोग सिस्सेल संख्या के बजाय एसएसई तर्कों की संख्या को इंगित करने के लिए किया जाता है।

अधिक जानकारी के लिए देखें, लेकिन कुछ लिनक्स-विशिष्ट जानकारी के बारे में एक अधिक सटीक गाइड परिशिष्ट ए के उपखंड 2.1 में पाया जा सकता है।

Comments

Popular posts from this blog

php - how to change mysql_result($res, 0, "url"); to mysqli -

c# - How to clone a HttpRequestMessage when the original request has Content? -

split - php explode string with Uppercase if lowercase letter exists before it without space -