Member 13976376 Ответов: 1

Симулятор процессора - push и Pop помочь.


В настоящее время я работаю с CpuSimulator, и я борюсь с приведенными ниже инструкциями, так что некоторая помощь будет очень признательна.

"Введите программу, которая считывает числа из IO (input), записывает их в IO и сохраняет их в стеке (PSH), пока пользователь не введет число 0. Затем выведите числа в обратном порядке по сравнению с тем, как они были введены, используя то, что хранится с помощью (POP). Число 0 не должно храниться в стеке. Обязательно выскакивайте столько раз, сколько вы нажали, иначе у вас возникнут проблемы с задачей 17 (основная программа и подпрограммы)."

Мой текущий код выглядит следующим образом:

@печатать:

CPY R0 IO

ПШ РО

JNZ R0 @print

Это все, что я сделал, и я был бы очень признателен, если бы вы помогли мне разобраться, как это сделать.:

а) заставьте его остановиться на 0 без того, чтобы 0 появился в стеке

Б) как/когда толкать и хлопать

в) как распечатать стек в выходной журнал

Заранее спасибо.

Что я уже пробовал:

Я написал код выше, и я не смог продолжить дальше.

1 Ответов

Рейтинг:
0

OriginalGriff

а) просто: тестируйте до того, как вы нажмете, а не после. В данный момент Вы читаете значение, нажимаете на него, а затем решаете повторить. Вам нужно прочитать его, проверить, если он равен нулю, выйти из цикла, в противном случае нажать и снова пойти по кругу.
б) я совсем не знаком с ассемблерным кодом, поэтому не могу быть точным. Но... есть только два способа вытащить столько предметов, сколько вы нажмете:
b.1) Проверьте дно стека, прежде чем поп-музыки. Если вы там, он пуст, и вы не должны больше хлопать. Чтобы это работало правильно, вам нужно будет сохранить начальный указатель стека перед первым нажатием и проверить его.
Б.2) Используйте счетчик, чтобы вы знали, сколько предметов вы толкнули. Затем вы можете сбросить этот номер.

Второй подход, вероятно, проще.
в) понятия не имею, я подозреваю, что ваш процессор / ассемблер немного придуман специально для вашей домашней работы! Это будет где-то в наборе инструкций, который дал тебе учитель. Если бы мне пришлось гадать, я бы предположил, что это что - то вроде

CPY   IO   R0
но это может быть совершенно неправильно.


Member 13976376

Спасибо за ваш ответ. Это действительно много значит, так как я пытаюсь обернуть свою голову вокруг этого, чувствуя себя совершенно бесполезным, ха-ха.

Я понимаю, что вы говорите о тестировании, если это ноль, чтобы выйти из цикла перед толчком, но после удаления PSH R0 и опробования некоторых различных мест для него, и удаления его полностью ничего не появляется в стеке вообще. Я думаю, что главная проблема, с которой я сталкиваюсь, заключается в том, где выполнять команды push и pop.

OriginalGriff

Вам нужны две метки и две инструкции "прыгать" :

@PushLoop:
Получить это.
Проверить его
Если это ноль, переходите к @EndPushLoop
Толкать его
Считать это
Перейти к @PushLoop
@EndPushLoop:
// Продолжайте и печатайте их!

В этом есть смысл?

Member 13976376

Еще раз большое вам спасибо за то, что помогли мне понять.

Я понимаю концепцию петель и то, что они делают. В основном, если входной сигнал равен 0, он переходит вниз к @EndPushLoop, а если нет, то он зацикливается
@PushLoop, чтобы он снова попросил пользователя ввести значение.

Код, который у меня есть на данный момент, таков, но я упускаю из виду "проверить его", как вы написали, а также "подсчитать его". Мне также нужно распечатать стек, но я думаю, что главным приоритетом будет правильно получить толчок и хлопки.

Я опубликую скриншот симки вместе с кодом ниже:

https://gyazo.com/d5a711a2e049c5390de713cd5987be41

OriginalGriff

Нет, я делаю это не для тебя! :смеяться:
У вас есть идея, поэтому реализация должна быть довольно простой: возможно, инструкция CPY устанавливает флаг Z, поэтому вы можете использовать что-то вроде JZ сразу же после прочтения значения. Загляните в описание и убедитесь.

Member 13976376

Хорошо, ха-ха. Я не стану лучше, если позволю тебе закончить его за меня, так что я ценю то, что ты говоришь. Спасибо вам за Ваш вклад, я постараюсь разобраться в этом, чтобы, Надеюсь, у меня был мирный пятничный вечер, ха-ха.

OriginalGriff

Я рад, что вы так думаете - есть вааай слишком много людей, для которых просто сделать это для них очень важно. :вздох:

Имейте голос за попытку!