Oltre l'assemblaggio dell'apprendimento, credo che l'apprendimento di come viene redatto un linguaggio di basso livello come C è molto prezioso. Quindi la mia risposta è sì, ma poi di nuovo sono probabilmente di parte perché mi piace la programmazione di basso livello.
Ad esempio, basta capire come vengono compilate semplici istruzioni. La seguente funzione,
int func(int val)
{
int num = val * 5;
return num;
}
... diventa (il bit interessante almeno):
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 da func), lo sposta di 2 posizioni (moltiplicato 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 un numero di cose da tenere presente, come le ottimizzazioni del compilatore. Invece di chiamare un'istruzione per moltiplicare direttamente per 5, sposta due punti 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 assembler da gcc con l'opzione -S
. Tuttavia, tieni presente che i risultati variano a seconda del compilatore e del livello di ottimizzazione.
In ogni caso, non credo che essere un programmatore di linguaggio assembly sia lo stesso di capire l'assembly . Di nuovo, sento che programmare in un linguaggio come C e sapere come viene inserito nel codice macchina è una pratica preziosa.