2013-04-14 12 views
7

में आर 10 रजिस्टर को रोकना मुझे बहुत हल्का वजन libc प्रतिस्थापन लाइब्रेरी लिखने पर जाना है ताकि मैं कर्नेल - एप्लिकेशन इंटरफ़ेस को बेहतर ढंग से समझ सकूं। पहला कार्य स्पष्ट रूप से कुछ सिस्टम कॉल रैपर को जगह में प्राप्त कर रहा है। मैंने सफलतापूर्वक 1 से 3 तर्क रैपर काम कर लिए हैं लेकिन मैं 4 तर्क भिन्नता के साथ संघर्ष कर रहा हूं। यहाँ मेरी प्रारंभिक बिंदु है:जीसीसी इनलाइन x86_64 असेंबली

long _syscall4(long type, long a1, long a2, long a3, long a4) 
{ 
    long ret; 
    asm 
    (
     "syscall" 
     : "=a"(ret) 
     : "a"(type), "D"(a1), "S"(a2), "d"(a3), "r10"(a4) 
     : "c", "r11" 
    ); 
    return ret; 
} 

संकलक मुझे निम्न त्रुटि देता है:

error: matching constraint references invalid operand number 

मेरे _syscall3 समारोह काम करता है ठीक लेकिन does not उपयोग R10 या पीटना सूची है।

किसी भी विचार?

उत्तर

0

मुमकिन है, क्योंकि कोई निर्देश r10 रजिस्टर के लिए विशिष्ट आवश्यकता है, जीसीसी लोगों को इसके लिए एक बाधा (यह देखते हुए कि बाधाओं मशीन विवरण के लिए मुख्य रूप से कर रहे हैं) का निर्माण नहीं किया। यदि आप इनलाइन एएसएम पर जोर देते हैं तो मुझे नहीं लगता कि आप सामान्य "r" (या "m") बाधा का उपयोग करने से बेहतर कर सकते हैं और r10 स्वयं (और इसे क्लॉबर सूची में जोड़कर) में स्थानांतरित कर सकते हैं।

5

रजिस्टरों के लिए कोई बाधा नहीं है: %r8 .. %15। हालांकि, (जीसीसी-4.x के रूप में) और हाल ही में स्वीकार करना चाहिए:

register long r10 asm("r10") = a4; 

तो इनपुट बाधा का उपयोग करें: "r" (r10)

यह __asm__ की आवश्यकता हो सकती __volatile__ साथ योग्य हो करने के लिए - मैं बंद चल रहा हूँ यहां स्मृति, इसलिए मैं आपको यह नहीं बता सकता कि यह वाक्यविन्यास आधिकारिक बनाया गया था, आदि। यह अन्यथा बेकार register कीवर्ड का एक समझदार रीसाइक्लिंग है।

+2

ग्रेट टिप। यह एक शानदार विशेषता है जो वास्तव में जीसीसी इनलाइन असेंबलर को अलग करने में मदद करती है। यहां प्रासंगिक दस्तावेज है: https://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html – linguamachina

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