linguagem_de_maquina

45
Linguagem de Máquina Organização de Computadores

description

texto em português

Transcript of linguagem_de_maquina

Page 1: linguagem_de_maquina

Linguagem de Máquina

Organização de Computadores

Page 2: linguagem_de_maquina

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

Page 3: linguagem_de_maquina

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)

Page 4: linguagem_de_maquina

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.

Page 5: linguagem_de_maquina

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

Page 6: linguagem_de_maquina

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

Page 7: linguagem_de_maquina

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.

Page 8: linguagem_de_maquina

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.

Page 9: linguagem_de_maquina

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

Page 10: linguagem_de_maquina

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

Page 11: linguagem_de_maquina

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

Page 12: linguagem_de_maquina

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?

Page 13: linguagem_de_maquina

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

Page 14: linguagem_de_maquina

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

Page 15: linguagem_de_maquina

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)

Page 16: linguagem_de_maquina

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

Page 17: linguagem_de_maquina

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

Page 18: linguagem_de_maquina

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

Page 19: linguagem_de_maquina

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.

Page 20: linguagem_de_maquina

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

Page 21: linguagem_de_maquina

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

Page 22: linguagem_de_maquina

Instruções em linguagem de máquina no Z80

Veja apostila do laboratório, disponível em: ANEXO III - Tabela de OpCodes

Page 23: linguagem_de_maquina

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.

Page 24: linguagem_de_maquina

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

Page 25: linguagem_de_maquina

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;

}

Page 26: linguagem_de_maquina

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.

Page 27: linguagem_de_maquina

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

Page 28: linguagem_de_maquina

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.

Page 29: linguagem_de_maquina

Procedimentos no Z80

Veja apostila do laboratório: Instruções de Rotação e Funções

Page 30: linguagem_de_maquina

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;

}

Page 31: linguagem_de_maquina

Procedimentos Aninhados

Mais difíceis. Chamam outros procedimentos. Pior: chamam eles mesmos (recursivos). Como resolver?

Page 32: linguagem_de_maquina

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.

Page 33: linguagem_de_maquina

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

Page 34: linguagem_de_maquina

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;}

Page 35: linguagem_de_maquina

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

Page 36: linguagem_de_maquina

9. Execução de um programa São necessários quatro passos para

transformar um programa em C linguagem de máquina

Page 37: linguagem_de_maquina

Compilador

Transforma C Assembly Linguagem de alto nível: maior

produtividade. Antigamente: escrito em Assembly. Atualmente: escrito em linguagem de alto

nível.

Page 38: linguagem_de_maquina

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.

Page 39: linguagem_de_maquina

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.

Page 40: linguagem_de_maquina

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.

Page 41: linguagem_de_maquina

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

Page 42: linguagem_de_maquina

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.

Page 43: linguagem_de_maquina

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.

Page 44: linguagem_de_maquina

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

Page 45: linguagem_de_maquina

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.