Programação em linguagem de máquina. Vamos
criar um computador a que chamaremos de Simpletron.
Como seu nome sugere, ele é uma máquina simples, porém,
como veremos em breve, também é poderosa. O
Simpletron roda programas escritos na única linguagem
que ele entende diretamente — ou seja, a Simpletron
Machine Language, ou SML, para abreviar.
O Simpletron contém um acumulador — um ‘registrador
especial’ em que as informações são colocadas antes
que o Simpletron as utilize em cálculos ou as examine
de diversas maneiras. No Simpletron, toda a informação
é tratada em termos de palavras. Uma palavra é um número
decimal de quatro dígitos com sinal, como +3364,
-1293, +0007, -0001 e assim por diante. O Simpletron
é equipado com uma memória de 100 palavras, e essas
palavras são referenciadas por seus números de local 00,
01, ..., 99.
Antes de executar um programa SML, temos que carregar,
ou colocar, o programa na memória. A primeira instrução
(ou comando) de cada programa SML é sempre
colocada no local 00.
Cada instrução escrita em SML ocupa uma palavra da
memória do Simpletron (e, portanto, as instruções são
números decimais de quatro dígitos com sinal). Consideramos
que o sinal de uma instrução SML é sempre
de adição, porém o sinal de uma palavra de dados pode
ser tanto de adição quanto de subtração. Cada local na
memória do Simpletron pode conter uma instrução, um
valor de dados usado por um programa ou uma área da
memória não utilizada (e, portanto, indefinida). Os dois
primeiros dígitos de cada instrução SML consistem no
código de operação, que especifica a operação a ser realizada.
Os códigos de operação em SML estão resumidos
na Figura 7.32.
Passo 1
- Neste exercício, vamos imaginar que existe um computador chamado Simpletron que usa a Simpletron Machine Language (SML).
- Agora, teremos que escrever um programa um pouco mais complicado. Não é necessariamente mais complicado, mas requer mais memória.
- Este é o programa final que escreveremos na linguagem SML e agora mostraremos como implementar o loop controlado por contagem de forma mais eficiente se o usuário inserir o número de repetições.
A linguagem SML consiste em palavras, que são números decimais de quatro dígitos com sinal. O Simpletron também possui um registrador especial que chamaremos de acumulador.
Os dois primeiros dígitos de cada palavra representam uma operação que o Simpletron deve realizar. Os dois últimos dígitos representam o operando, especificamente o endereço na memória do Simpletron no qual o valor está armazenado.
O Simpletron possui uma memória que pode armazenar até 100100 palavras. A primeira instrução é sempre armazenada na posição 00 e as demais são armazenadas sequencialmente.
Recebemos a tabela de códigos de operação Simpltron Machine Language (SML) na tarefa e você pode usá-los para se familiarizar com os códigos de operação SML. Além disso, você pode analisar os dois exemplos fornecidos na tarefa.
Primeiro, escreveremos um programa SML que usará um loop controlado por sentinela para ler vários inteiros positivos e calcular e exibir sua soma.
Consideraremos qualquer valor negativo como o valor sentinela, o que significa que usaremos o código de operação BRANCHNEG para interromper o loop.
Primeiro, vamos inserir a instrução para LER uma palavra e armazená-la no local 08. Logo em seguida, carregaremos esse valor para o acumulador, para cálculos posteriores.
+1008
+2008
Em seguida, escreveremos o código de operação BRANCHNEG para ramificar para o local 06 se um valor negativo for inserido. Qualquer valor negativo é considerado um valor sentinela que interromperá o loop.
+4106
Agora, escreveremos instruções que serão armazenadas nos locais 03, 04 e 05. Essas serão instruções que adicionarão o número inserido atual à soma total.
Primeiro, escreveremos o código da operação ADD e adicionaremos o valor armazenado no local 09. Este é o local onde armazenaremos a soma.
Em seguida, vamos ARMAZENAR a palavra armazenada no acumulador de volta ao local 09.
Por fim, retornaremos ao local 00 para BRANCH, para continuar o loop e solicitar um novo valor ao usuário.
+3009
+2109
+4000
Agora, estamos no local 06. Este é o local para o qual o programa vai se um valor negativo for inserido (quando o loop termina).
Aqui, escreveremos o valor armazenado no local 09 (a soma), o que significa que exibiremos esse valor para o usuário.
Depois disso, simplesmente escreveremos a operação HALT, que encerrará o programa e exibirá os registradores e o conteúdo da memória.
+1109
+4300
Passo 2
Este programa lerá sete números, positivos e negativos, e calculará e exibirá sua média.
O usuário primeiro precisa digitar o número 77, para que o Simpletron possa calcular o valor médio posteriormente no programa. Esta é a instrução para LER este número e armazená-lo no local 40.
+1040
Na próxima subtarefa, mostraremos como podemos usar esse valor para implementar o loop controlado por contagem de forma mais eficiente.
Por enquanto, vamos ler sete números repetindo as mesmas instruções.
Depois de inserir o número 77, escreveremos as mesmas quatro instruções sete vezes. Uma vez para cada valor a ser inserido.
A primeira instrução irá LER o valor e armazená-lo no local 50. A segunda irá CARREGAR esse valor para a variável do acumulador. O terceiro adicionará o valor armazenado no local 51 (onde armazenaremos a soma) e o último armazenará o novo valor de volta nesse local.
+1050
+2050
+3051
+2151
+1050
+2050
+3051
+2151
+1050
+2050
+3051
+2151
+1050
+2050
+3051
+2151
+1050
+2050
+3051
+2151
+1050
+2050
+3051
+2151
+1050
+2050
+3051
+2151
Você pode ver que as mesmas quatro instruções se repetem sete vezes. Usando essas quatro instruções, adicionamos o valor inserido à soma de todos os números inseridos, que é armazenado no local 51.
Assim que todos os sete valores forem inseridos, escreveremos a instrução LOAD para carregar a soma no acumulador.
Em seguida, escreveremos a instrução DIVIDE com o valor armazenado no local 40. (Armazenamos o número 77 armazenado nesse local)
+2051
+3240
Armazenaremos o resultado de volta ao local 51 e escreveremos esse valor (exibiremos para o usuário).
Finalmente, escreveremos a instrução HALT para encerrar o programa.
+2151
+1151
+4300
Passo 3
Este programa lerá vários valores e determinará o maior deles.
Primeiro, vamos LER o número que representa o número de valores a serem inseridos.
Vamos CARREGAR este valor para o registrador do acumulador.
Então, vamos MULTIPLICAR o valor por si só para obter o valor quadrado.
Armazenaremos o resultado da multiplicação no local 51.
+1050
+2050
+3350
+2151
Essas quatro instruções são usadas para definir o valor de controle do loop para o quadrado do número de valores a serem inseridos. Como sabemos, o valor quadrado de um número é aquele número adicionado a si mesmo n vezes, se n for o valor do número.
Em cada iteração, subtrairemos o valor n armazenado no local 50 do valor de controle do loop armazenado no local 51.
Assim que a variável de controle do loop se tornar 00, saberemos que o número n de valores foi inserido e usaremos o código de operação BRANCHZERO para interromper o loop.
Em seguida, escreveremos a instrução no local 04.
Esta será a instrução READ que lerá o primeiro número e o armazenará no local 60. Vamos CARREGAR esse valor no acumulador logo em seguida.
Então, vamos SUBTRAIR o valor armazenado no local 61 desse valor. (Este é o local onde o maior valor atual será armazenado).
+1060
+2060
+3161
Se o valor atualmente armazenado no acumulador após a subtração for negativo, usaremos o código de operação BRANCHNEG para ir para a instrução no endereço 10. Isso acontecerá se o valor inserido for menor que o maior valor atualmente.
+4110
Se o valor for positivo, significa que o valor inserido é o maior. Vamos CARREGAR esse valor do local 60. Em seguida, vamos armazená-lo no local 61, onde o maior número inserido é armazenado.
+2060
+2161
Agora, escreveremos a instrução no local 10. Este é o local para o qual o programa irá desviar se o valor do acumulador for negativo, indicando que o maior valor permanece inalterado.
Esta parte do programa é usada para atualizar o valor de controle do loop.
Primeiro, vamos CARREGAR o valor armazenado no local 51 (inicialmente o valor quadrado do primeiro número inserido). Então, vamos SUBTRAIR o primeiro número que foi inserido (local 50) desse valor. Armazenaremos o novo valor de volta ao local 51.
+2051
+3150
+2151
Agora teremos duas instruções de ramificação.
O primeiro usa o código de operação BRANCHZERO para desviar para o local 15 se o valor no local 51 (valor de controle de loop) for zero. Como explicamos, se este for o caso, o número desejado de valores foi inserido e é hora de exibir o maior valor.
+4215
A segunda utiliza o código de operação FILIAL para ramificar para o local 04, onde começa a entrada de um novo número. Esta é a única instrução que a instrução de ramificação anterior ignorará quando todos os valores forem inseridos.
+4004
Vamos ESCREVER (exibir) o valor no local 61, que é o maior valor que foi inserido.
A instrução HALT é a última e encerra o programa.
+1161
+4300
Resposta
Ver o desenvolvimento.