2015-09-08 19 views
5

ho questo codice assembly x86 e sto cercando di convertirlo in C:Convert X 86 Assemblea salto Tabella C

.GLOBAL calculate 
calculate: 
    pushl %ebp 
    movl %esp,%ebp 
    movl 12(%ebp),%eax 
    movl 8(%ebp),%ecx 
    cmpl $2,%ecx 
    ja done 
    jmp *operations(,%ecx,4) 
operation1: 
    imull %eax,%eax 
    jmp done 
operation2: 
    negl %eax 
    jmp done 
operation3: 
    addl $0x80,%eax 
done: 
    leave 
    ret 
operations: 
    .long operation1, operation2, operation3 

La mia domanda riguarda la linea jmp *operations(,%ecs,4). Penso che questa sia una dichiarazione di commutazione e so come funziona in memoria, ma come si traduce in C? Non dovrei sapere cosa c'è in pila in quei luoghi per scrivere un interruttore per questo?

Questo è quello che ho:

int calculate(int a, int b) 
{ 
    if (2 > a) 
    { 
     return b; 
    } 
    switch(a) { 
     case /* ? */: 
      b = (b * b); 
      break; 
     case /* ? */: 
      b = (b * -1); 
      break; 
     case /* ? */: 
      b = (b + 128); 
      break; 
    } 
    return b; 
} 
+5

'caso 0:', 'caso 1:'. 'caso 2:' è ciò che penso tu stia cercando. Lo switch è basato sul valore della variabile 'a' (che è' ecx' nel codice del tuo assemblatore). –

+2

L'assemblatore è _at & t syntax_ così la destinazione è sulla destra e la fonte sulla sinistra. 'cmpl $ 2,% ecx' sarebbe l'equivalente di prendere' ecx' e sottrarre 2 da esso e impostare i flag in base al risultato. Quindi il codice assemblatore 'ja' sarebbe l'equivalente di testare se' ecx> 2' e saltare a done se lo fosse. Ciò si tradurrebbe in 'if (a> 2) return b;' in _C_. –

risposta

0
%ecx == 0 -> operations(,%ecx,4) == operations+0 and operation1 is there 
%ecx == 1 -> operations(,%ecx,4) == operations+4 and operation2 is there 
%ecx == 2 -> operations(,%ecx,4) == operations+8 and operation3 is there 

Di conseguenza, il codice dovrebbe essere

int calculate(int a, int b) 
{ 
    if ((unsigned int)a > 2) /* ja is a comparation instruction for unsigned integers */ 
    { 
     return b; 
    } 
    switch(a) { 
     case 0: 
      b = (b * b); 
      break; 
     case 1: 
      b = (b * -1); 
      break; 
     case 2: 
      b = (b + 128); 
      break; 
    } 
    return b; 
}