Você está na página 1de 65

Algoritmos e Estrutura

de Dados Avançado
Linguagens de máquina e linguagem de
montagem Assembly

Prof. PhD. Antonio C. Zena

E-mail: antonio.zena@anhanguera.com
Linguagens de máquina e linguagem de
montagem Assembly
Linguagens de Programação

Uma linguagem de programação pode ser definida como sendo um


conjunto limitado de instruções (vocabulário), associado a um conjunto
de regras (sintaxe) que define como as instruções podem ser
associadas, ou seja, como se pode compor os programas para a
resolução de um determinado problema.
As linguagens de programação podem ser classificadas em níveis de
linguagens, sendo que as linguagens de nível mais baixo estão mais
próximas da linguagem interpretada pelo processador e mais distante das
linguagens naturais.
Linguagem de Máquina

Na linguagem de máquina, a representação dos dados e das operações


(instruções) que constituem um programa, é baseada no sistema binário, que é a
forma compreendida e executada pelo hardware do sistema.
Torna-se inviável escrever ou ler um programa codificado na forma de uma
string de bits.
Linguagem Hexadecimal

Para simplificar a compreensão e a programação de computadores, foi adotado


(num primeiro momento) a notação hexadecimal para representar programas em
linguagens de máquina.
Mas a programação e leitura usando a linguagem hexadecimal continuou
impraticável.
Linguagem Assembly

A linguagem de máquina de cada processador é acompanhada de uma versão “legível”


da linguagem de máquina que é a chamada linguagem simbólica Assembly.
Simbólica pois esta linguagem não é composta de números binários ou hexadecimais,
como nas duas linguagens anteriores.
Utiliza palavras abreviadas, chamadas mnemônicos, indicando a operação a ser
realizada pelo processador.
O que é a linguagem Assembly?

A linguagem Assembly, comumente abreviada por ASM, é uma linguagem de


programação de baixo nível que permite aos programadores escreverem
código em instruções de baixo nível, próximas à linguagem de máquina, em vez
de usar uma linguagem de alto nível mais abstrata, como C, Python, por exemplo.
Exemplos de instruções Assembly:

MOV R1, R2
mnemônico MOV (abreviação de MOVE) e dois registradores como parâmetro: R1
e R2.
Quando o processador executa essa instrução, ele comanda o movimento do
conteúdo de R2 para R1.
No Pascal : R1: = R2.
Trata-se de uma linguagem simbólica que representa as instruções em uma forma
mnemônica (códigos de operação), que é mais fácil de entender para os
programadores do que a representação binária das instruções.
Por exemplo, em uma instrução Assembly, “ADD” pode representar a adição de
dois números quaisquer.
Cada instrução Assembly representa uma operação específica que a CPU
(Unidade Central de Processamento – Processador) deve executar, como por
exemplo mover dados da memória principal para um registrador, realizar
operações aritméticas ou executar desvios condicionais ou incondicionais.
A linguagem Assembly é específica para cada tipo de processador e arquitetura
de computador, pois as instruções Assembly são diretamente executadas pelo
hardware da máquina.
Embora a linguagem Assembly seja mais difícil de aprender e escrever do que as
linguagens de programação de alto nível, ela permite um controle muito mais
preciso e direto sobre o hardware do sistema, tornando-a ideal para
desenvolvedores que precisam escrever software para sistemas embarcados,
sistemas operacionais, drivers de dispositivos e outras aplicações que exigem
acesso direto ao hardware da máquina, alta velocidade de execução e
confiabilidade.
Quais as aplicações do Assembly hoje em dia?
Embora a linguagem Assembly seja considerada uma linguagem de
programação de baixo nível e mais difícil de aprender do que as linguagens de
programação de alto nível, ela ainda é amplamente usada em áreas
especializadas da programação que exigem alto desempenho e controle preciso
sobre o hardware.
Algumas das aplicações atuais do Assembly:
❑ Desenvolvimento de sistemas operacionais: os sistemas operacionais
são um exemplo clássico de aplicação de Assembly, pois exigem um
controle preciso sobre o hardware da máquina e um alto desempenho
para executar operações em tempo real.
❑ Controle de processos com resposta em tempo real
Nesse tipo de aplicação, o processador deve executar um conjunto de
instruções em um tempo limitado;

❑ Comunicação e transferência de dados


Nesse tipo de aplicação é utilizada a linguagem Assembly, devido a
possibilidade de acessar diretamente o hardware;
❑ Otimização de sub-tarefas da programação de alto nível
Um programa não precisa somente ser escrito em linguagem Assembly
ou linguagem de alto nível.
Podemos ter programas de alto nível com sub-tarefas escritas em
Assembly, para o caso de tarefas tempo-real ou para a programação do
hardware do computador.
❑ Programação de dispositivos embarcados: muitos dispositivos
embarcados, como microcontroladores, câmeras digitais, telefones
celulares e dispositivos IoT, são programados em Assembly, pois exigem
um controle muito preciso sobre o hardware e uma alta eficiência em
termos de recursos.
❑ Criação de drivers de dispositivos: os drivers de dispositivos são
programas que permitem que o sistema operacional se comunique com
os dispositivos de hardware, como placas de som, placas de vídeo e
dispositivos de rede.
Esses drivers são frequentemente escritos em Assembly, pois exigem um
controle muito preciso sobre o hardware e um alto desempenho.
❑ Processamento de imagens: as operações de processamento de
imagens, como convolução, filtragem e detecção de bordas, são
frequentemente executadas em Assembly para obter um desempenho
máximo.
❑ Programação de jogos eletrônicos: muitos jogos eletrônicos ainda são
programados em Assembly para obter o máximo desempenho possível,
especialmente em consoles de jogos com recursos limitados.
❑ Criptografia: muitos algoritmos de criptografia são implementados em
Assembly para garantir a segurança dos dados e garantir o desempenho
máximo.

Então, a linguagem Assembly é usada em áreas onde é necessário um


controle muito preciso sobre o hardware da máquina e um alto desempenho,
mesmo que isso signifique uma curva de aprendizado mais trabalhoso e um
processo de desenvolvimento mais complexo.
Quais versões do Assembly existem?
A linguagem Assembly não tem versões específicas, como outras
linguagens de programação. Em vez disso, existem vários conjuntos de
instruções Assembly, cada um projetado para um processador ou arquitetura
de computador específico. Isso ocorre porque as instruções Assembly são
escritas em um nível muito baixo, que é quase diretamente traduzido em
instruções de máquina.
Dessa forma, a linguagem Assembly é altamente dependente do hardware
subjacente onde as aplicações serão executadas.
Cada arquitetura de computador tem seu próprio conjunto de instruções
Assembly que são otimizadas para funcionar com o hardware específico.
Por exemplo, a arquitetura x86 é usada por muitos processadores Intel e
AMD, enquanto a arquitetura ARM é usada em dispositivos móveis,
smartphones e outros sistemas embarcados.
Ou seja, cada uma dessas arquiteturas tem seu próprio conjunto de
instruções Assembly distinto.
Como começar a programar em Assembly?
Começar a programar em Assembly pode parecer bastante complicado a
princípio (e é), especialmente se não estivermos acostumados com
linguagens de programação de alto nível, mas é possível aprender com
bastante prática e paciência.
Algumas dicas para quem deseja começar a aprender essa linguagem:
➢ Escolha um conjunto de instruções: como mencionado anteriormente,
cada arquitetura de processador tem seu próprio conjunto de instruções
Assembly. Portanto, o primeiro passo é escolher o conjunto de instruções
que você deseja aprender, com base no processador que você está usando
(por exemplo, plataforma Intel x86_64).
➢ Entenda a estrutura básica do programa Assembly: um programa
Assembly é composto por uma série de instruções que são executadas
sequencialmente.
➢ É importante entender como as instruções são organizadas em um
programa Assembly.
➢ Aprenda as instruções básicas: Obviamente, devemos começar com as
instruções básicas, como movimento de dados, aritmética básica,
operações lógicas, desvios condicionais e loops.
➢ Essas instruções são as bases do Assembly e são usadas em todos os
programas Assembly.
➢ Use um ambiente de desenvolvimento integrado (IDE): um ambiente
de desenvolvimento integrado é um software que facilita a escrita e
execução de código Assembly.
➢ Existem vários IDEs disponíveis, como o MASM da Microsoft, o
NASM para sistemas Unix e o GCC para várias plataformas.
➢ Pratique, pratique e pratique: a melhor maneira de aprender Assembly
(ou qualquer outra linguagem de programação) é praticar
escrevendo muito código.
➢ Comece com programas simples e, gradualmente, escreva programas mais
complexos à medida que se torna mais confortável com a linguagem.
➢ Recursos de aprendizagem: existem muitos recursos de
aprendizagem disponíveis online, como tutoriais, livros e
fóruns. Alguns recursos que posso recomendar incluem
“Assembly Language Step-by-Step” de Jeff Duntemann e o
site “Assembly Language Tutorials” de Ray Seyfarth
Treinamentos em tecnologia!
❑ADD R1, R2
Mnemônico ADD (abreviação de ADDITION) e dois registradores como
parâmetro: R1 e R2.
Quando o processador executa essa instrução ele comanda a adição do conteúdo
de R1 ao conteúdo de R2 e o resultado é armazenado em R1
No Pascal : R1 : = R1 + R2.
Vantagens e Desvantagens da Linguagem Assembly
Desvantagens:
➢ A linguagem apresenta um número muito reduzido de instruções;
➢ Programar em Assembly consome muito tempo para o programador;
➢ A linguagem é portável apenas dentro de uma família de processadores;
➢ Não existe rotinas pré-definidas, o programador deverá desenvolver suas
próprias rotinas;
➢ O programa Assembly não é portável (pode ser usado apenas em um tipo
de computador). É portável apenas dentro de uma família de
processadores;
➢ A programação Assembly tem um custo de desenvolvimento maior;
➢ Como o programador utiliza diretamente os recursos do processador e
memória, ele deve conhecer muito bem a máquina onde ele está
programando.
Vantagens:
➢ Permite acesso direto ao programa de máquina. Utilizando uma linguagem de
alto nível, não se tem o controle de código de máquina gerado pelo compilador.
Um programa escrito em linguagem Assembly pode ser de 0 a 300% menor e
mais rápido que um programa compilado;
➢ Conhecimento em Assembly possibilita a programação nos outros tipos de
linguagem;
➢ Assembly permite criar ações de alta complexidade, impossíveis ou difíceis
de se realizar em linguagens de Alto Nível;
➢ Se torna de fácil compreensão com algum conhecimento de conceitos de
hardware e seus dialetos.
A Figura1 mostra um diagrama de blocos de um computador com programa
armazenado. A memória do computador é dividida em duas partes: (i) uma
memória de instruções. e (ii) uma memória de dados.

Figura 1: Modelo de computador com programa armazenado.


Entre as duas memórias está o processador.
Um registrador chamado de PC, ou Program Counter, mantém o endereço da
próxima instrução que será executada.
O registrador instr mantém a instrução corrente, que está sendo executada. O
bloco de registradores (regs) contém 32 registradores que armazenam os
valores temporários das variáveis do programa que está a executar.
A unidade de lógica e aritmética (ULA) efetua a operação determinada pela
instrução corrente sobre os conteúdos de dois registradores e armazena o resultado
num terceiro registrador.
O circuito que controla o funcionamento interno do processador sequência a
execução de cada instrução em quatro fases:
1. indexado pelo PC, busca na memória uma instrução, que é a “instrução
corrente”;
2. decodifica a instrução corrente;
3. executa a operação definida pela instrução; e
4. armazena o resultado da operação e retorna para 1.
Perguntas?

06/03/2024
Linguagem de máquina

Assembly
Assembly
Assembly
Assembly
Assembly
Assembly
Assembly
Assembly
Assembly
1)Little-endian: Os bytes
menos significativos são
guardados por primeiro na
memória.
2)Big-endian: Os bytes mais
significativos são guardados por
primeiro na memória.

ATmega328 utiliza
Little-endian.

Você também pode gostar