Sto osservando alcuni assembly che sono stati generati smontando alcuni programmi C e sono confuso da una singola ottimizzazione che vedo ripetuta frequentemente.Perché GCC emette "lea" invece di "sub" per la sottrazione?
Quando ho nessuna ottimizzazione sul compilatore GCC utilizza l'istruzione subl
per sottrazione, ma quando devo ottimizzazioni attivata (-O3
per la precisione) il compilatore utilizza un'istruzione invece di sottrazione leal
, l'esempio qui sotto:
senza ottimizzazioni:
83 e8 01 subl $0x1, %eax
con le ottimizzazioni
8d 6f ff leal -0x1(%edi), %ebp
Entrambe queste istruzioni sono lunghe 3 byte, quindi qui non vedo un'ottimizzazione. Qualcuno potrebbe aiutarmi e cercare di spiegare la scelta del compilatore?
Qualsiasi aiuto sarebbe apprezzato.
Non l'avevo considerato da questa prospettiva perché la versione non ottimizzata utilizza solo valori immediati nelle sottrazioni. Grazie, questo è stato molto utile. –