Leon Fim
Leon Fim
Leon Fim
A princípio agradecemos a Deus todo poderoso pelo fólego de Vida e pelo privilégio de estarmos
aqui. Também agradecer ao senhor professor por nos dár a oportunidade de explorar o nosso
conhecimento em pesquisas.
1
Introdução
Linguagem de máquina é uma linguagem de programação de baixo nível que consiste em códigos
binários, ou seja, sequências de zeros e uns, que um computador pode entender e executar
diretamente. Em 1936, o matemático britânico Alan Turing concebeu a ideia de uma máquina
universal que poderia realizar qualquer cálculo que um ser humano pudesse fazer, desde que fosse
descrito de maneira algorítmica. Esse conceito teórico de máquina de Turing serviu como base para
o desenvolvimento de computadores eletrônicos programáveis.
2
Desenvolvimento
Quando pensamos em computadores, muitas vezes imaginamos interfaces gráficas, teclados e
mouses. No entanto, por trás dessa aparência amigável, existe uma linguagem fundamental que
permite que os computadores executem tarefas complexas: a linguagem de máquina.
O que é Linguagem de Máquina?
A linguagem de máquina é a língua nativa dos computadores. É a forma como eles se comunicam
internamente, como um segredo compartilhado entre o hardware e o software. Vamos desvendar
esse código binário e entender como ele funciona.
Bits e Bytes
Antes de mergulharmos na linguagem de máquina, precisamos entender alguns conceitos básicos.
Computadores operam com bits e bytes. Um bit é a menor unidade de informação, representando
um 0 ou 1. Oito bits formam um byte, que pode representar números, letras, símbolos e instruções.
O Código Binário
A linguagem de máquina é escrita em código binário, uma sequência de 0s e 1s. Cada combinação
de bits representa uma instrução específica para o processador. Por exemplo:
01001000 01100101 01101100 01101100 01101111: Isso se traduz em “Hello” em linguagem de
máquina. Sim, os computadores dizem “Hello” também, mas em binário!
Instruções e Opcodes
As instruções do processador, chamadas de opcodes, são representadas por valores em hexadecimal.
Esses opcodes indicam ações como adicionar, subtrair, armazenar dados na memória e muito mais.
Cada opcode é como uma palavra-chave que o processador entende.
Exemplos do mundo real
Vamos trazer a linguagem de máquina para o nosso dia a dia:
1. Ligar e Desligar: Imagine um interruptor de luz. Ele tem apenas duas posições: ligado (1) e
desligado (0). Essa simplicidade é a base da linguagem de máquina.
2. Calculadora: Quando você digita “2 + 2” em uma calculadora, ela traduz essa expressão em
instruções binárias para realizar a adição.
3. Máquina de Lavar: A máquina de lavar segue instruções binárias para encher de água, agitar as
roupas e drenar. Tudo isso é linguagem de máquina em ação.
A linguagem de máquina é o alicerce invisível que permite que nossos computadores funcionem.
Mesmo que não precisemos escrever diretamente em binário, é importante entender como ele opera.
Na próxima vez que você ligar o computador, lembre-se: por trás dos cliques e das telas coloridas,
há um mundo de 0s e 1s que faz tudo acontecer.
Conteúdo para iniciantes, idosos, Terceira Idade, Concurso Nacional Unificado, CNU, Concurso
Público, concursos, edital._
Quanto a sua existem, existem vários tipos de Linguagem, como:
. Linguagens concorrentes, distribuídas e paralelas
. Linguagens de aplicação ou aplicativas
. Linguagens de fluxo de dados
. Linguagens de microprogramação
. Linguagens de montagem e de macro
. Linguagens de projeto
. Linguagens extensíveis
. Linguagens não determinísticas
. Linguagem Hexadecimal
. Linguagem Assembly
3
Linguagem Assembly
Primeiros Usos de Assembly: O primeiro uso de Assembly foi na UNIVAC I e no ENIAC
(Electronic Numerical Integrator and Computer), dois dos primeiros computadores eletrônicos de
grande escala. Na década de 1950, a necessidade de uma linguagem mais amigável para
programação levou à criação de linguagens de baixo nível que pudessem representar as instruções
de máquina de forma simbólica.
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.
Lembrando um detalhe que pode impactar nas tarefas do dia a dia: use Assembly para a linguagem
e Assembler para o compilador. Veja mais detalhes a seguir.
Assembly: trata-se, como você viu neste conteúdo, da linguagem de programação feita por
mnemônicos simples. Ao escrever um código em Assembly é possível saber o que o processador
está fazendo. Além disso, você como desenvolvedor tem acesso a recursos que não teria se estivesse
usando uma linguagem de programação de alto nível.
Assembler: o Assembler é um compilador, um programa utilizado para ler o arquivo de texto que
contém o mnemônico da linguagem e o transforma em linguagem de máquina.
Instalação
O Assembly mesmo sendo uma linguagem de baixo nível, necessita ser transformada para ser
entendida pela maquina, que no caso o chamamos de Assembler. O Assembler é um utilitário que
traduz os códigos para a máquina. Existem diversos compiladores Assembly no mercado que
podem ser baixados pelo usuário para criação do seu código. Os principais compiladores
disponíveis atualmente são: Fasm, Goasm, Masm, Nasm e Tasm entre outros.
Vantagens
Tamanho dos programas de Assembly são menores;
Assembly permite criar ações de alta complexidade, impossíveis ou difíceis de se realizar em
linguagens de Alto Nível;
Conhecimento em Assembly possibilita a programação nos outros tipos de linguagem;
É um programa recomendável onde o tempo é um fator crítico como por exemplo: medições de
tempo que exigem boa performance;
Se torna de fácil compreensão com algum conhecimento de conceitos de hardware e seus dialetos.
Desvantagens
Programar em Assembly consome muito tempo para o programador;
A linguagem é portável apenas dentro de uma família de processadores.
Como é uma linguagem especifica para processadores de cada máquina, é necessário desenvolver
um programa para cada máquina.
Não existe rotinas pré-definidas, o programador deverá desenvolver suas próprias rotinas.
A linguagem Assembly apresenta um número muito reduzido de instruções, do tipo operações de
movimentação de dados em memória, para registros e para memórias, e operações lógicas e
aritméticas bem simples. Estas instruções são de baixa expressividade, isto é, elas são de baixo
nível. O programador deve programar num nível de detalhamento muito maior para fazer a mesma
coisa que em um programa escrito em linguagem de alto nível.
Como o programador utiliza diretamente os recursos do processador e memória, ele deve conhecer
muito bem a máquina onde ele está programando.
4
O endereçamento em sistemas computacionais refere-se à maneira como os dados ou instruções são
localizados na memória. Cada tipo de endereçamento está associado a diferentes formas de acesso e
manipulação de dados. Abaixo, seguem os principais tipos de endereçamento e os tipos de
instruções associadas:
1. Endereçamento Imediato
3. Endereçamento Indireto
Descrição: A instrução contém o endereço de um registrador ou local que, por sua vez, contém o
endereço do operando.
Vantagem: Flexibilidade para acessar uma grande faixa de endereços.
Desvantagem: Mais lento devido à indireção.
Exemplo de instrução: MOV A, @R0 (usa o conteúdo do registrador R0 como endereço).
5. Endereçamento Relativo
Descrição: O endereço efetivo é calculado somando um deslocamento ao valor atual do contador de
programa (PC).
Vantagem: Útil para loops e controle de fluxo.
Desvantagem: Pode ser confuso para longos deslocamentos.
Exemplo de instrução: JMP 05H (salta 5 posições à frente ou atrás do PC atual).
5
7. Endereçamento Indexado
Descrição: Usa um índice (geralmente armazenado em um registrador) para calcular o endereço do
operando.
Vantagem: Ideal para acessar elementos de arrays.
Desvantagem: Pode aumentar o tempo de execução.
Exemplo de instrução: MOV A, [SI] (acessa a memória no endereço contido em SI).
Esses tipos de endereçamento permitem que instruções operem de maneira eficiente, dependendo
do objetivo e das limitações do hardware.
Endereçamento de código de Programa
O endereçamento de código de programa está relacionado à maneira como as instruções de um
programa são armazenadas, acessadas e executadas na memória. Diferentes métodos são usados
para gerenciar esse acesso, dependendo da arquitetura do sistema e do formato das instruções. Aqui
estão os principais conceitos:
1. Endereçamento Contínuo
O código do programa é armazenado em uma sequência contínua de posições de memória.
Exemplo:
Um programa ocupa os endereços de 0x0000 até 0x0FFF, sendo cada instrução acessada em
sequência pelo contador de programa (PC).
Vantagem: Simples e eficiente para execução sequencial.
Desvantagem: Dificuldade em gerenciar programas muito grandes.
2. Endereçamento Baseado em Segmentos
A memória é dividida em segmentos, como código, dados e pilha. O segmento de código armazena
exclusivamente as instruções do programa.
Cada segmento possui um endereço base, e as instruções são acessadas como deslocamentos
relativos a esse endereço.
Exemplo de arquitetura: x86 (usa registradores CS – Código, DS – Dados, etc.).
3. Endereçamento Relativo ao PC (Program Counter)
As instruções do programa são acessadas de forma relativa ao contador de programa (PC), que
aponta para a próxima instrução a ser executada.
Modo típico de acesso:
Instruções sequenciais: o PC é incrementado automaticamente.
Instruções de desvio (como saltos e loops): adicionam um deslocamento ao valor atual do
PC.
Exemplo:
JMP +5 → Salta 5 endereços à frente da posição atual do PC.
4. Endereçamento Baseado em Bancos de Memória
O código do programa pode ser dividido em bancos (blocos), que são acessados de acordo com a
configuração de registradores ou bits de controle.
Vantagem: Útil para arquiteturas com memória limitada, como microcontroladores.
Desvantagem: Mais complexo de gerenciar.
5. Endereçamento Virtual (ou Lógico)
Utilizado em sistemas modernos com paginação ou segmentação virtual.
O programa opera em um espaço de memória lógico, que é mapeado para endereços físicos pela
unidade de gerenciamento de memória (MMU).
Vantagem: Permite que programas maiores que a memória física sejam executados.
Desvantagem: Introduz overhead no sistema.
6
6. Endereçamento por Instruções Condicionais ou Incondicionais
Em instruções de controle de fluxo, o endereçamento pode ser absoluto ou relativo:
Absoluto: O endereço completo da próxima instrução está na instrução atual.
Relativo: O desvio é calculado em relação ao endereço atual.
Exemplo de instrução condicional:
BEQ 0x2000 (salta para o endereço 0x2000 se a condição for verdadeira).
Considerações sobre o Endereçamento de Código
A eficiência do endereçamento afeta diretamente o desempenho da execução.
Arquiteturas como RISC simplificam os modos de endereçamento para melhorar a velocidade,
enquanto arquiteturas CISC podem oferecer maior flexibilidade.
7
Arquiteturas: x86, ARM, RISC-V.
8. Transferência Condicional
Descrição: A transferência ocorre somente se uma condição específica for satisfeita.
Exemplo (ARM):
MOVNE R0, #1 ; Move 1 para R0 somente se a condição "não igual" for verdadeira
Arquiteturas: ARM, x86.
8
Troca os valores entre dois operandos.
XCHG AX, BX ; Troca os valores de AX e BX
5. Modificadores e Endereçamento:
Immediate Addressing: Transferência de um valor constante.
MOV AX, 5 ; Coloca o valor imediato 5 no registrador AX
Indirect Addressing: Usa ponteiros para acessar dados.
MOV AX, [BX] ; Copia o valor da memória apontada por BX para AX
Essas instruções variam conforme o conjunto de instruções (x86, ARM, RISC-V, etc.).
Instruções Aritméticas
Na linguagem de máquina, as instruções aritméticas são usadas para realizar operações matemáticas
entre os dados armazenados na memória ou nos registradores de um processador. Essas instruções
são fundamentais para a execução de cálculos em programas de computador.
Algumas das principais instruções aritméticas em linguagem de máquina incluem:
1. ADD (Adição): Realiza a soma de dois operandos. O resultado é armazenado em um registrador
ou na memória.
Exemplo: ADD R1, R2 – Soma o conteúdo de R1 e R2, armazenando o resultado em R1.
2. SUB (Subtração): Realiza a subtração de dois operandos.
Exemplo: SUB R1, R2 – Subtrai o valor de R2 de R1, armazenando o resultado em R1.
3. MUL (Multiplicação): Realiza a multiplicação de dois operandos.
Exemplo: MUL R1, R2 – Multiplica os valores de R1 e R2, armazenando o resultado em R1.
4. DIV (Divisão): Realiza a divisão de dois operandos.
Exemplo: DIV R1, R2 – Divide o valor de R1 por R2, armazenando o quociente em R1.
5. INC (Incremento): Aumenta o valor de um registrador em uma unidade.
Exemplo: INC R1 – Incrementa o valor de R1 em 1.
6. DEC (Decremento): Diminui o valor de um registrador em uma unidade.
Exemplo: DEC R1 – Decrementa o valor de R1 em 1.
Essas operações aritméticas são traduzidas em código binário, que o processador pode entender e
executar. O formato exato das instruções pode variar dependendo da arquitetura do processador e
do conjunto de instruções (ISA, ou Instruction Set Architecture) utilizado.
9. NEG (Negação): A instrução NEG inverte o sinal de um número (transforma positivo em
negativo e vice-versa).
Sintaxe:
9
NEG operando
operando: O valor cujo sinal será invertido.
-Exemplo:
NEG AX ; Torna o valor de AX negativo, se já for positivo, ou positivo, se já for negativo
10. CMP (Comparação): Embora não seja uma operação aritmética direta, a instrução CMP realiza
uma comparação entre dois operandos subtraindo-os, mas sem armazenar o resultado. O propósito
principal do CMP é afetar as bandeiras (flags) do processador, que podem ser usadas em instruções
de desvio condicional.
Sintaxe:
CMP operando1, operando2
operando1 e operando2: Os valores a serem comparados.
Exemplo:
CMP AX, BX ; Compara o valor de AX com o de BX
10
Conclusão
A linguagem máquina é a forma mais básica de programação de computadores, representando
diretamente as operações que o processador pode executar. Embora extremamente eficiente e
rápida, ela é difícil de escrever e entender, sendo hoje usada principalmente em programação de
baixo nível e em situações onde o controle absoluto sobre o hardware é necessário. Para a maioria
dos desenvolvimentos de software, utilizam-se linguagens de mais alto nível, que são
posteriormente convertidas para linguagem máquina pelo compilador ou interpretador.
11