2010-10-24 18 views
8

Quindi ho il seguente codice linguaggio assembly che ho bisogno di convertire in C. Sono confuso su alcune righe del codice.Assembly language to C

Capisco che questo è un ciclo for. Ho aggiunto i miei commenti su ogni riga.

penso che il ciclo for va come questa

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

Qual è la condizione di prova? E come lo cambio?

Osservando il codice assembly, cosa fa la variabile 'n'?

Questo è Intel x86 così formato è movl = fonte, DEST

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 controlla se edx è 0. e quindi jne - salta se non zero. –

+0

Quali linee si confondono? In C, un ciclo for è per (;;) {} –

+0

Perché stai convertendo asm legacy in C? –

risposta

14

sall %cl, %edx turni% EDX lasciati dagli %cl bit. (%cl, per riferimento, è il byte basso di %ecx.) Il successivo testl verifica se lo spostamento è stato azzerato su% edx.

Il jne viene chiamato così perché è spesso utilizzato nel contesto di confronti, che in ASM sono spesso solo sottrazioni. Le bandiere sarebbero impostate in base alla differenza; ZF verrebbe impostato se gli elementi sono uguali (poiché x - x == 0). Si chiama anche jnz nella sintassi Intel; non sono sicuro che GNU lo consenta.

Tutte insieme, le tre istruzioni si traducono in i <<= n; if (i != 0) goto L2;. Quello più l'etichetta sembra fare un ciclo for.

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

O, più correttamente (ma raggiungere lo stesso obiettivo), un do ... while loop.

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

Grazie! E 'stato molto utile. – Catie