मैं वर्तमान में x86 असेंबली भाषा सीख रहा हूं और सोच रहा हूं कि लूप को लागू करने का बेहतर तरीका क्या है। एक तरीका यह है कि ईसीएक्स रजिस्टर के लिए एक मूल्य चलाना होगा और लूप निर्देश का उपयोग करना होगा और दूसरा तरीका एक जेएमपी निर्देश का उपयोग करेगा और फिर लूप बॉडी आता है और फिर अंततः लूप बॉडी की शुरुआत में एक सशर्त कूदता है। मुझे लगता है कि पहले व्यक्ति की बेहतर पठनीयता होगी लेकिन अन्य तो मुझे नहीं पता कि इसका उपयोग क्यों किया जाए।x86 असेंबली प्रोग्रामिंग lops ecx और लूप निर्देश बनाम jmp + j <condition>
उत्तर
जब आप jmp + body + test का उल्लेख करते हैं, तो मेरा मानना है कि आप while
लूप को उच्च-स्तरीय भाषाओं में अनुवाद के बारे में बात कर रहे हैं। दूसरे दृष्टिकोण के लिए एक कारण है। चलो एक नज़र डालते हैं।
पर विचार करें
x = N
while (x != 0) {
BODY
x--
}
अनुभवहीन रास्ता
mov ecx, N ; store var x in ecx register
top:
cmp ecx, 0 ; test at top of loop
je bottom ; loop exit when while condition false
BODY
dec ecx
jmp top
bottom:
इस एन सशर्त छलांग और एन बिना शर्त छलांग है।
दूसरा तरीका है:
mov ecx, N
jmp bottom
top:
BODY
dec ecx
bottom:
cmp ecx, 0
jne top
अब हम अभी भी एन सशर्त छलांग है, लेकिन हम केवल एक बिना शर्त कूद करते हैं। एक छोटी बचत लेकिन यह सिर्फ मायने रखती है, खासकर क्योंकि यह एक पाश में है।
अब आप उल्लेख loop
अनुदेश जो अनिवार्य रूप से है
dec ecx
cmp ecx, 0
je somewhere
आप में है कि कैसे काम करेगा था? शायद इस तरह:
mov ecx, N
cmp ecx, 0 ; Must guard against N==0
je bottom
top:
BODY
loop top ; built-in dec, test, and jump if not zero
bottom:
यह सीआईएससी प्रोसेसर की तरह एक बहुत छोटा समाधान है। क्या यह उपरोक्त दूसरे तरीके से तेज़ है? यह वास्तुकला पर एक बड़ा सौदा निर्भर करता है। मेरा सुझाव है कि आप आईए -32 और इंटेल 64 प्रोसेसर आर्किटेक्चर में loop
निर्देश के प्रदर्शन पर कुछ शोध करें, यदि आप वास्तव में और जानना चाहते हैं।
धन्यवाद, इससे थोड़ी देर में मदद मिली, मैं ecx पाश की गति के बारे में कुछ और शोध करने की कोशिश करूंगा :) – rob
@rob, खुश शोध। क्या मैं सुझाव दे सकता हूं कि http://www.agner.org/optimize/optimizing_assembly.pdf? एक अद्भुत संसाधन। बहुत लम्बा। पृष्ठ 89 पर यह उल्लेख किया गया है कि आपको जेईसीएक्सजेड और लूप से बचना चाहिए क्योंकि वे अधिक आधुनिक वास्तुकला पर इतना कुशल नहीं हैं। –
संबंधित: [लूप निर्देश धीमा क्यों है? इंटेल ने इसे कुशलतापूर्वक कार्यान्वित नहीं किया है?] (कुछ ऐतिहासिक के लिए https://stackoverflow.com/questions/35742570/why-is-the-loop-instruction-slow-couldnt-intel-have-implemented-it- कुशलतापूर्वक) कारकों। मजेदार तथ्य: एएमडी बुलडोजर/रेजेन में तेज़ 'लूप' है, लेकिन कुछ भी नहीं करता है। यह भी संबंधित है: [लूप हमेशा इस तरह संकलित क्यों होते हैं?] (Https://stackoverflow.com/questions/47783926/why-are-loops-always-compiled-like-this) कुशल लूप संरचनाओं के लिए: जैसा कि आप कहते हैं, सशर्त नीचे की शाखा, और विभिन्न रणनीतियों को अगर इसे 0 बार चलाने की आवश्यकता हो सकती है। –
- 1. x86 निर्देश सेट रोडमैप
- 2. AMD64 - nopw असेंबली निर्देश?
- 3. x86 असेंबली भाषा में लूप कैसे बनाएं?
- 4. x86 असेंबली
- 5. x86 निर्देश एन्कोडिंग टेबल
- 6. x86 असेंबली
- 7. x86 असेंबली
- 8. x86 असेंबली
- 9. x86 असेंबली
- 10. x86 असेंबली में संकलित प्रत्येक निर्देश कितने बाईस है?
- 11. डीओएस 32-बिट x86 असेंबली
- 12. जेएनजेड और सीएमपी असेंबली निर्देश
- 13. x86 असेंबली गुणा और निर्देश निर्देशों को विभाजित करें, 16-बिट और उच्च
- 14. x86 असेंबली से एलएलवीएम
- 15. x86 असेंबली संदर्भ पत्र
- 16. x86 अधिकतम/मिनट ASM निर्देश?
- 17. एआरएम असेंबली - शाखा निर्देश
- 18. अवैध निर्देश ++ जब सी प्रोग्रामिंग लिनक्स
- 19. एक्स 86 असेंबली - आईडीआईवी निर्देश को संभालना
- 20. x86, BYTE और BYTE PTR
- 21. x64 बिट प्रोसेसर पर x86 असेंबली लिखना
- 22. टी 4 टेम्पलेट असेंबली निर्देश
- 23. imul असेंबली निर्देश - एक ऑपरेंड?
- 24. असेंबली में कूद निर्देश कई प्रक्रियाओं के साथ कैसे काम करता है?
- 25. ट्यूरिंग पूर्ण अल्फान्यूमेरिक x86 निर्देश सेट (सब्सक्राइब)
- 26. मानचित्रण <C-j> विम
- 27. x86 में "PAUSE" निर्देश का उद्देश्य क्या है?
- 28. x86 (-64) पर हस्ताक्षरित और हस्ताक्षरित गुणात्मक निर्देश क्यों हैं?
- 29. x86 एक पते पर जाएं
- 30. x86 बनाम x64
कभी नहीं पता/कब इसे स्वीकार करना है क्योंकि हमेशा मुझे एक बेहतर जवाब मिल सकता है? क्या यह वास्तव में महत्वपूर्ण है? क्योंकि मैं वास्तव में नहीं जानता। – rob
संबंधित: [लूप हमेशा इस तरह संकलित क्यों होते हैं?] (Https://stackoverflow.com/questions/47783926/why-are-loops-always-compiled-like- यह): 'हमेशा ऐसा करने के लिए सबसे अच्छा है {} जबकि() 'एएसएम में संरचना, नीचे एक सशर्त शाखा के साथ। यदि लूप को 0 बार चलाने की आवश्यकता हो सकती है, तो नीचे jmp एक रणनीति है, लेकिन आमतौर पर सबसे अच्छा नहीं है। –