Por que precisamos de linguagem assembly?

27

Nós escrevemos principalmente programas em linguagem de alto nível. Então, enquanto estudava, me deparei com a linguagem assembly. Portanto, um assembler converte a linguagem assembly em linguagem de máquina e um compilador faz o mesmo com a linguagem de alto nível. Achei que a linguagem assembly tem instruções como mover r1 r3, mover um 5 etc. E é bastante difícil de estudar. Então, por que a linguagem assembly foi criada? Ou foi a que surgiu primeiro antes da linguagem de alto nível? Por que estou estudando montadores na minha aula de engenharia da computação?

Nithin Jose
fonte
13
Assembler é um código de máquina legível por humanos, é por isso.
Andrej Bauer
4
Porque é importante saber como as coisas funcionam quando estamos perto do hardware. Quando escrevemos montagem, entendemos como o hardware do computador funciona e funciona em um nível baixo. A melhor maneira para isso é a linguagem assembly, já que a linguagem de máquina é tediosa e não é legível como a montagem. Você realmente prefere usar uma caixa mágica e nunca olhar para dentro?
Spencer Wieczorek

Respostas:

32

"Então, por que a linguagem assembly foi criada?"

A linguagem Assembly foi criada como uma abreviação exata para a codificação no nível da máquina, para que você não precise contar 0s e 1s o dia todo. Funciona da mesma forma que o código no nível da máquina: com instruções e operandos.

"Qual deles veio primeiro?"

A Wikipedia tem um bom artigo sobre a história das linguagens de programação

"Por que estou estudando montadoras na minha aula de engenharia da computação?"

Embora seja verdade, você provavelmente não se encontrará escrevendo o aplicativo do seu próximo cliente na montagem, ainda há muito a ganhar com o aprendizado de montagem.

Hoje, a linguagem assembly é usada principalmente para manipulação direta de hardware, acesso a instruções especializadas do processador ou para resolver problemas críticos de desempenho. Os usos típicos são drivers de dispositivo, sistemas embarcados de baixo nível e sistemas em tempo real.

A linguagem Assembly está tão próxima do processador quanto você pode obter como programador, então um algoritmo bem projetado está em chamas - o assembly é ótimo para otimização de velocidade. É tudo sobre desempenho e eficiência. A linguagem Assembly fornece controle total sobre os recursos do sistema. Assim como uma linha de montagem, você escreve código para inserir valores únicos em registros, lida com endereços de memória diretamente para recuperar valores ou ponteiros. (fonte: codeproject.com )

TylerAndAmigos
fonte
29

Por que precisamos de linguagem assembly?

Bem, na verdade, existe apenas um idioma que precisaremos , chamado "linguagem de máquina" ou "código de máquina". Se parece com isso:

0010000100100011

Esse é o único idioma em que seu computador pode falar diretamente. É o idioma que uma CPU fala (e tecnicamente, diferentes tipos de CPUs falam versões diferentes). Também é péssimo olhar e tentar entender.

Felizmente, cada seção do binário corresponde a um significado particular. É dividido em várias seções:

0010|0001|0010|0011

operation type  source register  other source  destination register
0010            0001             0010          0011

Esses valores correspondem a:

operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3

Portanto, essa operação adicionaria os números nos registradores 1 e 2 e colocaria esse valor no registrador 3. Se você literalmente colocar esses valores em uma CPU e dizer "ir", ele adicionará dois números para você. A operação "subtrair" pode ser um 0011 ou algo assim, em vez de 0010 aqui. Qualquer que seja o valor, a CPU fará uma subtração.

Portanto, um programa pode se parecer com isso (não tente entendê-lo, pois criei essa versão específica do código da máquina para explicar as coisas):

instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000

Isso é ruim de ler? Definitivamente. Mas precisamos disso para a CPU . Bem, se todo código de máquina corresponder a uma ação específica, vamos criar uma abreviação simples em "inglês" e, depois que entendermos o que o programa está fazendo, converta-o em código de máquina binário real e entregue-o à CPU para executar.

Portanto, nossa instrução original de cima pode se parecer com:

(meaning)      operation type  source register  other source  destination register
(machine code) 0010            0001             0010          0011
("English")    add             r1               r2            r3

Observe que esta versão em inglês tem um mapeamento exato para o código da máquina . Então, quando escrevemos uma linha desse "inglês", estamos realmente escrevendo código de máquina mais amigável e compreensível.

Bem, isso é linguagem assembly. É por isso que existe e por que foi originalmente criado.

Para entender por que precisamos agora, leia as respostas acima, mas a chave para entender isso é: Linguagens de alto nível não têm uma única representação é o código da máquina. Por exemplo, em C, ou Python, ou qualquer outra coisa:

z = x + y

Isso soa como nossa adição de cima, supondo que xesteja no registro 1, yesteja no registro 2 e zdeve terminar no registro 3. Mas e essa linha?

z = x * 2 + (y / 6) * p + q - r

Tente representar essa linha em 16 bits de binário e diga à CPU "go". Você não pode. O código da máquina não possui uma única instrução de operação para executar uma adição, subtração e qualquer outra coisa com 4 ou 5 variáveis ​​ao mesmo tempo. Portanto, ele deve ser convertido em uma sequência de código de máquina primeiro. É isso que você faz quando "compila" ou "interpreta" uma linguagem de alto nível.

Bem, temos programas para fazer isso, então por que precisamos de montagem agora? Bem, diga que seu programa está sendo executado mais lentamente do que o esperado e você quer saber o porquê. Observando a linguagem de máquina "output" desta linha, pode parecer com:

1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010

Apenas para concluir essa linha de Python. Então você realmente quer depurar isso?!?!?! NÃO . Em vez disso, você solicita ao seu compilador a gentileza de fornecer a saída da forma que você pode entender facilmente, que é a versão da linguagem assembly correspondente exatamente ao código da máquina. Então você pode descobrir se o seu compilador está fazendo algo estúpido e tentar corrigi-lo.

(Nota adicional ao conselho de @ Raphael: você pode realmente construir CPUs que funcionam com outras coisas além de códigos binários, como códigos ternários (base 3) ou decimais, ou mesmo ASCII. Para fins práticos, no entanto, realmente nos apegamos ao binário.)

Chris Cooper
fonte
2
Em princípio, nada nos impede de construir CPUs que trabalhem diretamente com a linguagem assembly. ASCII é apenas uma codificação ineficiente para esse fim, só isso.
Raphael
Obrigado pela adição. Eu concordo, mas ignorei isso para entender o propósito da assembléia. Vou adicionar uma nota.
Chris Cooper
15

Então, por que a linguagem assembly foi criada? ou foi o primeiro que surgiu antes mesmo da linguagem de alto nível?

Sim, o assembly foi uma das primeiras linguagens de programação que usavam texto como entrada, em vez de fios de solda, usando placas de tomada e / ou comutadores. Cada linguagem assembly foi criada para apenas um processador ou família de processadores, conforme as instruções mapeadas diretamente para os códigos de operação executados pelo processador.

Por que estou estudando montadores na minha aula de engenharia da computação?

Se você precisar programar drivers de dispositivo ou escrever compiladores, entender como um processador funciona é inestimável, se não for necessário. A melhor maneira de entender isso é escrever algum código em assembly.

Se você der uma olhada em como um compilador escreve código, é comum ver opções para chamar convenções que, sem conhecer o assembly, provavelmente não podem ser entendidas.

Se você precisa resolver um bug e a única entrada que possui é um dump principal , você definitivamente precisa conhecer o assembly para entender a saída que é o código do assembly e, se tiver sorte, aumentada com instruções de nível superior de uma linguagem de alto nível.

Guy Coder
fonte
14

Deixe-me acrescentar um aspecto menos prático. Esta (provavelmente) não é uma razão histórica, mas uma razão para você hoje.

Assembly (comparado a idiomas de alto nível) está nu . Ele não oculta nada (feito em software) e é simples no sentido de que possui um conjunto fixo de operações relativamente pequeno.

Isso pode ser útil para a análise exata de algoritmos. A semântica e o fluxo de controle são tão simples que a contagem de todas as operações (ou o número esperado) pode ser feita anotando o gráfico do fluxo de controle com contagens de transição (probabilidades). Knuth faz isso em seus livros do TAoCP com grande efeito, demonstrando algumas das mais rigorosas análises de algoritmos que existem.

Anedota: meu colega aprendeu a ler Java Bytecode exatamente para esse fim.

Rafael
fonte
4

Há respostas aqui:

Todas essas respostas apontam para:

  • Otimização de velocidade / memória
  • Entendendo como a máquina funciona
  • Os programadores do Noob se tornam especialistas
  • Se você conhece assembly, sabe como escrever compiladores para sua linguagem High Nvl
  • etc
compski
fonte
11
Você compartilha todas essas opiniões? Qual a sua experiência? (Em particular, o item "Então os programadores de Noob se tornam especialistas" parece desatualizado por várias décadas para mim.)
Raphael
woah woah você não precisa ficar tão preocupado com esse assunto. Estou apenas vinculando respostas à sua pergunta duplicada. E o "Então os programadores de Noob se tornam especialistas" foi o mais votado aqui . Vá argumentar com ele, não eu =)
compski 17/07
11
Não sou sensível, estou tentando ajudá-lo a tornar sua resposta boa (atualmente, não é, pois você vincula apenas alguns recursos, nenhum dos quais responde totalmente à pergunta). Incluir seus próprios pensamentos de maneira comparativa é o primeiro passo para esse fim. (Note-se que, relacionando opinião de forma excludente, você atribuir um valor para eles; em outras palavras, você tem que ser capaz de argumentar por que você valoriza o suficiente opinião para (re) post é como uma resposta.)
Raphael
Bem, minha experiência é que realmente odeio e luto com o aprendizado de linguagens assembly depois de me acostumar com algumas linguagens de programação de alto nível. E eu sei que aqueles que são bons programadores ou conhecem C ++ / C de antemão podem programar muito bem no ASM. Eu não acho que minha opinião foi valorizado o suficiente para ser postado na minha resposta para isso é porque ...
compski
Seu primeiro link está quebrado.
Hola Soy Edu Feliz Navidad
1

Assembly = código da máquina
Algumas pessoas continuam falando sobre como a linguagem assembly é diferente dos códigos numéricos que a CPU entende.
Isso (embora verdadeiro) erra completamente o ponto.
No que diz respeito à tradução, a linguagem assembly e o numérico (binário, qualquer que seja o hex) são a mesma coisa.

Grok ou drop it
Se você grok assembly, você sabe como um computador real funciona.
montagem de grokking envolve:

Se você monta uma montagem, você tem uma imagem quase completa de como a CPU conectada ao seu teclado funciona.
Você precisa usar esse conhecimento como um cirurgião cerebral usa o bisturi.

Não precisa de abstrações fedorentas.
A menos que você monte a montagem (e, portanto, a CPU na mesa operacional), você nunca estará livre das garras das abstrações da máquina de RAM (ou Deus não permita que a máquina de Turing o horror ).

A montagem L33t Hax0r 5k1llz
também ajuda a entender como o 133thax0r consegue derrotar os esquemas de proteção. (P: por que o ASLR não funciona ? Porque o mov rax,fs:[28h]quebra ).

O 0,1%
Não é o conhecimento da montagem que importa, mas o conhecimento da máquina em que você trabalha nessa questão.
Se você quer conhecer a máquina, deve entendê-la e isso significa falar o idioma da máquina.

Caso contrário, você ficará preso à abstração.
Isso é ciência e é bom, mas nunca é o quadro completo.

É como aprender a falar Xhosa
A menos que você aponte para o nível de guru, melhor ficar com o que sabe, esses cliques complicarão sua vida .

Porque é divertido.

Johan - restabelecer Monica
fonte
11
A maioria uso frequente da palavra grok em um artigo que eu já encontrei
rekciltnuc
-1

Até hoje, aprendi o RPG II usando um IBM System 32 e depois aprendi o APL em um 370. Eu tinha tudo a ver com tamanho e velocidade. Meu mantra era menor e mais rápido. Assembly é o idioma mais compacto e rápido do mercado. Eu faria programas de teste em C e Assembly. Onde os programas C exigiriam 100 Kb, um programa equivalente da Assembléia geralmente seria menor que 5 Kb. Ao estudar a saída do compilador C, eu encontrava um código que verifica e verifica novamente os parâmetros, que faz checagens condicionais para possíveis erros que costumam ser raros, exóticos e desnecessários, tudo isso levou tempo, mas o maior inchaço da memória estava passando absolutamente tudo para e da pilha.

No ambiente de programação atual, escrever código fornece um nível extra de segurança e proteção. A capacidade de ler informações diretamente de um hardware que não é acessível a idiomas de alto nível permite criptografar com o Assembly de maneira que um programa possa ser usado apenas nessa máquina específica. Por exemplo, criptografar uma chave de usuário usando o endereço MAC da interface de rede e, em seguida, estacionar essa chave em um setor não registrado específico do disco rígido, marcando o setor como ruim para que outros arquivos não possam substituí-lo. Claro que você perde o setor, mas o que é isso? 2048 ou 4096 bytes em bilhões ou trilhões?

Brian3163
fonte
11
O que significa "não acessível a idiomas de alto nível"?
David Richerby