Qual a diferença entre código de máquina e linguagem assembly?

Para responder sua pergunta, vou discutir linguagem de máquina, linguagem assembly, e linguagens de alto nível (como C).

Linguagem Machine

No nível mais baixo de programação, temos instruções de máquina (ou código de máquina, ou linguagem de máquina), que consiste em sequências de bits (dígitos binários). Esta é a única linguagem que o hardware da CPU pode compreender. Nos primeiros tempos da computação, ou na ausência de software de desenvolvimento, um programador tinha de procurar manualmente os padrões de bits correctos para várias instruções da CPU, e introduzir os padrões directamente no computador.

Excepto para os programas mais triviais, esta actividade pode ser extremamente demorada, entediante e susceptível a erros. Mas ela consegue fazer o trabalho. Aqui está um vídeo demonstrando a entrada manual de bits de instruções de máquina usando chaves de painel frontal em um computador Altair 8800 (clone).

Em alguns sistemas sem software de desenvolvimento, um programador poderia entrar com instruções de máquina digitando valores octal (base 8) ou hexadecimal (base 16), mas estes são apenas abreviações para padrões de bits. Um dígito octal representa três bits, e um dígito hexadecimal representa quatro bits. Assim, um programador ainda tinha de procurar (ou memorizar) os valores correctos para cada instrução de máquina.

Assembly Language

O próximo nível acima do código da máquina é a linguagem assembly. A disponibilidade da linguagem assembly permite a um programador digitar um programa como texto legível por humanos, usando nomes mnemônicos e símbolos, ao invés de sequências brutas de bits. É muito menos enfadonho e sujeito a erros do que programar diretamente em código de máquina binário. Aqui está um pequeno código em linguagem assembly, representando uma sequência de oito instruções em linguagem de máquina:

  1. CHKMODE shl ecx,0  
  2. mov edx,dword ptr [argv]  
  3. mov eax,dword ptr [edx+ecx]  
  4. push eax  
  5. call _strcmp  
  6. add esp,8  
  7. test eax,eax  
  8. jne main+FALSE103 

Typically, each line of assembly language code represents one CPU instruction. Um programa de computador conhecido como assembler (que alguém teve que escrever) traduz as instruções de linguagem assembly mnemônica em suas equivalentes de instrução de máquina binária. Este processo de tradução é frequentemente referido como assembler. O uso da linguagem assembly liberta o programador de ter de procurar (ou memorizar) as sequências de bits para as instruções de máquina, e do tédio de as introduzir um bit de cada vez.

Even assim, o desenvolvimento de software em linguagem assembly requer uma atenção significativa aos detalhes, porque ainda estamos a lidar com a especificação de instruções individuais da CPU. Macro assemblers foram introduzidos para facilitar um pouco a vida, permitindo ao programador atribuir um nome simbólico a uma sequência comum de instruções, para que uma macro de uma linha possa realmente traduzir para uma sequência de várias instruções de máquina. O uso de macros aumentou ainda mais a produtividade, mas ainda temos que lidar com muitos detalhes de baixo nível.

Um grande problema com programação em qualquer linguagem de máquina ou linguagem assembly é que o programa que você escreve só vai funcionar naquele tipo/família de hardware de CPU (ou seja, uma arquitetura de CPU específica). Se você quiser que o programa seja executado em alguma outra arquitetura de CPU, você deve reescrever seu programa do zero para aquela nova CPU, porque diferentes arquiteturas de CPU têm conjuntos completamente diferentes de instruções de máquina (com diferentes padrões de bits, diferentes mnemônicos da linguagem assembly, diferentes maneiras de acessar a memória, etc.). Assim, programas escritos no nível da linguagem assembly não são portáveis...temos que reescrevê-los para cada nova arquitetura de CPU que queremos suportar. Isso pode levar a um grande esforço extra, portando nosso código para diferentes tipos de hardware.

Linguagem de alto nível

Linguagem de alto nível foram desenvolvidas para facilitar a programação, abstraindo construções de programação, eliminando a necessidade de se preocupar com instruções individuais da máquina. E o código de linguagem de alto nível pode ser potencialmente escrito apenas uma vez, e ser facilmente portado para múltiplas arquiteturas de CPU. Aqui está uma linha de código C de alto nível que é equivalente às oito instruções de linguagem assembly mostradas anteriormente:

  1. if (!strcmp(argv[1], GAMEMODE)) 

Tipicamente, cada linha de código de linguagem de alto nível pode representar múltiplas instruções de CPU. Um programa de computador conhecido como compilador (que alguém teve que escrever) traduz o código de linguagem de alto nível em sequências equivalentes de instruções de máquina binárias. (Às vezes um compilador traduz o código de linguagem de alto nível em código de linguagem assembly, que é então montado em instruções de máquina, mas isso é raro hoje em dia). O processo de tradução do compilador é frequentemente referido como compiling.

O uso de idiomas de alto nível libera o programador de ter que lidar com os detalhes das instruções individuais de linguagem assembly. E se o código é escrito com portabilidade em mente (ou seja, não faz suposições sobre o hardware da CPU e/ou o ambiente em que está rodando), o código de linguagem de alto nível pode ser simplesmente recompilado para uma arquitetura de CPU diferente, sem a necessidade de reescrever o programa. Para conseguir isso, você só precisa de um compilador que suporte cada arquitetura da CPU onde você quer que seu programa seja executado.

Embora C seja às vezes referido como uma linguagem de baixo ou médio nível, na verdade é uma linguagem de alto nível.

Qual a diferença entre Assembly e linguagem de máquina?

Diferença entre linguagem Assembly e linguagem de máquina. A linguagem assembly só é compreensível para seres humanos, não para computadores. A linguagem de máquina só é compreensível para computadores. Em linguagem assembly, os dados podem ser representados com a ajuda de mnemônicos como Mov, Add, Sub, End, etc.

O que é linguagem máquina ou código máquina?

Linguagem de máquina (machine languale): é a linguagem de mais baixo nível de entendimento pelo ser humano e a única, na verdade, entendida pelo processador (UCP). É constituída inteiramente de números, o que torna praticamente impossível entendê-la diretamente.

O que é código Assembly?

Ambiente de Linguagem A linguagem Assembly, é uma notação legível por humanos para o código de máquina que uma arquitetura de computador específica usa, utilizada para programar códigos entendidos por dispositivos computacionais, como microprocessadores e microcontroladores.

Qual é a diferença entre Assembler e Assembly?

Assembler é o compilador e Assembly é a linguagem! Portanto se diz: ´vou fazer um código em Assembly no Delphi. ´ e não ´em Assembler´ como a grande maioria diz. (1) - Uma linguagem de programação muito parecida com a linguagem de máquina, projetada para ser usada juntamente com um programa tradutor (assemblador).