Vale a pena aprender a linguagem assembly? [fechadas]

92

Ainda vale a pena aprender ASM ?

Sei um pouco disso, mas não usei ou aprendi direito porque tudo que aprendo no assembler posso fazer em 1/10 do tempo com alguma linguagem como C ou C ++. Então, devo realmente aprender e usar o ASM? Isso vai me fazer bem profissionalmente? Isso aumentará minha desenvoltura? Resumindo, isso me tornaria um programador melhor?

Nota: Estou falando sobre montagem de baixo nível como FASM ou NASM e não algo como HLA (High-Level Assembler).

ApprenticeHacker
fonte
2
Observe que a linguagem assembly está ligada a um processador / controlador.
rmflow
7
Quer dizer que não é multiplataforma? !!
ApprenticeHacker
Não. Por exemplo: worldofspectrum.org/Z80instructions.html
rmflow
2
Ok, então há uma linguagem assembly diferente para cada processador ??? !!!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker
3
Uma linguagem assembly diferente para cada família de processadores. O código 386 é executado em qualquer processador x86 posterior, incluindo as ofertas da Intel e da AMD - mas alguns conjuntos de recursos são extensões de propriedade. A linguagem é a mesma para essas instruções extras, mas o binário resultante não será portátil.
spraff de

Respostas:

107

Aprendi com o livro de Kip Irvine . Se você ignorar as críticas (justas) de suas bibliotecas (irrelevantes), posso recomendá-lo como uma boa introdução à linguagem em si - embora para as coisas realmente interessantes você tenha que caçar os obsessivos na rede.

Acho que é útil entender o que acontece nos níveis inferiores. Conforme você pesquisa o assembler, você aprenderá sobre pipelining de CPU, previsão de ramificação, alinhamento de cache, SIMD, reordenação de instruções e assim por diante. O conhecimento deles o ajudará a escrever um código de alto nível melhor.

Além disso, a sabedoria convencional é não tentar otimizar manualmente a montagem na maior parte do tempo, mas deixar o compilador se preocupar com isso. Quando você vir alguns exemplos das coisas distorcidas que os compiladores geram, entenderá melhor por que a sabedoria convencional se mantém.

Exemplo: LFSRs são executados rapidamente com a instrução rotate-with-carry, para casos específicos como este é tão fácil escrever a versão em assembler quanto descobrir se o compilador é ou não inteligente o suficiente para descobrir. Às vezes, você simplesmente sabe algo que o compilador não sabe.

Ele também aumenta sua compreensão dos problemas de segurança - gravar ou executar, saturações de pilha, etc.

Alguns problemas de simultaneidade só se tornam aparentes quando você está ciente do que está acontecendo no nível por instrução.

Pode ser útil às vezes durante a depuração, se você não tiver o código-fonte completo.

Existe o valor da curiosidade. Como as funções virtuais são implementadas? Você já tentou escrever programas DirectX ou COM em assembler? Como grandes estruturas são retornadas, a função de chamada oferece um espaço para elas ou vice-versa?

Depois, há linguagens assembly especiais para hardware gráfico, embora as linguagens de shader fossem de alto nível alguns anos atrás, qualquer coisa que permita pensar sobre um problema de uma maneira diferente é bom.

Spraff
fonte
7
Resposta bem escrita +1. Aprender e usar são duas coisas diferentes, aprender é uma boa ideia, quando / se usar vem com a experiência.
old_timer
Para dar um exemplo, Linus Torvalds usa um desmontador para depurar seu código, então acho que ele tem um bom conhecimento de montagem x86.
Ivanzinho
52

Acho interessante que tantas pessoas saltem para dizer que sim, você precisa / deve aprender montagem. Para mim, a questão é quanta montagem você precisa saber? Não acho que você precise conhecer assembly como uma linguagem de programação, ou seja, não acredito que todo mundo deva ser capaz de escrever um programa em assembly, mas por outro lado, ser capaz de lê-lo e entender o que ele realmente meios (que podem exigir mais conhecimento da arquitetura do que o montador) é suficiente.

Eu com certeza não posso escrever assembly (ou seja, escrever qualquer código não trivial em assembly), mas posso lê-lo e isso junto com o conhecimento da arquitetura de hardware real e as convenções de chamada que estão sendo usadas são o suficiente para analisar o desempenho, e identificar qual parte do código C ++ foi a fonte desse assembly.

David Rodríguez - dribeas
fonte
4
Você quer dizer que eu deveria apenas aprender os comandos básicos de push, pop, mov e invoke ?
ApprenticeHacker
10
Eu concordo, a necessidade de saber assembly depende muito de qual branch de programação você está trabalhando. Web / desktop / banco de dados? Esqueça o montador. Jogos e gráficos de computador? Pode ser útil. Desenvolvimento de SO ou sistemas embarcados em tempo real? É uma obrigação. E assim por diante.
Lundin
1
Você está deturpando as outras respostas - ninguém está dizendo que você precisa / deve aprender montagem; apenas que é útil ou vale a pena, conforme a pergunta. Sua resposta ainda é relevante.
Luc Danton
1
@burningprodigy: Acredito que você deve ter algum conhecimento básico de como as instruções estão no montador que você usa (ou seja, qual é a ordem dos argumentos e similares), e algum conhecimento básico de alguns comandos, que carga ou uma loja é. Então, se você precisar examinar alguma peça de montagem, poderá usar uma referência para entender cada uma das instruções e, ao fazer isso, começará a aprender o básico de que precisa.
David Rodríguez - dribeas
1
Concordo. Especialmente, apenas o conhecimento da montagem lhe trará pouco para avaliar a eficiência em CPUs modernas. Se esse é o objetivo, um pouco de conhecimento básico de montagem com uma boa parte dos conceitos básicos de arquiteturas de computador é muito mais útil. Na maioria das vezes, preciso que a montagem esteja procurando por despejos de programas otimizados ou por diversão (isto é, coisas de segurança, escrever um mini kernel, ..). Mas não consigo me lembrar da última vez que mudei alguma decisão de projeto por causa do conhecimento de montagem.
Voo
27

Sim - o principal motivo para aprender montagem para desenvolvedores C e C ++ é que ajuda a entender o que está acontecendo nos bastidores do código C e C ++. Não é que você realmente vá escrever código em assembly, mas será capaz de examinar a desmontagem do código para avaliar sua eficiência e compreender como os diferentes recursos C e C ++ funcionam muito melhor.

dente afiado
fonte
23

Vale a pena aprender muitas linguagens diferentes, de muitos paradigmas diferentes. Aprender Java, C ++, C # e Python não conta, já que todos são instâncias do mesmo paradigma.

Como a montagem está na raiz (bem, perto da raiz) de todas as linguagens, eu digo que vale a pena aprender montagem.

Então, novamente, vale a pena aprender uma linguagem de programação funcional, programação lógica, linguagens de script, linguagens baseadas em matemática. Você tem apenas um limite de tempo, então você tem que escolher e escolher.

David Hammen
fonte
E então, quando você finalmente ter aprendido todos eles e acho que você tem um vislumbre do que está acontecendo, você descobre J .
Micha Wiedenmann
4

Conhecer o ASM também é útil ao depurar, pois às vezes tudo o que você tem é "despejo do erro do ASM".

ain
fonte
2

Você tem alguma utilidade para isso no que planeja fazer? vai ajudá-lo de alguma forma no que você faz ou planeja fazer atualmente? essas são as duas perguntas que você deve se perguntar, a resposta a elas é a resposta à sua pergunta.

Em um sentido mais geral, sim, eu diria que na minha opinião vale a pena aprender asm (algo como x86 ou arm), o quão bem ele atende a você depende do que você está programando e como você está depurando.

Necrolis
fonte
2

Depende de qual nível de programação você deseja alcançar. Se você precisa trabalhar com depuradores, então SIM. Se você precisa saber como funcionam os compiladores, então SIM. Qualquer montador / depurador é dependente da CPU, então há muito trabalho, basta verificar se a família x86 é grande e antiga.

GJ.
fonte
Pode ser que você quis dizer dependente da família da CPU?
Romeno