2011-07-08 14 views
64

Vale ancora la pena di imparare ASM?Vale la pena imparare il linguaggio assembly?

Conosco un po 'di esso, ma non l'ho ancora usato o imparato correttamente perché tutto ciò che imparo a fare in assembler lo posso fare in 1/10 di tempo con un linguaggio come C o C++. Quindi, dovrei davvero imparare e usare ASM? Mi farà del bene professionalmente? Aumenterà la mia intraprendenza? In breve, mi renderebbe un programmatore migliore?

Nota: sto parlando di assemblaggio di basso livello come FASM o NASM e non qualcosa di simile HLA (alto livello Assembler).

+1

Nota, quel linguaggio assembly legato a un processore/controller. – rmflow

+1

Vuoi dire che non è multipiattaforma? !! – ApprenticeHacker

+0

No. Ad esempio: http://www.worldofspectrum.org/Z80instructions.html – rmflow

risposta

78

Ho imparato dal libro Kip Irvine's. Se si ignorano le (giuste) critiche delle sue (irrilevanti) biblioteche, posso raccomandarlo come una buona introduzione alla lingua stessa - sebbene per lo in realtà roba interessante devi cacciare gli ossessivi sulla rete.

Penso che sia utile capire cosa succede ai livelli inferiori. Mentre studierai l'assemblatore, imparerai a conoscere il pipelining della cpu, la predizione delle branche, l'allineamento della cache, la SIMD, il riordino delle istruzioni e così via. La conoscenza di questi ti aiuterà a scrivere un codice di alto livello migliore.

Inoltre, la saggezza convenzionale consiste nel non tentare di ottimizzare l'assemblaggio manuale per la maggior parte del tempo, ma lasciare che il compilatore si preoccupi di ciò. Quando vedi alcuni esempi delle cose contorte che i compilatori generano, capirai meglio perché la saggezza convenzionale regge.

Esempio: gli LFSR corrono veloci con l'istruzione di rotazione con trasporto, per casi specifici come questo è altrettanto semplice scrivere la versione assembler così come scoprire se il compilatore è abbastanza intelligente da capirlo. A volte you just know something che il compilatore non ha.

aumenta anche la comprensione dei problemi di sicurezza - scrivere-o-esecuzione, il superamento dello stack, ecc

Alcuni concurrency problemi diventano evidenti solo quando si è consapevoli di ciò che sta accadendo a livello per-istruzioni.

Può essere utile a volte durante il debug se non si dispone del codice sorgente completo.

C'è il valore della curiosità. In che modo vengono comunque implementate le funzioni virtuali? Hai mai provato a scrivere programmi DirectX o COM in assembler? Come vengono restituite le strutture di grandi dimensioni, la funzione di chiamata offre uno spazio per loro o viceversa?

Poi ci sono linguaggi di assemblaggio speciali per l'hardware grafico, anche se i linguaggi shader sono diventati di alto livello qualche anno fa, qualsiasi cosa che permetta di pensare a un problema in un modo diverso è buona.

+3

Risposta ben scritta +1. L'apprendimento e l'uso sono due cose diverse, imparare è una buona idea, quando/se usarlo viene fornito con l'esperienza. –

20

Sì - la ragione principale per imparare l'assembly per gli sviluppatori C e C++ è che aiuta a capire cosa sta succedendo sotto il cofano del codice C e C++. Non è che in realtà si scriverà codice in assembly, ma sarà possibile esaminare lo smontaggio del codice to assess its efficiency e capirai in che modo le diverse funzioni C e C++ funzionano molto meglio.

2

Avete qualche per utilizzare in ciò che intendete fare? ti aiuterà in qualche modo in quello che fai o pianifichi di fare attualmente? queste sono le due domande che dovresti porci, la risposta a queste è la risposta alla tua domanda.

In un senso più generale, sì, direi che secondo me vale la pena imparare asm (qualcosa come x86 o arm), quanto bene ti serve dipende da cosa si programma e da come lo si debugge.

3

Sapere ASM è anche utile durante il debug, come a volte tutto quello che hai è "discarica ASM dell'errore".

14

Vale la pena di imparare molte lingue diverse, da molti paradigmi diversi. L'apprendimento di Java, C++, C# e Python non conta, poiché sono tutte le istanze dello stesso paradigma.

Come assemblaggio è alla radice (beh, vicino alla radice) di tutte le lingue, io per primo dire che vale la pena di imparare il montaggio.

Poi di nuovo, vale la pena di imparare un linguaggio di programmazione funzionale, programmazione logica, linguaggi di scripting, lingue matematica-based. Hai solo così tanto tempo, quindi devi scegliere.

33

Trovo interessante il fatto che così tante persone saltare a dire che sì, è necessario/dovrebbe imparare il montaggio. Per me la domanda è quanto assembly hai bisogno di sapere? Non penso che tu debba conoscere l'assembly come un linguaggio di programmazione, cioè non credo che tutti dovrebbero essere in grado di scrivere un programma in assembly, ma d'altra parte, essere in grado di leggerlo e capire cosa in realtà significa (che potrebbe richiedere una maggiore conoscenza dell'architettura rispetto all'assemblatore) è sufficiente.

io di sicuro non può scrittura montaggio (cioè scrivere qualsiasi pezzo non banale di codice assembly), ma può leggere e che unitamente alla conoscenza dell'architettura hardware reale, e le convenzioni di chiamata che vengono utilizzati sia abbastanza per analizzare le prestazioni e identificare quale pezzo di codice C++ era la fonte di quell'assemblaggio.

+2

Vuoi dire che dovrei semplicemente imparare i comandi di base ** push, pop, mov e invoke **? – ApprenticeHacker

+6

Sono d'accordo, la necessità di conoscere l'assembly dipende molto da quale ramo di programmazione si sta lavorando. Web/desktop/database? Dimentica l'assemblatore. Giochi e grafica per computer? Potrebbe essere un po 'a portata di mano. Sviluppo di sistemi operativi o sistemi embedded in tempo reale? È un dovere. E così via. – Lundin

+1

Stai travisando le altre risposte - nessuno ti sta dicendo ** bisogno/dovrebbe ** imparare l'assemblea; solo che è utile o utile, come da domanda. La tua risposta è comunque pertinente. –

2

dipenda del quale livello di programmazione che si desidera raggiungere. Se è necessario lavorare con i debugger, allora SI. Se hai bisogno di sapere come funzionano i compilatori allora SÌ. Qualsiasi assemblatore/debugger dipende dalla CPU, quindi c'è molto lavoro, basta controllare la famiglia x86 quanto è grande e vecchio.

+0

Si potrebbe voler dire che la famiglia della CPU è dipendente? – Romeno