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 x
esteja no registro 1, y
esteja no registro 2 e z
deve 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.)