Консультация № 194125
07.12.2018, 23:12
0.00 руб.
0 3 1
Здравствуйте! Прошу помощи в следующем вопросе:
Учебная модель ЭВМ. Жмакина.
В памяти размещен массив чисел – кодов ASCII. Отобразить на мониторе все цифры из этого массива.

Логически понятно, что по таблице ascii нужно выводить на монитор только коды с 48 по 57, а остальное отсеивать.

Сам пытался, но дело дальше этого не ушло, совсем не пойму как можно реализовать вывод только цифр.
Код:

RD #11 ; включаем дисплей и устанавливаем
OUT 11 ; флаг автоинкремента;
RD #0 ; задаём начальный адрес
OUT 13 ; выводимого слова;
RD 50 ; с какого адреса читаем в памяти
WR R0 ; пишем как адрес начала R0
OUT 10 ; после каждого слова вывод на дисп.


RD #14
WR R2 ; R2 - как счетчик


Заранее благодарен.

Обсуждение

давно
Посетитель
402562
2
08.12.2018, 05:25
общий
Немного доделал код, присутствует вывод из необходимых ячеек памяти, здесь это - 40(000-001 и т.д), присутствует счётчик повторений. Вывод на дисплей работает. Но пока все равно не получается выполнить проверку на соответствие промежутку 48-57.

Код:

CALL NEW

rd #0
WR R3 ;min positive number (0 not found)
RD #40
WR R0 ;R0 - address
RD #3 ; задаем счетчик
WR R2 ;R2 - колво повторов

;search first min
M1:RD @R0+ ;a = number
;JZ M2
OUT 10 ; вывод на дисп.
M2:JRNZ R2,M1 ;first



NEW:
; БЛОК ОЧИСТКИ ДИСПЛЕЯ
RD #101
OUT 11
RD #102
OUT 11
; КОНЕЦ БЛОКА ОЧИСТКИ

; БЛОК ПОДГОТОВКИ ДИСПЛЕЯ
RD #11 ; включаем дисплей и устанавливаем
OUT 11 ; флаг автоинкремента;
RD #0 ; задаём начальный адрес
OUT 13 ; выводимого слова;
RET ; возврат
; КОНЕЦ ПОДГОТОВКИ ДИСПЛЕЯ
давно
Посетитель
7438
7205
08.12.2018, 13:29
общий
это ответ
Здравствуйте, lmk!
Это замечательно, что пытаетесь сделать самостоятельно
Вот Вам исправленная программка. Чуток добавил, подчистил...
[code lang=asm]CALL NEW
RD #40
WR R0 ;R0 - address
RD #3 ; задаем счетчик
WR R2 ;R2 - колво повторов

M1:RD @R0+ ;a = number
WR R3 ;сохраняем
SBI #48 ;<'0' ?
JS M2 ; да - на следующее
RD R3 ;восстанавливаем наше число
SBI #58 ;>='9'
JNS M2 ;да - на следующее
RD R3 ;имеем цифру! Она сохранена в регистре R3
OUT 10 ; вывод на дисп.
M2:JRNZ R2,M1 ;по всем числам

HLT ;останавливаемся!

NEW:
; БЛОК ОЧИСТКИ ДИСПЛЕЯ
RD #101
OUT 11
RD #102
OUT 11
; КОНЕЦ БЛОКА ОЧИСТКИ
; БЛОК ПОДГОТОВКИ ДИСПЛЕЯ
RD #11 ; включаем дисплей и устанавливаем
OUT 11 ; флаг автоинкремента;
RD #0 ; задаём начальный адрес
OUT 13 ; выводимого слова;
RET ; возврат
; КОНЕЦ ПОДГОТОВКИ ДИСПЛЕЯ
[/code]
5
Спасибо вам огромное!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
402562
2
08.12.2018, 17:00
общий
Upd 2:
Поправил некоторые моменты, добавил заполнение в 60 адрес памяти коды ASCII с 48 по 57. Стоит ограничитель (10), чтобы заполнение чисел не пошло дальше. После заполнения чисел он переходит к считыванию чисел из 40 адреса по порядку и выводу их на экран, для теста поставил, чтобы выводило по очереди только 3 значения из памяти.
Предполагаю, что необходимо в цикле числа из 60 адреса памяти (эталонные ASCII цифры с 0 до 9) сравнивать с тем, что вручную будет вбито в 40 адрес, после чего делать вывод выводить число в дисплей или нет.

Код:

CALL NEW

CALL ADDING_NUMS

;rd #0
;WR R3 ;min positive number (0 not found)
RD #40
WR R0 ;R0 - address
RD #3 ; задаем счетчик
WR R2 ;R2 - колво повторов

;search first min
M1:RD @R0+ ;a = number
;JZ M2
OUT 10 ; вывод на дисп.
M2:JRNZ R2,M1 ;first


NEW:
; БЛОК ОЧИСТКИ ДИСПЛЕЯ
;RD #101
;OUT 11
;RD #102
;OUT 11
; КОНЕЦ БЛОКА ОЧИСТКИ

; БЛОК ПОДГОТОВКИ ДИСПЛЕЯ
RD #11 ; включаем дисплей и устанавливаем
OUT 11 ; флаг автоинкремента;
RD #0 ; задаём начальный адрес
OUT 13 ; выводимого слова;
RET ; возврат
; КОНЕЦ ПОДГОТОВКИ ДИСПЛЕЯ


ADDING_NUMS:
; МОДУЛЬ ЗАПОЛНЕНИЯ ЧИСЕЛ ASCII (от 0-9)

RD #60 ; использ 40
WR R8 ;R0 - адресс
RD #10 ; задаем счетчик
WR R9 ;R9 - колво повторов

RD #48
WR R7;

;Процедура добавления в #40
ADD1:

WR R7
WR @R8+ ;a = number
ADD #1

JRNZ R9,ADD1 ;first
RET ; возврат
; КОНЕЦ ЗАПОЛНЕНИЯ

;finish
ENDING:
HLT
Прикрепленные файлы:
5e07e7602f51aa329085c0c868154744.jpg
Форма ответа