Escolar Documentos
Profissional Documentos
Cultura Documentos
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
bits.
11 instruções com código de operação de 16
bits.
Formato de Instruções
Código de operação
g h a[8];
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