c - unistd.h constants linux x86_64 -
अगर मैं 64 बिट लिनक्स पर एक साधारण प्रोग्राम में printf लेकिन, यह अपेक्षित रूप से चलाता है: जहां x86-64 सिस्टम पर कॉलिंग सम्मेलन अलग है। लिनक्स ने सिस्टम वी एबीआई को अपनाया, जिसमें उसका कॉलिंग सम्मेलन भी शामिल है। सिस्टम कोड को उपयोगकर्ता-मोड फ़ंक्शंस को उसी रजिस्टरों का उपयोग करके कहा जाता है, जिसमें पहले फंक्शन तर्क को अधिक जानकारी के लिए देखें, लेकिन कुछ लिनक्स-विशिष्ट जानकारी के बारे में एक अधिक सटीक गाइड परिशिष्ट ए के उपखंड 2.1 में पाया जा सकता है। __ एनआर_एक्सिट , मान 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 जीएनयू / लिनक्स
% rax में जमा किया जाता है, और तर्क
% rdi
% rsi ,
% rdx ,
% r10 ,
% r8 , और
% r9 उस क्रम में, और
syscall निर्देश का उपयोग
int $ 0x80 के स्थान पर किया जाता है।
MEMORY वर्ग से संबंधित के रूप में वर्गीकृत केवल पूर्णांक और मदों को पारित किया जा सकता है, और केवल उन रजिस्टरों का उपयोग किया जा सकता है कक्षा <मद> मेमोरी के आइटम स्टैक के माध्यम से पारित किए जाते हैं। आप केवल 6 तर्कों या सिस्कल में कम कर सकते हैं।
% rdi में संग्रहीत किया जाता है,
% r10 के स्थान पर कोड>% आरसीएक्स का उपयोग किया जाता है, और
% rax का उपयोग सिस्सेल संख्या के बजाय एसएसई तर्कों की संख्या को इंगित करने के लिए किया जाता है।
Comments
Post a Comment