2011-07-24 10 views
12

मैं वर्तमान में x86 असेंबली भाषा सीख रहा हूं और सोच रहा हूं कि लूप को लागू करने का बेहतर तरीका क्या है। एक तरीका यह है कि ईसीएक्स रजिस्टर के लिए एक मूल्य चलाना होगा और लूप निर्देश का उपयोग करना होगा और दूसरा तरीका एक जेएमपी निर्देश का उपयोग करेगा और फिर लूप बॉडी आता है और फिर अंततः लूप बॉडी की शुरुआत में एक सशर्त कूदता है। मुझे लगता है कि पहले व्यक्ति की बेहतर पठनीयता होगी लेकिन अन्य तो मुझे नहीं पता कि इसका उपयोग क्यों किया जाए।x86 असेंबली प्रोग्रामिंग lops ecx और लूप निर्देश बनाम jmp + j <condition>

+0

कभी नहीं पता/कब इसे स्वीकार करना है क्योंकि हमेशा मुझे एक बेहतर जवाब मिल सकता है? क्या यह वास्तव में महत्वपूर्ण है? क्योंकि मैं वास्तव में नहीं जानता। – rob

+0

संबंधित: [लूप हमेशा इस तरह संकलित क्यों होते हैं?] (Https://stackoverflow.com/questions/47783926/why-are-loops-always-compiled-like- यह): 'हमेशा ऐसा करने के लिए सबसे अच्छा है {} जबकि() 'एएसएम में संरचना, नीचे एक सशर्त शाखा के साथ। यदि लूप को 0 बार चलाने की आवश्यकता हो सकती है, तो नीचे jmp एक रणनीति है, लेकिन आमतौर पर सबसे अच्छा नहीं है। –

उत्तर

12

जब आप 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 निर्देश के प्रदर्शन पर कुछ शोध करें, यदि आप वास्तव में और जानना चाहते हैं।

+0

धन्यवाद, इससे थोड़ी देर में मदद मिली, मैं ecx पाश की गति के बारे में कुछ और शोध करने की कोशिश करूंगा :) – rob

+3

@rob, खुश शोध। क्या मैं सुझाव दे सकता हूं कि http://www.agner.org/optimize/optimizing_assembly.pdf? एक अद्भुत संसाधन। बहुत लम्बा। पृष्ठ 89 पर यह उल्लेख किया गया है कि आपको जेईसीएक्सजेड और लूप से बचना चाहिए क्योंकि वे अधिक आधुनिक वास्तुकला पर इतना कुशल नहीं हैं। –

+0

संबंधित: [लूप निर्देश धीमा क्यों है? इंटेल ने इसे कुशलतापूर्वक कार्यान्वित नहीं किया है?] (कुछ ऐतिहासिक के लिए 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 बार चलाने की आवश्यकता हो सकती है। –

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