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:
- leia Cartão e guarde em Ei: 111 00000000
IIII
- copie
Ei em Ej: 111 0001 IIII
JJJJ
- some(subtraia,
multiplique,...) Ei e Ej e guarde em Ek: yyy IIII JJJJ KKKK
some yyy=000;
subtraia yyy=001; multiplique yyy=010; divida yyy=011;
- vá para Ei: 111 00000001 IIII
- se Ei (maior, menor, maior ou
igual,...) Ej vá para Ek: yyy IIII JJJJ KKKK
maior yyy=100; igual yyy=101; menor=110;
- imprima
Ei: 111
00000010 IIII
- pare: 111 00000011 0000
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.
- 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
vá para E2
|
E6
imprima E13
|
E7
pare
|
|
E8
?
|
E9
?
|
E10
?
|
E11
1
|
|
E12
0
|
E13
0
|
E14
?
|
E15
?
|
- 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
- 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).
- Quantas instruções especificando dois
operandos podemos criar sem problemas de ambiguidade?
- Quantas instruções de um operando podemos
criar sem problemas de ambiguidade?
- Quantas instruções sem operandos (do tipo
da instrução "pare") podemos criar?
- Quantas combinações de operandos existem
para a instrução Some Ei e Ej e guarde em Ek ? Todas
elas fazem sentido?
- Como que se relacionam o número de
"escaninhos" e o número de bits em cada escaninho, no caso
acima? Exemplifique.
- Quantos bits deveria ter o Contador de
Programa do computador acima?
- 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:
- leia cartão; ( o valor do cartão é
guardado no acumulador): 00000 00000
- carregue Ei; (o conteúdo da posição Ei é
guardado no acumulador) 00001 IIIII
- armazene Ei; (o conteúdo do acumulador é
guardado na posição Ei) 00010 IIIII
- some (subtraia, multiplique,...) Ei (o
conteúdo do acumulador é somado com o conteúdo de Ei e guardado no
acumulador) 110 yy IIIII
some yy=00; subtraia yy=01; multiplique yy=10; divida
yy=11;
- vá
para Ei; 00011 IIII
- se acumulador maior(menor, igual,...) que 0 (zero) vá para Ej: 111 yy IIIII
maior
yy=00; menor yy=01; igual yy=10;
- imprima; (imprime o valor do acumulador) 00000 00001
- pare; 00000 00010
- 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.
- Quantas instruções sem operandos (do tipo
da instrução "pare") podemos criar?
- Como que se relacionam o número de
"escaninhos" e o número de bits em cada escaninho, no caso acima?
Exemplifique.
- 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.