Você está na página 1de 45

Linguagem de

Máquina
Organização de Computadores
Conteúdo
1. Introdução
2. Operações executadas pelo hardware da máquina
3. Operandos do hardware da máquina
4. Representação de instruções
5. Instruções de desvio
6. Suporte a procedimentos pelo hardware da máquina
7. Além dos números
8. Outros estilos de endereçamento
9. Execução de um programa
10. Exemplo para juntas as peças
11. Lendas e falhas
12. Considerações finais
13. Bibliografia
1. Introdução
 Linguagem de máquina → instruções
 Conjunto de instruções → vocabulário
 Metodologia: aumento gradativo da complexidade
 Linguagens de máquinas: mais parecidas com dialetos do que com
línguas diferentes (princípios semelhantes)
 Objetivos da linguagem:
 Facilitar construção do hardware e compiladores
 Maximizar a performance
 Minimizar o custo
 Nesta unidade: Linguagem C, Assembly, Linguagem de Máquina
 Instruções: MIPS (NEC, Nintendo, Silicon Graphics, Sony)
 Instruções do Z80 (laboratório)
Instrução - Definição

 É um comando referente a uma operação


elementar que o computador seja capaz de
executar. Cada modelo de computador
dispõe de certo conjunto de instruções,
que constituem o seu repertório de
instruções. O número de instruções que
constituem o repertório varia desde
algumas dezenas até mais de uma
centena.
Formato das Instruções

 Código de operação ou OPCODE:


identifica a operação a ser realizada pelo
processador. É o campo da instrução cuja
valor binário identifica (é o código binário) da
operação a ser realizada.
 Formato de instruções de um operando:

Código de operação Operando


Formato de Instruções

• O número de bits do código de operação


depende de quantas instruções tem o set de
instruções da máquina.
• Ex: um processador com 256 instruções
teria necessidade de 8 bits para representar
o código de operação
Formato de Instruções

 Outros sistemas possuem código de operação de


tamanho variável.
 Por exemplo, o IBM/370 tem:

 166 instruções com código de operação de 8

bits.
 11 instruções com código de operação de 16

bits.
Formato de Instruções

 Operando(s) - é o campo da instrução cujo


valor binário sinaliza a localização do dado
(ou é o próprio dado) que será manipulado
(processado) pela instrução durante a
operação.
Tipos de Instruções

 Três formatos típicos de instrução:

Código de operação

Código de operação Operando

Código de operação Operando 1 Operando 2


Tipos de Instruções

 As instruções de um computador, podem ser


classificadas de acordo com a sua
funcionalidade:
 Transferência de dados
 Uso dos recursos da CPU
 Desvio do fluxo de execução
 I/O
2. Operações do Hardware
 Todo computador deve realizar operações aritméticas
fundamentais
 MIPS: add a,b,c ↔ ab+c
 Z80: add a,b ↔ aa+b
 A princípio denotaremos a, b e c como variáveis

 Instruções são mais rígidas que em linguagem de alto


nível  sempre 3 operandos (MIPS).
 Simplifica o hardware
Exercícios
1. criar uma seqüência de instruções para somar a, b, c e d.
 Usando instruções MIPS
 Usando instruções do Z80
2. Traduzir para o MIPS e para o Z80 o programa em C
abaixo:
a=b+c;
d=a-e;
3. Um programa em C um pouco mais complexo que o
anterior é apresentado a seguir, e contém cinco variáveis:
f  (l  h)  (b  c);
a) Qual o código MIPS produzido pelo compilador?
b) Qual o código Z80 produzido pelo compilador?
3. Operandos do hardware de
máquina
 Em baixo nível não há o conceito de variável
 Registradores → conjunto especial de localidades de
memória
 No Z80 os registradores podem ser de 8 ou 16 bits:
 8 bits: A, B, C, D, E, F, H, I
 16 bits: IX e IY
 8 bits: palavra (word)
 Operandos: sempre um registrador para as operações
aritméticas
 Registrador A: acumulador (acc)
 Número de registradores influencia no ciclo de clock
3. Operandos do hardware de
máquina
 Muitas vezes: existem variáveis demais.
 Arrays (matrizes), estruturas etc.
 Quando os registradores internos não são
suficientes  memória (milhões de posições).
 Z80  Aritmética ocorre apenas nos registradores.
 Necessidade de instruções de transferência (load):
 Memória  Registradores
 Registradores  Memória
Memória
 Posições de memória:
números.
 1 byte por posição.
 Memória  Registradores
 ld (carregar)
 Sintaxe:
 ld A,(nn)
 Atribui
ao registrador A o valor da
posição de memória indicada por nn
(entre 0000H e FFFF H)
Exercício
 Supor que a é uma array (matriz) de 100 posições. As
variáveis g e h estão armazenadas nos registradores B e
C. O endereço base da array está armazenado em HL.
Traduzir para assembly:

g  h  a[8];

 Obs: a partir de agora usaremos a seguinte notação:


 Letras maiúsculas → registradores
 Letras minúsculas → variáveis
Armazenamento
 No Z80 tanto o armazenamento quanto o
carregamento são feitos pela instrução ld
 ld (nn),A
 Atribui a posição de memória indicada por nn
uma cópia do valor existente no registrador A
Exercício
 Supor que variável h esteja associada ao
registrador C e que o endereço-base de a esteja
armazenado em HL. Qual o código de montagem
do Z80 para o comando de atribuição seguinte,
escrito em C:

a[12]  h  a[8];
Interface Hardware/Software
 Muitas vezes existem mais variáveis que
registradores
 Variáveis mais freqüentemente usadas →
registradores. As restantes → memória.
 Processo de colocar variáveis menos usadas
na memória: vazamento de registradores
(spilling registers).
 Registradores são mais rápidos que
memória.
4. Representação das
instruções
 Humanos: base 10. Computadores: base 2.
 12310=11110112.
 Instruções: números.
 Z80  Instruções de 8, 16, 24 ou 32 bits.
 Cada instrução contém: opcode, operandos.
 Registradores no Z80:
 A (acumulador) – 8 bits
 B, C, D, E, H, L – 8 bits
 F (flags) – 8 bits
 IX, IY (endereçamento) – 8 bits
Instruções em linguagem de
máquina no Z80
 Há um conflito entre o desejo de manter
todas as instruções do mesmo tamanho e o
desejo de ter um único formato de instrução.
 Todas as instruções no Z80 possuem o
mesmo formato: tamanhos diferentes
 Todas as instruções no MIPS possuem o
mesmo tamanho: formatos diferentes
Instruções em linguagem de
máquina no Z80
 Veja apostila do laboratório, disponível em:
 ANEXO III - Tabela de OpCodes
Computadores modernos
1. Instruções são representadas como números.
2. Programas podem ser armazenados na memória.
 Programa armazenado na memória (diversidade):
 Programa de contabilidade.
 Editor.
 Compilador.
 Dados.
 Texto.
 Programa em C.
5. Instruções de Desvio
 Computadores: capacidade de tomar
decisões baseadas nos dados.
 Linguagens de alto nível: if e goto.
 Z80: jp
 Veja apostila do laboratório:
 Saltos Condicionais e Incondicionais
Exercícios
1. Transformar para linguagem de montagem
do Z80:

a) b) c)
if (a==10) if (a==10) { for (i=0; i<10; i++) {
a=a+1; a=a+1; a=a+1;
else b=10; c=10;
   a=a-1; } }
else {
   a=a-1;
b=20;
}
6. Suporte a procedimentos
pelo hardware da máquina
 Procedimento ou sub-rotina:
 Estruturação de programas.
 Mais fácil de entender.
 Reutilização.
 Dividir em partes menores.
 Analogia “Agente Secreto”
 Recebe o plano.
 Adquire os recursos.
 Executa.
 Limpa “pistas”.
 Devolve o resultado.
O programa e o procedimentos
precisam
 Colocar os parâmetros em lugar acessível ao
procedimento.
 Transferir controle p/ o procedimento.
 Garantir recursos de memória necessários à
execução do procedimento.
 Realizar a tarefa.
 Colocar o resultado acessível ao programa
que chamou o procedimento
 Retornar o controle ao ponto de origem
Passagem de parâmetros
 Forma tradicional: usar a pilha.
 Estrutura do tipo LIFO.
 Usada para:
 Colocar argumentos extras.
 Colocar retornos extras.
 Salvar registradores.
 Variáveis locais.
 Colocar na pilha: push.
 Retirar da pilha: pop.
Procedimentos no Z80
 Veja apostila do laboratório:
 Instruções de Rotação e Funções
Exercícios
 Transforma num procedimento o trecho de
programa abaixo:
int examplo (ing g, int h, int i, int j)
{
int f;
f = (g + h) – (i + j);
return f;
}
Procedimentos Aninhados
 Mais difíceis.
 Chamam outros procedimentos.
 Pior: chamam eles mesmos (recursivos).
 Como resolver?
Alocação de espaço para novos
dados
 Pilha: também usada para guardar variáveis locais
que não cabem nos registradores.
 Por exemplo: arrays
 Variáveis em C:
 Posição de memória.
 Tipo: int ou char
 Classe de armazenamento: automática ou estática
 Automáticas: locais a um procedimento.
 Estáticas: sobrevivem a um procedimento, declaradas fora
de procedimentos.
7. Além do números
 Computadores: inicialmente números.
 Depois: textos.
 Muito usado: código ASCII.
 O Z80 não possui strings. Para os exercícios
seguintes usar-se-á como strings os códigos
em hexadecimal do teclado.
 Veja detalhes de como tratar strings no livro
do Patterson-Hannessy pág 78
Exercícios
 O procedimento strcpy copia um string y num string
x, usando o byte null como convenção de término
de string. Faça o procedimento na linguagem do
Z80 fazendo o teste de parada com o número zero.
void strcpy(char x[ ], char y[ ])
{
int i;
i = 0;
while (x[i] = y [i] != 0)
i = i+1;
}
8. Outros estilos de
endereçamento no Z80
 Modo de endereçamento: é a forma de
sinalizar a localização de um dado. Pode ser:
 endereçamento direto;
 endereçamento indireto;
 endereçamento imediato;
 endereçamento indexado.
 Veja apostila do laboratório:
  Instruções de Transferência de Dados
9. Execução de um programa
 São necessários quatro passos para
transformar um programa em C
linguagem de máquina
Compilador
 Transforma C  Assembly
 Linguagem de alto nível: maior produtividade.
 Antigamente: escrito em Assembly.
 Atualmente: escrito em linguagem de alto
nível.
Montador
 Assembly  Linguagem de máquina.
 MIPS: O assembly “incrementa” artificialmente o set de
instruções.
 Pseudo-instruções: não existem na máquina, o montador as cria
para melhorar os recursos do Assembly.
 Pseudo-instrução move: move $t0,$t1
 O montador transforma em: add $t0,$zero,$t1
 Montadores: aceitam números em diferentes bases: decimal,
binário, hexadecimal.
 Montador: transforma o programa em linguagem de máquina
num arquivo objeto  combinação de:
 instruções em linguagem de máquina;
 dados;
 informações necessárias para carregar o programa adequadamente
na memória.
Ligador (Linker)
 Mudança em um programa, que é parte de
um conjunto: tem que mudar todo o
programa?
 Não. Só uma parte é recompilada.
 Cada programa já pode estar compilado (em
linguagem de máquina).
 Um programa chamado ligador “monta” os
programas como um único programa.
Ligador - 3 passos
1. Colocar os módulos de código e dados
simbolicamente na memória
2. Determinar os endereços dos labels de dados e
de instruções.
3. Resolver as referências externas e internas.
 Usa, para tal, as informações do programa objeto.
 O ligador “monta” o arquivo, colocando os
endereços certos. Gera um arquivo executável.
Carregador (Loader)
 Realiza o carregamento do programa na
memória. No UNIX:
1. Leitura do cabeçalho.
2. Criação de espaço de cód. e dados.
3. Copiar instr. e dados para a memória.
4. Copiara os par. p/ a pilha (quando houver).
5. Iniciar o SP (stack pointer).
6. Desviar para a rotina de inicialização
10. Exemplo Para Juntar as
Peças
 O procedimento swap.
 Trocar dois elementos consecutivos do array.
 Na tradução de qualquer programa em C
para a linguagem de máquina, deverão ser
seguidos os seguintes passos:
1. Alocar registradores para as variáveis.
2. Produzir código para o procedimento.
3. Preservar os registradores nas chamadas.
11. Lendas e falhas
 Lenda → Instruções mais poderosas
significam melhor performance
 Falha → esquecer que endereços de
palavras consecutivas com endereçamento a
byte não diferem de uma unidade
 Falha → usar um ponteiro para uma variável
automática fora do procedimento onde ela foi
definida.
12. Considerações finais
 Princípios básicos do hardware:
1. A simplicidade é favorecida pela regularidade

2. Quanto menor, mais rápido

3. Um bom projeto demanda compromisso

4. Torne o caso comum mais rápido


13. Bibliografia
Patterson, David A. e Hennessy, John L.
Organização e Projeto de
Computadores: A Interface
Hardware/Software. Ed. LTC, 452. Ed.,
2000, Rio de Janeiro.

Você também pode gostar