Estou tentando resolver este desafio de código:
Escreva um programa LMC que calcule a soma dos números fornecidos pelo usuário. Exiba a soma como saída antes de interromper o programa. Se o usuário forneceu menor ou igual a dez valores de entrada, some apenas os números pares. Os números ímpares são ignorados. Se o usuário tiver fornecido mais de dez valores, some apenas os números ímpares subsequentes à décima entrada. A soma existente de números pares permanecerá. Se o usuário inserir zero, em qualquer ponto, o somatório será exibido.
Por exemplo:
Valores de entrada: 3, 3, 4, 0
Resultado: 4Valores de entrada: 2, 3, 7, 0
Resultado: 2Valores de entrada: 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 0 Resultado:
43
Aqui você pode ver uma execução do meu programa com a entrada do primeiro exemplo e mostra a saída como 0 (em vez do 4 esperado):
Não tenho certeza do que há de errado com o código para fornecer essa saída errada. Onde está o meu erro?
Código:
start
INP
STA input
BRZ halt
LDA inputCounter
SUB ten
BRP afterTen
// Input <= 10
LDA input
STA isEven
SUB one
BRP oddNumber
LDA isEven
ADD one
STA isEven
SUB two
BRZ evenNumber
oddNumber LDA inputCounter
ADD one
STA inputCounter
BRA start
evenNumber LDA input
ADD evenSum
STA evenSum
LDA inputCounter
ADD one
STA inputCounter
BRA start
// Input > 10
afterTen LDA input
STA isEven
SUB one
BRP evenAfterTen
LDA isEven
ADD one
STA isEven
SUB two
BRZ oddAfterTen
evenAfterTen LDA inputCounter
ADD one
STA inputCounter
BRA start
oddAfterTen LDA input
ADD oddSum
STA oddSum
LDA inputCounter
ADD one
STA inputCounter
BRA start
// Display sum
halt LDA evenSum
ADD oddSum
OUT
HLT
// Variables
evenSum DAT 0
oddSum DAT 0
inputCounter DAT 0
isEven DAT 0
input DAT 0
// Constants
one DAT 1
two DAT 2
ten DAT 10
O problema está na parte que verifica se um número é par. Esse código primeiro subtrairá 1 e, se essa instrução não levar a um overflow negativo, conclui-se que o número é ímpar! Obviamente, isso não é (sempre) verdade. Por exemplo, se você começar com 2, concluirá erroneamente que é estranho.
Para testar se um número é ímpar, você precisaria (sob as limitações do LMC) de um loop onde subtrai repetidamente o número 2 até chegar a zero ou obter um estouro negativo.
Como você tem um código semelhante na segunda metade do seu código, o problema se repete lá também.
Aqui está uma correção:
Observações
Não há necessidade de um arquivo
evenSum
eoddSum
. Você pode simplesmente adicionar ao mesmo arquivosum
.Há alguma repetição de código: dois trechos de código realizam um teste par/ímpar. Você pode evitar essa repetição adicionando 1 ao
isEven
lidar com as entradas após as dez primeiras, e então você pode usar o mesmo código para realizar o teste ímpar/par, pois adicionando 1 você inverte o resultado.Como o Little Man Computer possui um recurso de redefinição, que reinicia o programa sem redefinir o conteúdo da caixa de correio para seus valores originais (incluindo
DAT
), você obteria uma saída inconsistente, pois em particular as "variáveis"evenSum
eoddSum
não seriam redefinidas. Para evitar isso, adicione instruções para definir a(s) soma(s) como zero logo no início do programa.Aqui está o código com essas melhorias: