2010-03-01 29 views
6

कोड यह रहा:जब भी मैं इंटरप्ट्स का उपयोग करने का प्रयास करता हूं तो मेरा masm32 प्रोग्राम क्रैश क्यों होता है?

.386 ;target for maximum compatibility 
.model small,stdcall ;model 
.code 
    main: 
     int 20h 
    END main 

परिणाम: http://img705.imageshack.us/img705/3738/resultom.png

"test.exe बंद कर दिया काम कर रहा है" - हमेशा सही है जब यह बाधा तक पहुँचता है।

This is the interrupt I'm trying to use. इसे प्रोग्राम से बाहर निकलना चाहिए। मैंने कोशिश की है कि चरित्र इनपुट/आउटपुट, आदि शामिल हैं .. कुछ भी काम नहीं करता है।

मैं WinAsm IDE के साथ masm32 का उपयोग कर विंडोज 7 पर हूं।

ऐसी कई अच्छी चीजें हैं जो मुझे लगता है कि मुझे इंटरप्ट्स के साथ करने में सक्षम होना चाहिए ... हालांकि, जब भी मैं एक इंटरप्ट का उपयोग करने की कोशिश करता हूं तो यह दुर्घटनाग्रस्त हो जाता है - हमेशा वैसे ही।

यह संबंधित है और संभवतः उपयोगी लगता है: DOS Interrupt in masm x86 assembly crashing

... लेकिन मैं वास्तव में इसे से कुछ भी पता लगाने की नहीं कर पाए हैं।

कोई सुझाव?

उत्तर

5

हाँ। इस प्रकृति के इंटरप्ट्स विशेष रूप से एमएस-डॉस के लिए हैं, और जैसा कि विंडोज एमई और पिछले में काम करता है लेकिन डीओएस एमुलेटर (command.com) के अलावा एनटी आर्किटेक्चर पर काम नहीं करेगा। मुझे नहीं पता कि यह अभी भी विंडोज 7 के साथ जहाज है - मुझे पता है कि विंडोज़ के x64 संस्करणों में यह डिफ़ॉल्ट रूप से नहीं है।

यदि आप मूल एनटी ऐप्स लिख रहे हैं (यदि आप नहीं जानते कि कोई क्या है, तो आप ऐसा करने की संभावना नहीं रखते हैं, लेकिन यदि आप एमएसडीएन में मार्क रसेलिनोविच के ब्लॉग पर एक नज़र डालना चाहते हैं) यहां एक NT बीच में आता है और उनके संबंधित कार्यों की सूची: http://msdn.microsoft.com/en-us/library/aa383749%28VS.85%29.aspx

संपादित करें:: http://www.ctyme.com/intr/rb-4249.htm

उसके अलावा, आप Win32 एपीआई में एक समारोह कॉल करना चाहते हैं और उस कोड नमूने में, आप के लिए किसी भी विकल्प निर्दिष्ट नहीं किया गया है रजिस्ट्रार के माध्यम से किया गया बाधा। ओह और आप इसे काम कर सकते हैं बशर्ते आप डॉस के लिए इकट्ठे हों और विंडोज़ के लिए नहीं। यदि आप एक लिंकर का उपयोग करते हैं तो आप संभवतः एक विंडोज पीई निष्पादन योग्य बनायेंगे। हालांकि, अगर आप 64-बिट विंडोज़ पर हैं, जैसा कि मैंने कहा है, कोशिश न करें।

एक चीज जो आप कर सकते हैं वर्चुअलबॉक्स सिस्टम या वर्मवेयर जैसे वर्चुअल मशीन सिस्टम स्थापित करें और फिर फ्रीडीओएस इंस्टॉल करें। इसे बहुत अधिक रैम नहीं लेना चाहिए और आपको स्वतंत्र रूप से असेंबली/डॉस के साथ प्रयोग करने देगा।

+0

धन्यवाद निनफिंगर्स, मुझे लगता है कि यह समझ में आता है। मैं निश्चित रूप से एक वीएम में देखता हूं, शायद यह एक अच्छा विचार है! साथ ही, मैं जिस इंटरप्ट का उपयोग कर रहा था वह कोई विकल्प नहीं लेता है (मुझे वैसे भी नहीं लगता), इसलिए यह कोई मुद्दा नहीं होगा। – Cam

2

@ninefingers उत्कृष्ट उत्तर के अतिरिक्त - क्या मैं int 20H जोड़ सकता हूं केवल 16 बिट प्रोग्राम के लिए काम करेगा। और कभी भी .exe

द्वारा उपयोग नहीं किया जा सकता here देखें।

2

आपको प्रोग्रामिंग इंटरप्ट्स सावधान रहना होगा। यदि आप रीयलमोड (16-बिट) के अलावा किसी भी अन्य चीज़ में हैं, तो आप आमतौर पर सीपीयू स्तर पर इंटरप्ट्स तक नहीं पहुंच सकते हैं। इंटरप्ट वेक्टर टेबल को अनुक्रमणित करने के लिए एक इंटरप्ट डिस्क्रिप्टर टेबल उपलब्ध होना चाहिए।

आईवीटी रिंग 0 में बैठता है, जहां आपके पास सीधी, बिना हार्डवेयर तक पहुंच (सीपीयू, वीडियो इत्यादि) है, सभी एप्लिकेशन रिंग 3 (ओएस शामिल) में चल रहे होंगे। आईडीटी में आईवीटी में इंडेक्स शामिल हैं। यह आपके हार्डवेयर की सुरक्षा के लिए किया जाता है। यदि आप ओएस से इंटरप्ट्स तक पहुंचना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि वे आपके 32-बिट स्रोत पर उपलब्ध हैं।

0

32 बिट विंडोज के तहत एक वर्चुअल 86 मोड है और इस मोड के साथ डॉस से पुराने आरएम-सॉफ्टवेयर इंटरप्ट्स का उपयोग करना संभव है, क्योंकि विंडोज़ उनमें से बहुत से अनुकरण करता है। इसके बाद भी अगर हमने अपने ग्राफिककार्ड के लिए ड्राइवर को सही तरीके से स्थापित किया है, तो हमारे कार्ड पर एक vesabios के vesamodelist प्राप्त करने के लिए कुछ int 10h सॉफ़्टवेयर इंटरप्ट्स का उपयोग करना संभव है। हां यह एक अनुकरण है, लेकिन यह हमारे कार्ड से असली modenumbers और उनके पर्यावरण पैरामीटर मिलता है, भले ही उन सभी vesamodes में बदलना खिड़कियों के नीचे असंभव है।

एक 16 बिट डॉस एप्लिकेशन * .exe-format का भी उपयोग कर सकता है, लेकिन यह एक एमजेड प्रारूप है, पीई प्रारूप नहीं।

डिर्क

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

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