2017-09-06 11 views
7

मेरे 8086 असेंबली कार्यक्रमों में एक लूप निष्पादित करते समय, एक कुंजीपटल कुंजी प्रेस थ्रेसहोल्ड होता है जहां आप कई बार एक कुंजी दबाते हैं तो पीसी स्पीकर बीपिंग शुरू कर देगा। यह अप्रिय है, और यह मेरे कार्यक्रमों को क्रॉल में धीमा कर देता है क्योंकि सीपीयू को मेरे कार्यक्रम से दूर कूदना पड़ता है और स्पीकर को चलाने में आधे सेकेंड खर्च करता है।लूपिंग के दौरान होने वाले पीसी स्पीकर बीप इंटरप्ट को आप कैसे अक्षम करते हैं?

मुझे यह समस्या तब तक नहीं पता जब तक कि मैंने कुछ महीनों पहले वास्तविक हार्डवेयर पर अपने कार्यक्रमों का परीक्षण शुरू नहीं किया। डॉसबॉक्स में यह समस्या कोई समस्या नहीं है, या डॉसबॉक्स के अंदर स्थापित डॉस 6.22 में भी कोई समस्या नहीं है। तो यह पीसी BIOS में निर्मित कुछ निम्न स्तर के हार्डवेयर बाधा होना चाहिए, मुझे इस सामान के बारे में बहुत कुछ पता नहीं है।

यह मेरी 286 मशीन पर और ऑपरेटिंग सिस्टम की परवाह किए बिना मेरे पेंटियम एमएमएक्स लैपटॉप पर होता है।

यहां तक ​​कि अगर यह सिर्फ एक मृत पाश है, और मैं भी कुंजीपटल इनपुट के लिए मतदान नहीं कर रहा हूँ, बीप अभी भी होता है अगर मैं भी कई चाबियाँ

मैं & एसटीआई CLI अंदर बस अपना इनपुट कोड लपेटकर कोशिश की है दबाएँ उम्मीद है कि सिस्टम से मेरे कीबोर्ड इनपुट को मुखौटा करें, लेकिन यह वास्तव में काम नहीं करता है। मैं केवल अपने कार्यक्रम में एकवचन बिंदु पर एक स्कैनकोड एकत्र करता हूं, इसलिए शेष समय, इंटरप्ट सक्षम होते हैं। तो बीपिंग अभी भी विशाल बहुमत हो सकती है।

कुछ हार्डवेयर रजिस्टर होना चाहिए जो मैं अक्षम या कुछ कर सकता हूं। मैंने बोच की बंदरगाह सूची (http://bochs.sourceforge.net/techspec/PORTS.LST) के माध्यम से ऐसा कुछ ढूंढने के लिए एक अच्छा लंबा लगा, लेकिन कुछ भी नहीं देखा।

शायद मैं केवल बाधा बंद कर सकता हूं? मुझे कल्पना है कि बहुत सारे असेंबली प्रोग्रामर को इस समस्या का सामना करना पड़ेगा, लेकिन Google वास्तव में मेरी मदद नहीं कर रहा है।

+0

ध्वनि को अक्षम करने के लिए आपके BIOS में एक सेटिंग हो सकती है। –

+0

नहीं, वहां नहीं है। बस स्पष्ट होने के लिए, मैं उस छोटी सी प्रेस प्रेस बीप ध्वनि के बारे में बात नहीं कर रहा हूं जिसे आप कुछ BIOS में नकली क्लिक के रूप में सक्षम कर सकते हैं। यह ऐसा कुछ है जो केवल कार्यक्रमों के मध्य में होता है। असल में कंप्यूटर मुझे चिल्लाकर मुझे चेतावनी देने की कोशिश कर रहा है, "अरे आप एक लूप में फंस गए हैं! क्या तुम जानते हो?" यह सिर्फ एक अनचाहे चेतावनी है जो मेरे मामले में सहायक नहीं है। –

+7

BIOS इस तथ्य के बारे में आपको चेतावनी देने के लिए बीपिंग कर रहा है कि [कीबोर्ड टाइपहेड बफर] (https://support.microsoft.com/en-us/help/43993/how-to-flush-the-keyboard-typeahead-buffer) पूर्ण है। स्पष्ट रूप से आपका प्रोग्राम बफर को फ्लश करने में विफल रहता है। कृपया कुछ कोड साझा करें ताकि हम बता सकें कि कीबोर्ड इनपुट पढ़ने के लिए आप किस विधि का उपयोग कर रहे हैं। –

उत्तर

9

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

आपके मामले में, आप कीबोर्ड इनपुट पढ़ रहे हैं, लेकिन उचित तरीके से नहीं। आप सीधे हार्डवेयर (आई/ओ पोर्ट 60h) से पढ़ रहे हैं, लेकिन स्पष्ट रूप से आप कीबोर्ड इंटरप्ट (INT 09h) को पकड़ नहीं रहे हैं। इसका मतलब है कि पृष्ठभूमि में, BIOS कुंजीपटल इनपुट को भी प्रोसेस कर रहा है। इसके दो दुष्प्रभाव हैं।

  • BIOS कीबोर्ड टाइपहेड बफर भर रहा है। न केवल मशीन को बीप करने का कारण बनता है, अनचाहे कीस्ट्रोक भी कचरे की तरह ढेर हो जाते हैं जब आपका प्रोग्राम निकलता है और कमांड प्रॉम्प्ट पर वापस आ जाता है।
  • आप कीस्ट्रोक याद कर सकते हैं क्योंकि BIOS ने आपको इसे हराया था।

असल में, इसे हल करने के तीन तरीके हैं।

  1. कुंजीपटल इनपुट पढ़ने के लिए BIOS कॉल या डॉस कॉल का उपयोग करें।
  2. एक उचित कीबोर्ड हस्तक्षेप हैंडलर बनाएं जहां आप कीबोर्ड ईवेंट ('मेक' और 'ब्रेक') लाने के लिए पोर्ट 60h, 61h और 20h का उपयोग करते हैं।
  3. (अब इस बारे में निश्चित नहीं है :) सीधे BIOS कीबोर्ड टाइपहेड बफर से कीस्ट्रोक खींचें।

पहला विकल्प दृढ़ता से अनुशंसित है। दूसरे को प्राथमिकता दी जाती है यदि आपका एप्लिकेशन एक ही समय में आयोजित होने वाली कई कुंजियों का पता लगाने में सक्षम होना चाहिए (आमतौर पर वीडियो गेम)।यह एक छोटा काम नहीं है, इसलिए आपको वहां कुछ मदद की आवश्यकता होगी।

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