linguagem_de_maquina

Post on 24-Jun-2015

93 views 2 download

description

texto em português

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.