UFMG-ICEx-DCC
Algoritmos e Estruturas de Dados I

Relacionada a um computador temos não só a Linguagem de Montagem mas, também, a Linguagem de Máquina. A Linguagem de Máquina consiste do conjunto de instruções definidas por cadeias de zeros e uns. A Linguagem de Máquina, por corresponder a zeros e uns, é de difícil compreensão para os seres humanos. A Linguagem de Montagem corresponde a uma tentativa de tornar mais fácil, para o ser humano, o significado das sequências de zeros e uns da Linguagem de Máquina. Abaixo discutimos a correspondência entre Linguagem de Máquina e Linguagem de Montagem do computador simplificado discutido em sala de aula.

Considere que cada posição de memória do computador simplificado tem 15 bits - lembre-se que um bit corresponde a um dígito binário ou seja: zero ou um. Considere a seguinte convenção de codificação de instruções de linguagem de montagem para linguagem de máquina:

Na codificação acima IIII, JJJJ ou KKKK representam quatro dígitos binários que identificam uma das 16 posições de memória do computador simplificado; 0000 corresponde a E0, 0001 corresponde a E1, 0010 corresponde a E2 e assim sucessivamente até 1111 que corresponde a E15.

Um computador tem programas que auxiliam nas tarefas de programação do próprio computador ou de algum outro computador. Raramente é utilizada a Linguagem de Montagem, mais raramente ainda é utilizada a Linguagem de Máquina. Um programa denominado Montador traduz um programa de linguagem de montagem para linguagem de máquina. No exercício abaixo é pedido que você faça o trabalho de um Montador.

  1. Codifique o programa abaixo em linguagem de máquina:

E0 
leia cartão e guarde em E15;

E1 
leia cartão e guarde em E14

E2 
se E15 = E12 vá para E6

E3 
some E14 e E13 e guarde em E13

E4 
some E11 e E12 e guarde em E12

E5 
para E2

E6 
imprima E13 

E7 
pare

E8 
            ?

E9 
             ?

E10 
           ?

E11 

E12 
 0 

E13 

E14 
            ?

E15 
             ?

  1. O programa da questão anterior calcula o produto de dois números utilizando somas sucessivas e corresponde ao seguinte programa:
    E0: leia cartão e guarde em E15
    E1: leia cartão e guarde em E14
    E2: multiplique E15 por E14 e guarde em E13
    E3: imprima E13
    E4: pare
    Um possível problema do programa da questão anterior é a dependência de sua eficiência na ordem de entrada dos valores; se os dois valores lidos são 3 e 1000, podem ser feitas 3 somas ou então 1000 somas! Verifique se funciona e codifique em linguagem de máquina a solução proposta pelo Artur:
    E0: leia cartão e guarde em E15
    E1: leia cartão e guarde em E14
    E2: some E11 e E12 e guarde em E12
    E3: se E15>E14 vá para E7
    E4: some E14 e E13 e guarde em E13
    E5: se E15>E12 va para E2
    E6: va para E9
    E7: some E15 e E13 e guarde em E13
    E8: se E14>E12 vá para E2
    E9: imprima E13
    E10: pare
    E11: 1
    E12: 0
    E13: 0

  2. Explique por que  a instrução "se...vá para..." só tem até três opções de comparação (maior, igual, menor) e não pode ter mais (por exemplo: maior ou igual, menor ou igual, diferente).
  3. Quantas instruções especificando dois operandos podemos criar sem problemas de ambiguidade?
  4. Quantas instruções de um operando podemos criar sem problemas de ambiguidade?
  5. Quantas instruções sem operandos (do tipo da instrução "pare") podemos criar?
  6. Quantas combinações de operandos existem para a instrução Some Ei e Ej e guarde em Ek ? Todas elas fazem sentido?
  7. Como que se relacionam o número de "escaninhos" e o número de bits em cada escaninho, no caso acima? Exemplifique.
  8. Quantos bits deveria ter o Contador de Programa do computador acima?
  9. Considere um computador simplificado que possui um registrador "acumulador" e que tenha 32 células de memória. considere que as células têm 10 bits. Considere as seguintes instruções e suas codificações:
  1. Codifique um programa em linguagem de montagem e linguagem de máquina que implementa a seguinte especificação: o programa deve ler dois valores em cartão e imprimir o produto destes dois valores, a implementação não deve usar a instrução de multiplicação e sim somas sucessivas.
  2. Quantas instruções sem operandos (do tipo da instrução "pare") podemos criar?
  3. Como que se relacionam o número de "escaninhos" e o número de bits em cada escaninho, no caso acima? Exemplifique.
  4. Quantos bits deveria ter o Contador de Programa do computador acima?

A maior parte dos programadores utilizam linguagens de alto-nível para expressar os programas. As linguagens de alto-nível possuem instruções ou comandos que têm maior poder de expressão do que as instruções de Linguagem de Máquina ou Linguagem de Montagem e possibilitam melhores abstrações.