2010-10-24 11 views
8

तो मेरे पास निम्नलिखित असेंबली भाषा कोड है जिसे मुझे सी में परिवर्तित करने की आवश्यकता है। मैं कोड की कुछ पंक्तियों पर उलझन में हूं।विधानसभा भाषा सी

मैं समझता हूं कि यह for लूप है। मैंने प्रत्येक पंक्ति पर अपनी टिप्पणियां जोड़ दी हैं।

मुझे लगता है कि for पाश इस

for (int i = 1; i > 0; i << what?) { 
    //Calculate result 
} 

क्या परीक्षण शर्त है की तरह हो जाता है? और मैं इसे कैसे बदलूं?

असेंबली कोड को देखते हुए, चर 'एन' क्या करता है?

यह है, तो प्रारूप movl = स्रोत है इंटेल x86 है डेस्ट

movl 8(%ebp), %esi  //Get x 
    movl 12(%ebp), %ebx //Get n 
    movl $-1, %edi   //This should be result 
    movl $1, %edx   //The i of the loop 
.L2: 
    movl %edx, %eax 
    andl %esi, %eax 
    xorl %eax, %edi  //result = result^(i & x) 
    movl %ebx, %ecx  //Why do we do this? As we never use $%ebx or %ecx again 
    sall %cl, %edx   //Where did %cl come from? 
    testl %edx, %edx  //Tests if i != what? - condition of the for loop 
    jne .L2    //Loop again 
    movl %edi, %eax  //Otherwise return result. 
+1

testl% edx,% edx चेक करता है अगर edx 0 है और फिर शून्य - शून्य नहीं है तो शून्य। –

+0

आप किन लाइनों को भ्रमित कर रहे हैं? सी में, लूप के लिए एक है (;;) {} –

+0

आप लीगेसी एएसएम को सी में परिवर्तित क्यों कर रहे हैं? –

उत्तर

14

sall %cl, %edx बदलाव% EDX %cl बिट्स द्वारा छोड़ा। (%cl, संदर्भ के लिए, %ecx का निम्न बाइट है।) testl परीक्षण करता है कि क्या बदलाव% edx से शून्य हो गया है या नहीं।

jne कहा जाता है क्योंकि यह अक्सर तुलना के संदर्भ में उपयोग किया जाता है, जो एएसएम अक्सर अक्सर घटाव होता है। झंडे अंतर के आधार पर सेट किया जाएगा; यदि आइटम बराबर हैं (x - x == 0) से ZF सेट किया जाएगा। इंटेल सिंटैक्स में इसे jnz भी कहा जाता है; मुझे यकीन नहीं है कि जीएनयू भी उसे अनुमति देता है या नहीं।

सभी एक साथ, तीन निर्देश i <<= n; if (i != 0) goto L2; पर अनुवाद करते हैं। वह प्लस लेबल लूप के लिए प्रतीत होता है।

for (i = 1; i != 0; i <<= n) { result ^= i & x; } 

या, अधिक सही ढंग से (लेकिन एक ही लक्ष्य को प्राप्त करने), एक ऐसा ... जबकि पाश।

i = 1; 
do { result ^= i & x; i <<= n; } while (i != 0); 
+0

धन्यवाद! वह बहुत उपयोगी था। – Catie

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