Vale la pena imparare il linguaggio assembly? [chiuso]


92

Vale ancora la pena imparare l' ASM ?

Ne conosco un po ', ma non l'ho davvero usato o imparato bene perché tutto quello che imparo a fare in assembler lo posso fare in 1/10 del tempo con alcuni linguaggi come C o C ++. Quindi, dovrei davvero imparare e usare ASM? Mi farà 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 come HLA (High-Level Assembler).


2
Si noti che il linguaggio assembly è legato a un processore / controller.
rmflow

7
Vuoi dire che non è multipiattaforma? !!
ApprenticeHacker


2
Ok, quindi c'è un linguaggio assembly diverso per ogni processore ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker

3
Un linguaggio assembly diverso per ogni famiglia di processori. Il codice 386 viene eseguito su qualsiasi processore x86 successivo, comprese le offerte Intel e AMD, ma alcuni set di funzionalità sono estensioni proprietarie. La lingua è la stessa per queste istruzioni extra ma il binario risultante non sarà portabile.
spraff

Risposte:


107

Ho imparato dal libro di Kip Irvine . Se ignori le (giuste) critiche alle sue (irrilevanti) biblioteche, posso consigliarlo come una buona introduzione al linguaggio stesso, anche se per le cose davvero interessanti devi cacciare gli ossessivi in ​​rete.

Penso sia utile capire cosa succede ai livelli inferiori. Durante la ricerca in assembler imparerai a conoscere il pipelining della cpu, la previsione dei rami, l'allineamento della cache, il SIMD, il riordino delle istruzioni e così via. La conoscenza di questi ti aiuterà a scrivere un codice migliore di alto livello.

Inoltre, la saggezza convenzionale è quella di non cercare di ottimizzare manualmente l'assembly la maggior parte del tempo, ma lasciare che il compilatore se ne preoccupi. Quando vedi alcuni esempi delle cose distorte generate dai compilatori, capirai meglio perché vale la saggezza convenzionale.

Esempio: gli LFSR girano velocemente con l'istruzione rotate-with-carry, per casi specifici come questo è altrettanto facile scrivere la versione dell'assembler quanto scoprire se il compilatore è abbastanza intelligente da capirlo. A volte sai qualcosa che il compilatore non sa.

Aumenta anche la comprensione dei problemi di sicurezza: scrittura o esecuzione, overrun dello stack, ecc.

Alcuni problemi di concorrenza diventano evidenti solo quando si è consapevoli di ciò che sta accadendo a livello di istruzione.

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

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

Poi ci sono linguaggi assembly speciali per l'hardware grafico, sebbene i linguaggi shader siano diventati di alto livello alcuni anni fa, tutto ciò che ti permette di pensare a un problema in un modo diverso va bene.


7
Risposta ben scritta +1. Imparare e usare sono due cose diverse, imparare è una buona idea, quando / se usarlo viene con l'esperienza.
old_timer

Per fare un esempio, Linus Torvalds usa un disassemblatore per eseguire il debug del suo codice, quindi penso che abbia una buona conoscenza dell'assembly x86.
Ivanzinho

52

Trovo interessante che così tante persone saltino a dire che sì, hai bisogno / dovresti imparare l'assemblaggio. Per me la domanda è: quanto assemblaggio hai bisogno di sapere? Non credo 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 poterlo leggere e capire di cosa si tratta effettivamente mezzi (che potrebbero richiedere una maggiore conoscenza dell'architettura rispetto all'assemblatore) sono sufficienti.

Di sicuro non posso scrivere assembly (cioè scrivere qualsiasi pezzo di codice non banale in assembly), ma posso leggerlo e questo insieme alla conoscenza dell'effettiva architettura hardware e alle convenzioni di chiamata che vengono utilizzate è sufficiente per analizzare le prestazioni, e identificare quale pezzo di codice C ++ era l'origine di quell'assembly.


4
Vuoi dire che dovrei solo imparare i comandi di base push, pop, mov e invoke ?
ApprenticeHacker

10
Sono d'accordo, la necessità di conoscere l'assembly dipende molto dal ramo di programmazione con cui stai lavorando. Web / desktop / database? Dimentica l'assemblatore. Giochi per computer e grafica? Potrebbe essere in qualche modo utile. Sviluppo di sistemi operativi o sistemi embedded in tempo reale? È un dovere. E così via.
Lundin

1
Stai travisando le altre risposte - nessuno sta dicendo che hai bisogno / dovresti imparare l'assemblea; solo che è utile o utile, secondo la domanda. La tua risposta è comunque pertinente.
Luc Danton

1
@burningprodigy: La mia opinione è che dovresti avere una conoscenza di base di come sono le istruzioni nell'assemblatore che usi (cioè qual è l'ordine degli argomenti e simili), e una comprensione di base di alcuni comandi, che carico o è un negozio. Quindi, se hai bisogno di guardare un pezzo di assemblaggio, puoi usare un riferimento per comprendere ciascuna delle istruzioni, e così facendo inizierai ad apprendere le basi di cui hai bisogno.
David Rodríguez - dribeas

1
Sono d'accordo. Soprattutto solo conoscere l'assemblaggio ti farà guadagnare ben poco sulla valutazione dell'efficienza sulle moderne CPU. Se questo è l'obiettivo, una piccola conoscenza di base dell'assemblaggio con una buona dose delle basi delle architetture dei computer è molto più utile. La maggior parte delle volte che ho bisogno dell'assembly è guardare attraverso i dump di programmi ottimizzati, o per divertimento (ad es. Cose di sicurezza, scrivere un mini kernel, ..). Ma non ricordo l'ultima volta che ho cambiato una decisione di progettazione a causa della conoscenza dell'assemblaggio.
Voo

27

Sì, il motivo 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 scriverai effettivamente codice in assembly, ma sarai in grado di esaminare il disassemblaggio del codice per valutarne l'efficienza e capirai come le diverse funzionalità C e C ++ funzionano molto meglio.


23

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

Poiché l'assembly è alla radice (beh, vicino alla radice) di tutte le lingue, io per primo dico che vale la pena imparare l'assembly.

Inoltre, vale la pena imparare un linguaggio di programmazione funzionale, programmazione logica, linguaggi di scripting, linguaggi basati sulla matematica. Hai solo così tanto tempo, quindi devi scegliere e scegliere.


E poi, quando finalmente li hai imparato e pensi di avere un assaggio di ciò che sta accadendo, si scopre J .
Micha Wiedenmann

4

Conoscere ASM è utile anche durante il debug, poiché a volte tutto ciò che hai è "Dump ASM dell'errore".


2

Hai qualche utilità in ciò che intendi fare? ti aiuterà in qualche modo in ciò che fai o intendi 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 stai programmando e da come lo fai debug.


2

Dipende dal livello di programmazione che desideri raggiungere. Se hai bisogno di lavorare con i debugger, allora YES. Se hai bisogno di sapere come funzionano i compilatori, allora YES. Qualsiasi assemblatore / debugger dipende dalla CPU, quindi c'è molto lavoro, basta controllare la famiglia x86 quanto è grande e vecchia.


Forse intendi dipendente dalla famiglia di CPU?
Romeno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.