Defina um conjunto de instruções para fazer o Computador Simplificado (CS) ler um conjunto indeterminado de valores em cartões, calcular e imprimir a sua soma. O último cartão, que não deverá entrar nos cálculos tem o valor igual a -1 .

Passo 1

Beleza, o problema pede um “programinha” para o nosso Computador Simplificado (CS) que:
  1. Vai ler um número indefinido de valores em cartões.
  2. Para cada valor lido (exceto o último), acumula numa soma.
  3. O último cartão tem valor (sentinela) e não entra na soma – serve só pra gente parar a leitura.
    Conteúdo da matéria: laços de repetição controlados por sentinela, uso de acumulador e instruções de comparação/desvio. Vamos precisar de:
  • Um registrador acumulador (ACC) para fazer soma e testes.
  • Instruções de leitura (INP), escrita (OUT), carga/armazenamento (LDA/STA), operações aritméticas (ADD/SUB) e desvio condicional (BRZ) e incondicional (JMP).
  • Duas posições de memória: uma pra guardar a soma e outra pra guardar o valor lido.

Passo 2

Inicialização da soma.
  1. Temos uma variável SUM em memória.
  2. Carregamos 0 no ACC e armazenamos em SUM.
    Instruções:
    LDA 0 ; ACC ← 0
    STA SUM ; SUM ← ACC

Passo 3

Rotina de leitura e teste da sentinela.
  1. Rótulo LOOP marca o começo do laço.
  2. Leio o próximo cartão: INP põe o valor em ACC.
  3. Armazeno em INPUT: STA INPUT.
  4. Testo se é : faço SUB ONE, onde ONE contém .
    Se ACC = 0, significa que o valor lido era exatamente .
  5. Uso BRZ END para sair do laço.
    Instruções nesse passo:
    LOOP:
    INP ; ACC ← próximo cartão
    STA INPUT ; INPUT ← ACC
    SUB ONE ; ACC ← ACC – (–1) = valor + 1
    BRZ END ; se ACC = 0 (valor = –1), vai pra END

Passo 4

Acumular o valor quando não for sentinela.
  1. Carrego a soma atual: LDA SUM.
  2. Somo o que está em INPUT: ADD INPUT.
  3. Armazeno de volta em SUM: STA SUM.
  4. Volto pro início do laço: JMP LOOP.
    Instruções:
    LDA SUM
    ADD INPUT
    STA SUM
    JMP LOOP

Passo 5

Fim do programa e saída.
  1. Rótulo END chega quando lemos .
  2. Carrego SUM no ACC e mando pra saída:
    LDA SUM
    OUT ; imprime ACC
  3. Finalizo com HLT.

Resposta

Segue o programa completo em pseudo‐linguagem do CS, com as posições de memória (os números depois de cada rótulo são só identificadores de dado):
         LDA 0
         STA SUM

LOOP:    INP
         STA INPUT
         SUB ONE
         BRZ END

         LDA SUM
         ADD INPUT
         STA SUM
         JMP LOOP

END:     LDA SUM
         OUT
         HLT

; Dados
ONE     .DATA -1
SUM     .DATA 0
INPUT   .DATA 0

Exercícios relacionados