2009-08-15 6 views
10

दोनों उपकरण असेंबली निर्देश सीधे मशीन कोड में अनुवाद करते हैं, लेकिन क्या यह निर्धारित करना संभव है कि कौन सा सबसे तेज़ और साफ कोड उत्पन्न करता है?गैस बनाम नासम: कौन सा असेंबलर सबसे अच्छा कोड उत्पन्न करता है?

उत्तर

26

जब आप असेंबलर में लिख रहे हैं, आप उत्पन्न करने के निर्देशों का सटीक वर्णन कर रहे हैं, इसलिए यह असेंबलर पर निर्भर नहीं है। यह आप पर निर्भर करता है। आपके द्वारा लिखे गए निमोनिक्स और मशीन कोड में वास्तविक निर्देशों के बीच एक-से-एक पत्राचार है।

+13

तकनीकी रूप से यह सच नहीं है; मोड को संबोधित करने जैसी चीजों के लिए, एक ही स्थान को एन्कोड करने के एक से अधिक तरीके हो सकते हैं। ऐसे अन्य आइसोमोर्फिस हैं जिन्हें मैं भूल गया हूं; दिन में वापस से एक x86 शेयरवेयर असेंबलर इन आइसोमोर्फिस को "फिंगरप्रिंट" कोड के साथ इकट्ठा करता है, जिसमें चीट्स को पकड़ने के लिए एक दृश्य होता है। –

+1

मैं समझता हूं कि आप क्या कह रहे हैं। इसी तरह के प्रभाव के साथ विभिन्न मशीन कोड निर्देश हो सकते हैं। तकनीकी रूप से, एक असेंबलर उन निर्देशों के लिए दो अलग-अलग प्रस्तुतिकरण प्रदान कर सकता है ('int3' और' int 3') या कुछ संकेतों का उपयोग करने के लिए चुनें कि कौन सा उत्पन्न करना है। ये सामान आमतौर पर प्रत्येक असेंबलर के लिए प्रलेखित होते हैं। मुझे लगता है कि इस प्रश्न के उद्देश्य के लिए, सैद्धांतिक रूप से इन मुद्दों को अनदेखा करना उचित है, ** वे वास्तव में अलग-अलग निर्देश हैं ** और असेंबलर आपको एक से चुनने की अनुमति दे सकता है। –

+4

यहां तक ​​कि असेंबलर में भी ऑप्टिज़िंग के लिए कुछ जगह है। बहुत से आर्किटेक्चर एड्रेसिंग के लिए छोटे तरीके की अनुमति देते हैं, उदाहरण के लिए रिश्तेदार विस्थापन के लिए एक लंबे समय के बजाय बाइट मान का उपयोग करना। चूंकि यह अनुकूलन ऑब्जेक्ट कोड के आकार को बदलता है, इसलिए कुछ विस्थापन छोटे रूप में उपयोग किए जा सकते हैं, इसलिए एक बहु पास अनुकूलन की आवश्यकता होती है। AFAIK yasm यह कर सकते हैं। – hirschhornsalz

4

यह माना जाता है ... यह कोड अनुकूलित नहीं करता है। यह सिर्फ अनुवाद के रूप में अनुवाद करता है। तो सबसे तेज़ और साफ कोड प्रोग्रामर या कंपाइलर

+1

ठीक है! अब, असेंबलर भी एक कंपाइलर सही है? क्या यह यहां और वहां एक सीपीयू चक्र बचा सकता है? यह मेरा शक था ... –

+1

असेंबलर एक कंपाइलर नहीं है। एक कंपाइलर आम तौर पर एक असेंबलर पर निर्भर करता है। और असेंबलर असेंबली का अनुवाद बाइनरी ओप कोड में करता है। – tsturzl

2

स्पष्ट रूप से नाक है क्योंकि इंटेल सिंटैक्स AT & टी सिंटैक्स से अधिक क्लीनर दिखता है।

+0

हां, साफ "देखो" एक प्लस के रूप में भी मायने रखता है, मुझे लगता है। –

+4

मैं ईमानदारी से एटी एंड टी वाक्यविन्यास पसंद करते हैं। मुझे लगता है कि यह कोड स्पष्ट के इरादे को स्थानांतरित करता है और कम अव्यवस्थित दिखता है। वहां बहुत बुरी तरह से बहुत कम दस्तावेज है। – kmm

+4

+1 एटी एंड टी पर इंटेल सिंटैक्स की सिफारिश करने के लिए। दोस्त दोस्तों को एटी एंड टी का उपयोग नहीं करते हैं। – Jason

1

@Brian: इस सवाल का नहीं था ...

@ cyber98834: अपनी opcode के लिए हर अनुदेश का अनुवाद: ठीक है, एक कोडांतरक क्या हर कोडांतरक करना चाहिए करता है।

कोई अनुकूलन नहीं है।

ओह और भी, "सबसे तेज़ कोड" जैसी कोई चीज़ नहीं है ... क्या मैं आपको एक प्रश्न पूछ सकता हूं? सीपीयू की गति स्थिर है, है ना?

तो, आप कोड को तेज़ी से नहीं चला सकते क्योंकि आप CPU की गति को नहीं बदल सकते हैं।

लेकिन, आप कोड को छोटा कर सकते हैं ताकि सीपीयू कम मात्रा में निर्देशों को संभाल सके, और इसलिए चलाने के लिए कम समय लगता है।

मुझे उम्मीद है कि आप समझेंगे कि मैं क्या कहने की कोशिश कर रहा हूं।

मैं आपको खरीदने के लिए सुझाव देता हूं (या कुछ पीडीएफ की तलाश करने के लिए, लेकिन मुझे नहीं पता कि यह कानूनी है या नहीं) माइकल एब्राश के ग्राफिक्स प्रोग्रामिंग ब्लैक बुक जिसमें कई अनुकूलन सबक शामिल हैं।

+0

हाय SBouazza! मैं आपके बिंदु को समझता हूं। धन्यवाद! मुझे पहले से ही माइकल एब्राश के ग्राफिक्स प्रोग्रामिंग ब्लैक बुक तैयार (http://www.gamedev.net/reference/articles/article1698.asp) मिल गया है :) –

7

मैं इन दो विशिष्ट उपकरणों के बारे में पता नहीं है, लेकिन कुछ निर्देश है कि अलग एन्कोड किया जा सकता है देखते हैं:

  • ADD AX,1 या तो 05 01 या 81 c0 01 या fe c0
  • INT 3 है या तो cc या cd 03
  • नया AVX दो-बाइट एसएसई निर्देशों का विस्तार करने वाले निर्देशों में या तो 2-बाइट या 3-बाइट उपसर्ग होगा। सभी 2-बाइट उपसर्गों को 3-बाइट उपसर्ग के रूप में भी एन्कोड किया जा सकता है।

ये मेरे सिर के शीर्ष से कुछ उदाहरण हैं कि कैसे असेंबलर्स एक ही निर्देश को अलग-अलग एन्कोड कर सकते हैं, इसलिए सवाल वास्तव में समझ में आता है।

+0

अधिकांश असेंबलर आमतौर पर न्यूनतम आकार के साथ निर्देश चुनते हैं और वे आपको विशेष रूप से चुनने के लिए संकेत प्रदान कर सकते हैं कि आप कौन सी जेनरेट करना चाहते हैं। उदाहरण के लिए, सीपीयू के परिप्रेक्ष्य से 'सीसी' और' सीडी 03' दो अलग-अलग निर्देश हैं। एक निर्देश उत्पन्न करने का तरीका प्रदान न करने का चयन करने के लिए यह पूरी तरह से असेंबलर की तरफ से है। –

+0

मैं मानता हूं कि एक अच्छा असेंबलर * ऐसा करना चाहिए। मैं बस उन तरीकों को इंगित कर रहा हूं जिनमें एक असेंबलर कुछ अलग कर सकता है। उदाहरण के लिए, 'fe c0' के रूप में एन्कोड किया गया 'आईएनसी एक्स' बिल्कुल 'एडीडी एक्स' जैसा है, जो' 05 01' के रूप में एन्कोड किया गया है, जहां तक ​​कार्यक्षमता और निर्देश की लंबाई का संबंध है, हालांकि वे वास्तव में सीपीयू में अलग-अलग डीकोड किए जाते हैं। –

+0

यही वह है जो मैं वास्तव में अपने प्रश्न के साथ देख रहा था। मैं x86 असेंबली (इंटेल मैनुअल पढ़ रहा हूं) सीखना शुरू कर रहा हूं और इसके लिए लिनक्स टूल का उपयोग करना चाहता हूं, लेकिन इस बारे में संदेह था कि किस टूल से शुरू करना है। चूंकि ऐसा लगता है कि गैस और नस्ल के बीच कोई वास्तविक अंतर मौजूद नहीं है, इसलिए मैं मित्रवत सिंटैक्स की वजह से नाक उठाऊंगा। सहायता के लिए धन्यवाद! –

5

वाक्यविन्यास-पदार्थ पर एक sidenote के रूप में। आप अपने स्रोत फ़ाइल के शीर्ष पर निम्न पंक्ति लगाकर गैस काम इंटेल वाक्य रचना के साथ बिल्कुल ठीक हो सकता है:

.intel_syntax noprefix 

मैं इंटेल वाक्य रचना भी उपयोग कर रहा हूँ मेरे सारे assmebly की जरूरत के लिए। यह AT & टी वाक्यविन्यास से कहीं अधिक प्राकृतिक लगता है। और यह कुछ कीस्ट्रोक बचाता है :-)।

+0

_Recent_ गैस। यदि आप ओएस/2 पर हैं तो आप भाग्य से बाहर हो सकते हैं :) –

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