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

  1. Neste exercício, vamos imaginar que existe um computador chamado Simpletron que usa a Simpletron Machine Language (SML).
  2. 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

  3. Agora, teremos que escrever um programa um pouco mais complicado. Não é necessariamente mais complicado, mas requer mais memória.
  4. 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

  5. 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.

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.