terça-feira, 30 de agosto de 2011

OPERAÇÕES EXECUTADAS PELO HARDWARE DA MÁQUINA

Todo computador precisa ser capaz de executar operações aritméticas. A notação abaixo, da linguagem de montagem do MIPS,
add a, b, c
instrui o computador a somar duas variáveis  b e c, colocando o resultado da soma em a.
Esta notação é extremamente rígida e muito limitada, na medida em que cada instrução aritmética do MIPS executa apenas uma operação e precisa sempre referenciar exatamente três variáveis. Por exemplo, suponha que desejemos colocar a soma de b, c, d e e na variável a.

Linguagem de montagem do MIPS
Categoria
Instrução
Exemplo
Significado
Comentário
Aritmética
add
add a, b, c
a = b + c
Sempre três operandos
subtract
sub a, b, c
a = b –c
Sempre três operandos


A sequência de intruções a seguir adiciona as variáveis acima referenciadas:

add a, b, c # A soma de b e c é colocada em a.
add a, a, d # A soma de b, c e d é colocada em a.
add a, a, e # A soma de b, c d e e está agora em a.

Portanto, gastamos três instruções para obter a soma de quatro variáveis.
As palavras à direita do símbolo do "jogo da velha" (#) em cada uma das linhas acima são os comentários, muito importantes para os leitores humanos e solenemente ignorados pelo computador. Observe que, ao contrário de outras linguagens, cada linha desta linguagem pode conter no máximo uma instrução. Outra diferença é que os comentários sempre terminam no final de uma linha.
Intuitivamente, uma operação como a adição possui três operandos: os dois números a serem somados e um lugar para colocar o valor da soma. Exigir que cada instrução tenha exatamente três operandos, nem mais nem menos, segue a filosofia de manter o hardware tão simples quanto possível: o hardware para realizar operações aritméticas sobre um número variável de operandos é mais complicado do que aquele que trata com um número fixo de variáveis. Essa situação ilustra o primeiro dos quatro princípios básicos do projeto do hardware:

Princípío de projeto 1: A simplicidade é favorecida pela regularidade.

Podemos agora mostrar, nos dois exemplos que se seguem, as relações dos programas escritos em linguagem de alto nível para os programas escritos nesta notação mais primitiva.

Compilação de dois comandos de atribuição em C para linguagem de montagem do MIPS
Exemplo
O segmento a seguir, de um programa em C, contém cinco variáveis, a, b, c, d e e:

a = b + c;
d = a - e;

A tradução das instruções em C para linguagem de montagem do MIPS é realizada por um compilador. Mostre o código MIPS, produzido pelo compilador C.

Solução

Uma instrução aritmética do MIPS opera sempre sobre dois operandos-fonte, e coloca o resultado em um operando-destino. Portanto, os dois comandos C acima são compilados diretamente nas duas instruções da linguagem de montagem do MIPS, mostradas a seguir:

add a, b, c
sub d, a, e

Compilação de uma declaração C complexa.
Exemplo
Um comando em C um pouco mais complexo que o anterior é apresentado a seguir, e contém cinco variáveis f, g, h, i e j:

f = (g + h) - (i + j);

Qual o código MIPS produzido pelo compilador?

_______________________________________________________________________________
Referência
PATTERSON A. David & HENNESSY L. John. Organização e projeto de computadores. A interface HARDWARE/SOFTWARE. 2ed. LTC - Rio de Janeiro - 2000.

Por mim adaptado.
Enquanto adaptava este texto ouvia Erykah Badu...
_______________________________________________________________________________
Infelizmente na próxima QUARTA (31 de agosto) não poderei comparecer ao campus. Esta aula será compensada da seguinte maneira:
No dia 14 de setembro ficaremos juntos até às 22:20;
No dia 21 de setembro ficaremos juntos até às 21:30.
_______________________________________________________________________________
Comentem este post.

2 comentários:

  1. Este comentário foi removido pelo autor.

    ResponderExcluir
  2. professor segue resposta da pergunta do codigo mips da questao f=(g+h)-(i+j)
    f=(g+h)-(i+j)

    add $t0,$s1,$s2 #temporario t0=g+h
    add $t1,$s3,$s4 #temporario t1=i+j
    sub $s0,$t0,$t1 #f=(g+h)-(i+j)
    estaria certo assim ?

    ResponderExcluir