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;
}
'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). –
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_. –