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?
programming-languages
education
history
Nithin Jose
fonte
fonte
Respostas:
"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?"
fonte
Bem, na verdade, existe apenas um idioma que precisaremos , chamado "linguagem de máquina" ou "código de máquina". Se parece com isso:
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:
Esses valores correspondem a:
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):
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:
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:
Isso soa como nossa adição de cima, supondo que
x
esteja no registro 1,y
esteja no registro 2 ez
deve terminar no registro 3. Mas e essa linha?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:
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.)
fonte
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.
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.
fonte
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.
fonte
Há respostas aqui:
Quando precisamos da linguagem assembly? em Programmers.SE
Por que a linguagem assembly ainda é necessária se temos linguagens de alto nível que oferecem ferramentas sofisticadas? no Stackoverflow
Por que estudar a linguagem Assembly? de Gary L. Burt
Todas essas respostas apontam para:
fonte
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:
multiscalar
significaSe 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.
fonte
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?
fonte