2009-01-17 9 views
11

स्कूल में हम कुछ समय के लिए एमआईपीएस असेंबली भाषा में प्रोग्रामिंग कर रहे हैं। मुझे x86 असेंबली में डेलविंग करने में दिलचस्पी है और मैंने सुना है कि कुछ हद तक कठिन है (यहां तक ​​कि मेरी एमआईपीएस पाठ्यपुस्तक भी यह कहती है)।एमआईपीएस से x86 असेंबली में स्विच करते समय मुझे क्या पता होना चाहिए?

x86 दुनिया में गोता लगाने से पहले मुझे एक एमआईपीएस प्रोग्रामर के रूप में क्या मूल जानकारी जाननी चाहिए?

उत्तर

14

सबसे बड़ी बातें ध्यान में रखनी चाहिए:

  • कुछ सामान्य प्रयोजन रजिस्टर, और जिन्हें आप नहीं कर रहे हैं शुद्ध जीपी - कई निर्देश एक विशेष उद्देश्य के लिए कुछ रजिस्टरों का उपयोग करने की आवश्यकता होती है।
  • x86 निर्देश तीन-ऑपोडोड के बजाए दो-ऑपोड फॉर्म हैं जो कुछ संचालन को अधिक जटिल बना सकते हैं। यही है, आर 0, आर 1, आर 2 (आर 0 = आर 1 + आर 2) जोड़ने के बजाय, आप ईएक्स, ईबीएक्स (ईएक्स + = ईबीएक्स) जोड़ते हैं।
  • सुरक्षित मोड में सेगमेंट (प्रभावी ढंग से डॉस के बाहर सभी 32-बिट कोड) आपकी मेमोरी एड्रेसिंग योजना को बेहद स्पष्ट नहीं बनाते हैं, जो आपको शुरू होने पर गधे में काट सकता है।
  • आप हर समय निर्देशों द्वारा सेट/साफ़ किए गए झंडे को देखने जा रहे हैं। इंटेल मैनुअल से प्यार करना सीखें।
  • संपादित करें, एक चीज़ जिसे मैं भूल गया: उपनगरीयों का उपयोग (उदाहरण के लिए एएक्स रजिस्टर के कम 16-बिट्स के उच्च 8 बिट्स तक पहुंचने के लिए आह) आपके रजिस्टरों को ट्रैकिंग में बहुत मुश्किल बना सकता है। सावधान रहें और उदारता से टिप्पणी करें जब तक आप चीजें नीचे न लें।

इसके अलावा, x86 बहुत सीधे आगे है। जब आप 'ली' और 'टेस्ट' जैसे निर्देशों का दुरुपयोग करना सीखते हैं, तो आप इसे प्यार करना सीखते हैं। इसके अलावा, प्रोटिप: इंटेल आपको निर्देश सेट मैनुअल की प्रतियां मुफ्त में भेज देगा, शिपिंग के लिए भी भुगतान नहीं करना होगा। पूर्ति ईमेल के लिए अपनी साइट के चारों ओर देखो और एसकेयू द्वारा किताबों का अनुरोध करें।

+0

आप सीडी [यहां] (https://secure.hibbertgroup.com/intel/spm?programId=1) ऑर्डर कर सकते हैं। दुर्भाग्यवश हार्ड कॉपी की पेशकश नहीं की जा रही है। – new123456

+1

x86 निर्देश सेट पुरातत्व द्वारा सबसे अच्छी तरह से समझा जाता है, मुझे लगता है - अगर आपने देखा है कि 8080 में क्या है, तो यह 8088 के डिजाइन को अस्पष्ट रूप से कैसे सूचित करता है, और आखिरकार 386 चीजों को शीर्ष पर कैसे जोड़ा जाता है, यह सब समझ में आता है। अन्यथा नियम थोड़ा मनमाना लगते हैं। – ijw

5

x86 में अधिकांश अन्य आर्किटेक्चर की तुलना में उपलब्ध रजिस्टरों का एक बहुत ही सीमित सेट है। यह वास्तव में असेंबली भाषा को सीखने के लिए कठिन नहीं बनाता है, लेकिन कभी-कभी अभ्यास में कोड को कार्यान्वित करना कठिन बनाता है।

इसके अलावा, मजबूत पिछड़ा संगतता के x86 इतिहास की वजह से, निर्देश सेट बहुत ही सममित (निश्चित रूप से पूर्व-आरआईएससी) नहीं है और नियम और कोने के मामलों पर ध्यान देने के लिए बहुत सारे अपवाद हो सकते हैं।

+0

हाँ, लेकिन यह एमआईपीएस की तुलना में सीमित नहीं है। :) – BobbyShaftoe

+3

@ बॉबी शाफ्टो, क्या आप एक असेंबली प्रोग्रामर हैं? एमआईपीएस में 32 सामान्य प्रयोजन रजिस्ट्रार हैं और x86 में 8 है जहां तक ​​मुझे पता है। – mmcdole

1

x86 में एमआईपीएस की तुलना में अधिक जटिल निर्देश हैं। तो शायद एमआईपीएस में सामान्य अनुक्रमों के लिए एक ही निर्देश है (सबसे विशेष रूप से स्मृति संबोधन)। कई रजिस्टरों की कमी निश्चित रूप से एक नुकसान है लेकिन दोनों आर्किटेक्चर में ऐसे सम्मेलन होते हैं जो आप आसानी से 4-5 तक उपयोग करने की संख्या को प्रतिबंधित करते हैं। X86 में बस अधिक स्पष्ट। x86 में एमआईपीएस की तुलना में पंजीकरण उपयोग के लिए अधिक अपवाद हैं जिन्हें आपको ध्यान में रखना है लेकिन लगातार इसके बारे में कुछ भी नहीं है।

अनुभव से बोलते हुए, या तो भाषा सीखने में समान कठिनाई होती है, सम्मेलन शामिल होते हैं। प्रचुर मात्रा में ऑनलाइन संसाधनों और इसकी लोकप्रियता पर विचार करते हुए शायद x86 एक आसान है।

x86 के बारे में कठिन हिस्सा बाइनरी उत्पन्न कर रहा है, इसकी परिवर्तनीय लंबाई निर्देश और कई एड्रेसिंग मोड के कारण। अक्सर, आपको इसे वैसे भी करने की ज़रूरत नहीं है।

मैं निश्चित रूप से आपको एमआईपीएस की तुलना में अधिक जटिल निर्देश वास्तुकला सीखने की सलाह दे सकता हूं।

और, यह महत्वपूर्ण है, आरआईएससी बनाम धार्मिक युद्ध का हिस्सा न बनें। CISC ...

1

मैं खुद को एक असेंबलर लिखने के लिए x86 और x86_64 सीख रहा हूं। यदि आप खुद को एक असेंबलर नहीं लिखेंगे तो मैं जो कुछ बताऊंगा वह काफी बेकार है। मुझे हालांकि एमआईपीएस के बारे में पता नहीं है।

x86 अप्रत्यक्ष पता एक जटिल बात है। एक एकल अनुदेश में, आप इन कर सकते हैं:

mov reg, [reg+offset] 
mov reg, [reg*scale+base register+offset] # in where scale can be 1, 2, 4 or 8. 

उनके अनुदेश एन्कोडिंग इस वजह से जटिल है, लेकिन यह हर अनुदेश कि इस तरह से encodes के लिए संगत है। आप इसे sandpile.org से पढ़ना चाहते हैं। यदि आप एन्कोडिंग के बारे में अधिक जानना चाहते हैं, तो आप हमेशा मुझसे इसके बारे में पूछ सकते हैं। एक और निर्देश एन्कोडिंग से संबंधित परेशान विवरण उपसर्ग हैं। वे निर्देश का अर्थ बदलते हैं। उदाहरण के लिए, 0x66 (अगर मुझे सही याद है) और कुछ निर्देश 32 बिट के बजाय 16 बिट जीपीआर के लिए बन जाते हैं।

32 बिट GPRS (क्रम में): eax, ECX, EDX, EBX, esp, ईबीपी, ईएसआई, ईडीआई

64 बिट GPRS: RAX, RCX, RDX, Rbx, आरएसपी, RBP, RSI, RDI, r8 , आर 9, आर 10, आर 11, आर 12, आर 13, आर 14, आर 15

ध्यान दें कि वहां कितने सामान्य प्रयोजन पंजीकृत हैं, इससे अधिकांश सॉफ्टवेयर इसे स्टैक-मशीन मैननेड तरीके से कम या ज्यादा उपयोग करने के लिए मजबूर करेंगे। एक दर्दनाक विस्तार। आरएसपी का उपयोग स्टैक (पॉप, पुश-इंस्ट्रक्शन) के लिए किया जाता है, और आरबीपी भी आरक्षित होता है। x86_64 में अधिक रजिस्ट्रार हैं, लेकिन इसमें समय लगेगा जब लोग इसे अपनाएंगे, भले ही प्रत्येक उपभोक्ता के पास प्रोसेसर सक्षम हो।

फ़्लोटिंग पॉइंट अंकगणित के लिए दो अलग-अलग निर्देश सेट हैं। एक्सएमएम नया है। X86_64 में 16 128 बिट रजिस्ट्रार उपलब्ध हैं और x86 में उनमें से केवल 8 हैं। पुराना निर्देश सेट एक स्टैक के रूप में रजिस्टरों को संभालता है। आपके पास स्वैप, निप या सड़ांध नहीं है, इसलिए इसके साथ काम करना दिमागी झुकाव है।

उपयोग में x86 एक आरआईएससी मशीन में कम करने के लिए जाता है। उनमें से कुछ जटिल निर्देश लाभ नहीं देते हैं या नई मशीनों पर भी धीमे होते हैं। आप जो पढ़ रहे हैं या लिख ​​रहे हैं उसके आधार पर आप 30-150 निर्देशों के बारे में समझने के साथ करेंगे। आप कुछ पुराने निर्देशों और AL/HL -stuff को पूरी तरह अनदेखा भी कर सकते हैं। 1 9 78 के पीछे इस अव्यवस्था की उत्पत्ति को ध्यान में रखें, जो आश्चर्यजनक है कि यह बदतर नहीं है, उससे 31 साल और आईए -32 के पहले परिचय से 24 साल। उस समय बहुत सी चीजें अपनी प्रासंगिकता बदलती हैं।

प्रत्यक्ष कूद और कॉल x86 में अगले निर्देश से संबंधित प्रतीत होते हैं। इसलिए:

jmp nowhere # or call, jz, jg whatever... 
nowhere: 
    nop 

'जेएमपी इम: 0, एनओपी' को एन्कोड किया गया। रजिस्टर-अप्रत्यक्ष जेएमपी जो पूर्ण कूदता है। यह भी ध्यान रखना अच्छा होता है कि पंजीकरण-अप्रत्यक्ष सशर्त कूद नहीं हैं, इससे मुझे भी परेशान किया गया।

यहां सबकुछ संभव नहीं है जो आपको पता होना चाहिए, लेकिन पहले प्रश्न जो आपके दिमाग में आपके प्रश्न से आता है। लेकिन शायद आप इनके साथ अब मिल सकते हैं।

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