2013-09-27 3 views
8

मैं वास्तविक मोड फ़ंक्शन लिख रहा हूं, जो स्टैकफ्रेम के साथ सामान्य कार्य होना चाहिए और इसलिए, इसे% esp के बजाय% sp का उपयोग करना चाहिए। क्या ऐसा करने का कोई तरीका है?वास्तविक मोड के लिए 16-बिट कोड जेनरेट करने के लिए जीसीसी को कैसे बताना है

+0

क्या ओएस चलाने के लिए माना जाता है? जीसीसी एमएस-डॉस का समर्थन नहीं करता है। –

उत्तर

4

जहां तक ​​मुझे पता है, जीसीसी 16-बिट x86 के लिए कोड की पीढ़ी का समर्थन नहीं करता है। विरासत बूटलोडर्स और इसी तरह के उद्देश्यों के लिए, आपको 32-बिट मोड में cpu डालने और 32-बिट कोड पर निष्पादन को पास करने के लिए असेंबली भाषा में एक छोटा स्टब लिखना चाहिए। अन्य प्रयोजनों के लिए आपको वास्तव में 16-बिट कोड नहीं लिखना चाहिए।

+0

क्या आप कृपया और अधिक समझाएंगे। -एम 16 विकल्प के बारे में क्या? –

2

जीसीसी 8086 कोड का उत्पादन नहीं करता है। जीएनयू एएस निर्देश .code16gcc का उपयोग 16 सी बिट मोड में चलाने के लिए जीसीसी के आउटपुट को इकट्ठा करने के लिए किया जा सकता है, अपने सी स्रोत की शुरुआत में asm(".code16gcc") डालें, आपका प्रोग्राम 64 किबाइट तक सीमित होगा।

+0

पर प्रलेखित: https://sourceware.org/binutils/docs/as/i386_002d16bit.html#i386_002d16bit –

+2

.code16gcc का उपयोग करना (मुझे अभी भी यकीन नहीं है कि कोई इसे एक स्थिर सुविधा कह सकता है) 16 बिट में चलने वाले कोड का उत्पादन करेगा वास्तविक मोड, हालांकि यह एक निर्देश उपसर्ग का उपयोग करता है जो केवल 386+ पर उपलब्ध है। इसका मतलब है कि यदि आप 8086/8088 (वास्तविक हार्डवेयर या एमुलेटर) को लक्षित कर रहे हैं तो कोड संभवतः ठीक से काम करने में विफल रहेगा। यदि आप 32-बिट संरक्षित मोड में बूटस्ट्रैप प्रविष्टि का इरादा रखते हैं तो एक छोटा 16-बिट असेंबलर स्टब लिखें जो सब कुछ सेट करता है, संरक्षित मोड में प्रवेश करता है और उसके बाद 32 बिट "सी" फ़ंक्शन पर कॉल करता है जो आपके प्रोग्राम की शुरुआत है। –

+0

आप निश्चित रूप से __asm__ निर्देश का उपयोग कर इनलाइन असेंबली के रूप में जीसीसी में 16-बिट असेंबलर को कोड कोड कर सकते हैं। –

6

जीसीसी 5.2.0 (और संभव पूर्व संस्करण) -m16 ध्वज के साथ 16-बिट कोड पीढ़ी का समर्थन करते हैं। हालांकि, कोड लगभग 32-बिट प्रोसेसर सुविधाओं (जैसे 32-बिट चौड़े रजिस्टरों) पर निर्भर करेगा, इसलिए आपको जेनरेट की गई असेंबली सावधानीपूर्वक जांचनी चाहिए।

man पृष्ठों से:

-m16 विकल्प के लिए है कि यह विधानसभा उत्पादन की शुरुआत ताकि कम से ".code16gcc" विधानसभा निर्देश आउटपुट को छोड़कर, -m32 रूप में ही है 16-बिट मोड में बाइनरी चलाया जा सकता है।

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

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