Oltre all'apprendimento, credo che imparare come sia compilato un linguaggio di basso livello come C sia estremamente prezioso. Quindi la mia risposta è sì, ma di nuovo probabilmente sono di parte perché mi piace la programmazione di basso livello.
Ad esempio, basta capire come vengono compilate le semplici dichiarazioni. La seguente funzione,
int func(int val)
{
int num = val * 5;
return num;
}
... diventa (almeno la parte interessante):
movl %edi, -20(%rbp)
movl -20(%rbp), %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
Questo codice prende l'argomento dallo stack (val, il parametro su func), lo sposta di 2 posizioni a sinistra (moltiplicandolo per 2 ^ 2 o 4) e quindi aggiunge il valore originale al risultato. Il risultato finale è una moltiplicazione per 5. Un esempio come questo illustra una serie di cose di cui tenere conto, come le ottimizzazioni del compilatore. Invece di chiamare un'istruzione per moltiplicare direttamente per 5, sposta due posizioni per moltiplicare per 4 e quindi aggiunge il valore originale. Ho trovato esempi come questo per migliorare notevolmente la mia comprensione delle cose a un livello inferiore.
Genera l'output dell'assembler da gcc con l' -S
opzione. Tuttavia, tenere presente che i risultati variano in base al compilatore e al livello di ottimizzazione.
Ad ogni modo, non penso che essere un programmatore del linguaggio assembly sia uguale alla comprensione dell'assembly . Ancora una volta, sento che programmare in un linguaggio come C e sapere come viene inserito nel codice macchina è una pratica preziosa.