Il punto di questo problema è di eseguire il reverse engineering del codice c che è stato effettuato dopo aver eseguito il compilatore con l'ottimizzazione di livello 2. Il codice originale c è la seguente (calcola il massimo comun divisore):Tecnico di retromarcia ottimizzato codice c dal gruppo
int gcd(int a, int b){
int returnValue = 0;
if (a != 0 && b != 0){
int r;
int flag = 0;
while (flag == 0){
r = a % b;
if (r ==0){
flag = 1;
} else {
a = b;
b = r;
}
}
returnValue = b;
}
return(returnValue);
}
quando ho eseguito il compilazione ottimizzato ho eseguito dalla riga di comando:
gcc -O2 -S Problem04b.c
per ottenere il file di assiemi per questo codice ottimizzato
.gcd:
.LFB12:
.cfi_startproc
testl %esi, %esi
je .L2
testl %edi, %edi
je .L2
.L7:
movl %edi, %edx
movl %edi, %eax
movl %esi, %edi
sarl $31, %edx
idivl %esi
testl %edx, %edx
jne .L9
movl %esi, %eax
ret
.p2align 4,,10
.p2align 3
.L2:
xorl %esi, %esi
movl %esi, %eax
ret
.p2align 4,,10
.p2align 3
.L9:
movl %edx, %esi
jmp .L7
.cfi_endproc
ho bisogno di convertire il codice assembly di nuovo al codice C qui è dove mi trovo in questo momento:
int gcd(int a int b){
/*
testl %esi %esi
sets zero flag if a is 0 (ZF) but doesn't store anything
*/
if (a == 0){
/*
xorl %esi %esi
sets the value of a variable to 0. More compact than movl
*/
int returnValue = 0;
/*
movl %esi %eax
ret
return the value just assigned
*/
return(returnValue);
}
/*
testl %edi %edi
sets zero flag if b is 0 (ZF) but doesn't store anything
*/
if (b == 0){
/*
xorl %esi %esi
sets the value of a variable to 0. More compact than movl
*/
int returnValue = 0;
/*
movl %esi %eax
ret
return the value just assigned
*/
return(returnValue);
}
do{
int r = b;
int returnValue = b;
}while();
}
Qualcuno può aiutarmi a scrivere di nuovo in codice c? Sono praticamente perso.
Si dovrebbe essere perso, c'è un rason, perché non ci sono strumenti di automazione inversa utili fino ad ora. Tuttavia, sono ancora curioso di questo e di eventuali risposte. – icbytes
Si potrebbe trarre beneficio (forse solo un po ') visualizzando l'assemblaggio generato, che viene mescolato con il codice C. All'interno di 'gdb' puoi usare' disas/m gcd', o un altro modo è 'objdump' con' -S' flag. –
Dovresti compilare con 'gcc -fverbose-asm -O2 -S Problem04b.c' e potresti usare' -fdump-tree-all' per ottenere molti file di dump intermedi che rappresentano le rappresentazioni interne nelle varie fasi della compilazione. –