Я пытаюсь написать программу Little Man Computer, которая выводит, сколько положительных чисел у меня есть и сколько отрицательных чисел у меня есть, но она также считает отрицательные числа положительными.

Это то, что у меня до сих пор:

LOOP IN 
     STO NUM
     BRZ END
     BRP POS
POS  LDA ZERO 
     ADD UN 
     STO ZERO 
END  LDA ZERO
     OUT 
     BR LOOP
     HLT
NUM  DAT 000
UN   DAT 001
ZERO DAT 000
1
Bianca Bica 19 Ноя 2019 в 23:13
Каков вывод вышеупомянутой программы, в основном вам нужно будет написать парсер, который будет анализировать ваши команды и выяснять вывод
 – 
zenwraight
19 Ноя 2019 в 23:19
1
 – 
JohanC
20 Ноя 2019 в 01:24
Это приемлемый симулятор? peterhigginson.co.uk/lmc
 – 
JohanC
20 Ноя 2019 в 01:28
Насколько я понимаю, с помощью Little Man Computer нельзя вводить отрицательные числа, определены только значения в диапазоне 0 ... 999.
 – 
trincot
20 Ноя 2019 в 08:54

1 ответ

Лучший ответ

Предоставление LMC отрицательного входа не поддерживается спецификацией. Ячейки памяти LMC могут содержать только значения от 0 до 999 (источник: Википедия). Единственное понятие «отрицательный» представлено флагом отрицательный LMC. И этот флаг устанавливается только при выполнении ADD или SUB, а не INP / IN , LDA или STA / STO (написание различается). См. Также эти заметки Яна! Д. Аллен, где он обсуждает эту сбивающую с толку концепцию.

Практически это означает, что ваша инструкция BRP всегда будет переходить к предоставленной метке.

Вы можете найти симуляторы, которые действительно допускают отрицательный ввод, но это будет расширением исходных спецификаций.

Теперь у вашего кода также есть проблема с этой инструкцией BRP POS, потому что она просто переходит на следующую строку (помеченную POS), поэтому на самом деле не будет никакой разницы, будет ли BRP ветвиться или нет: это не операция.

Аналогичное упражнение

Поскольку на самом деле отрицательных значений в LMC не существует, давайте выполним упражнение немного иначе: рассмотрим ввод, представленный в виде дополнения до 10, так что 500..999 следует рассматривать как отрицательные значения (например, -500 ...- 1) . Или, когда вы сделаете INP, входные значения со знаком будут фактически сохранены в десятичном дополнении. Затем подсчитайте количество входов, которые меньше 500 (положительные), и те, которые нет (поскольку они отрицательны, когда интерпретируются как 10-дополнение).

LOOP    INP
        BRZ FINISH
        SUB COMPARE
        BRP ELSE
        LDA LESS
        ADD ONE
        STA LESS
        BRA LOOP
   ELSE LDA NOTLESS
        ADD ONE
        STA NOTLESS
        BRA LOOP
 FINISH LDA LESS
        OUT
        LDA NOTLESS
        OUT
        HLT
   LESS DAT
NOTLESS DAT
COMPARE DAT 500
    ONE DAT 1
    
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.6/lmc.js"></script>

Обязательно укажите окончательное значение 0, чтобы программа выводила результат.

1
trincot 2 Дек 2019 в 19:40