linguagem_de_maquina
-
Upload
antonio-correia -
Category
Documents
-
view
93 -
download
2
description
Transcript of linguagem_de_maquina
Linguagem de Máquina
Organização de Computadores
Conteúdo
1. Introdução2. Operações executadas pelo hardware da máquina3. Operandos do hardware da máquina4. Representação de instruções5. Instruções de desvio6. Suporte a procedimentos pelo hardware da máquina7. Além dos números8. Outros estilos de endereçamento9. Execução de um programa10. Exemplo para juntas as peças11. Lendas e falhas12. Considerações finais13. 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 2Operando 1
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:
);()( cbhlf
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:
];8[ahg
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:
];8[]12[ aha
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)if (a==10)
a=a+1;
else
a=a-1;
b)if (a==10) {
a=a+1;
b=10;
}
else {
a=a-1;
b=20;
}
c)for (i=0; i<10; i++) {
a=a+1;
c=10;
}
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.