Penso che questo sia in realtà un problema piuttosto semplice. Devo decodificare questo codice assembly in codice c. Fornirò anche ciò che penso stia succedendo, quindi puoi sperare di indicare dove ho sbagliato e ora posso imparare dai miei errori.Codice dell'assieme di ingegnere inverso al codice c
.LFBO
pushq %rbp
movq %rsp,%rbp
movl %edi,-4(%rbp)
movl %esi,-8(%rbp)
movl -4(%rbp),%eax
compl -8(%rbp),%eax
jg .L2
movl -8(%rbp),%eax
jmp .L3
.L2:
movl -4(%rbp),%eax
.L3:
popq %rbp
ret
Quindi questo è quello che penso sta succedendo con questo: le prime due righe dopo .LFBO:
pushq %rbp
movq %rsp,%rbp
sono solo la creazione di stack per l'esecuzione che sta per seguire.
movl %edi,-4(%rbp)
è afferrare la prima variabile, chiamano x
movl %esi,-8(%rbp)
è afferrare la seconda variabile chiamano y
movl -4(%rbp),%eax
è afferrare x da confrontare nella riga successiva
compl -8(%rbp),%eax
confronto es le variabili xey calcolando xy
jg .L2
dice salto per .L2 se x> y
se x = y < poi calcolare le prossime righe senza saltare a .L2
movl -8(%rbp),%eax
copia x = y
jmp .L3
salti al .L3
se x> y alla linea jg poi saltare a .L2: e completare questa linea
movl -4(%rbp),%eax
questo è dove mi sono reso conto che ero davvero confuso. Sembra a me che si sta copiando x di x poi .L3 è completata e penso che x viene restituito
solo per confermare, questo è il montaggio di AT & T-sintassi x86? – Dai
Non penso che tu fossi confuso. Stai solo guardando un codice non ottimizzato, quindi ci sono linee completamente inutili (come l'assegnazione di x a x come hai detto tu). Quindi cosa ne pensi della funzione, visto tutto questo? – JS1
Sì, credo che questo sia l'assembly x86 della sintassi AT & T. È stato creato dal codice c su un linux @Dai – scottybobby