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:
- Vai ler um número indefinido de valores em cartões.
- Para cada valor lido (exceto o último), acumula numa soma.
- 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.
- Temos uma variável
SUM
em memória. - 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.
- Rótulo
LOOP
marca o começo do laço. - Leio o próximo cartão: INP põe o valor em ACC.
- Armazeno em
INPUT
: STA INPUT. - Testo se é
: faço SUB ONE, onde ONE contém .
Se ACC = 0, significa que o valor lido era exatamente. - 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.
- Carrego a soma atual: LDA SUM.
- Somo o que está em INPUT: ADD INPUT.
- Armazeno de volta em SUM: STA SUM.
- 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.
- Rótulo
END
chega quando lemos. - Carrego SUM no ACC e mando pra saída:
LDA SUM
OUT ; imprime ACC - 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