Консультация № 192342
08.01.2018, 14:50
0.00 руб.
0 13 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

Имеется программа Comp Model. Необходимо выполнить следующее задание:
Ввод десятиразрядных чисел в ячейки ОЗУ.
Пояснения: программа должна обеспечивать ввод
последовательности ASCII-кодов (символов) десятичных
цифр (не длиннее десяти), перекодировку в “8421”, упаковку
в десятичное число (первый введенный символ – старшая
цифра) и размещение в ячейке ОЗУ. ASCII-коды (символы)
не-цифр игнорировать.

Заранее благодарен. С а\уважением, Дмитрий.

Обсуждение

давно
Посетитель
7438
7205
08.01.2018, 15:12
общий
Адресаты:
Самостоятельно решить не пробовали?
Попутно ответьте на несколько вопросов:
1) Числа в CompModel имеют не более 5 разрядов. Как и куда Вы предполагаете ввод десяти цифр?
2) Что понимается под перекодировкой в “8421”?
3) В каком режиме используется клавиатура?
4) Настоятельно рекомендуется предоставление своей версии решения задачи...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
08.01.2018, 15:57
общий
Адресаты:
Имейте в виду, без активного сотрудничества с Вами, программу Вы не получите.
Хотите программу, давайте работать вместе.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401683
6
08.01.2018, 18:54
общий
1) с замечанием согласен, преподаватель выдал некорректное задание. таким образом пусть максимальное число для данного задания будет =5.
2) прикрепляю картинку ниже. ( 8421 - это одна из разновидностей двоичного кода). таким образом: 2^3=8, 2^2=4, 2^1=2, 2^0=1 (отсюда получается 8421).
3) на данный вопрос ответ дать пока что не могу. пусть будет любой режим ,который позволяет программе корректно работать.
4) мой вариант без перекодировки в 8421:

RD #0 ;сначала будет 0
wr R1 ;здесь будем накапливать наше число
RD #5 ;максимум 5 цифр
wr R5 ;сохраним
RDI #101 ;команда очистки буфера
out 1 ; для клавиатуры
RDI #102 ; команда сброса ошибки
out 1 ; для клавиатуры
RDI #10 ; команда разрешения МВУ
OUT 1 ; для клавиатуры без прерываний (по опросу)
RDI #103 ; команда установки посимвольного ввода
out 1 ; для клавиатуры
LOOP:IN 2 ; читаем регистр состояния клавиатуры
DIV #10 ; делим на 10, чтобы второй разряд готовности стал в первом разряде
WR R3 ; сохраним
DIV #2 ; разделим на 2
MUL #2 ; умножим на 2
SUB R3 ; отнимем сохранное
JZ LOOP ; если четное, то нет кода в буфере, идем на цикл
IN 0 ; считываем код с клавиатуры
wr R2 ; сохраним
jz SAVE ; было просто нажатие на "Завершить ввод"
sbi #48 ; <'0' ;проверим на цифру
js RESET ; игнорируем, на сброс клавиатуры
sbi #10 ; >'9'
jns RESET ; игнорируем, на сброс клавиатуры
adi #10 ;восстановим число 0-9
wr r2 ; сохраним
rd r1 ; наше число
mul #10 ; умножаем на 10
add r2 ; добавляем введенный символ
wr r1 ; и на сохранение
jrnz r5,RESET ; ждем максимум 5 цифр
SAVE:rd #100 ;адрес ячейки, куда запишем результат
wr r0 ; будем адресовать через R0
rd r1 ; введенное число
wr @r0 ; сохраняем в памяти
hlt ; останов
RESET:RDI #101 ; команда сброса
out 1 ; в клавиатуру
RDI #103 ; команда установки посимвольного ввода (сбрасывается при сбросе)
out 1 ; в клавиатуру
jmp LOOP ; на чтение состояния клавиатуры
Прикрепленные файлы:
c357a6babf6f249ebcd218fb64335569.JPG
давно
Посетитель
7438
7205
08.01.2018, 19:14
общий
Адресаты:
Все равно, до конца не понял, что требуется... Итак, по пунктам:
1) программа должна обеспечивать ввод последовательности
ASCII-кодов (символов) десятичных цифр (не длиннее десяти)
Т.е. вводим коды '0'-'9'. Договорились, что до 5 цифр.

2) перекодировка в “8421”
Так понимаю, надо получить двоичное представление каждой введенной цифры,
предварительно приведенной к виду 0-9. Правильно?
И где хранить это двоичное представление? Начиная с какого-то адреса в памяти? Или как?
Непонятно, при чем тут 8421-кодировка? Просто, чтобы сделать?

3) упаковку в десятичное число (первый введенный символ – старшая
цифра) и размещение в ячейке ОЗУ
Типа получение из последовательности цифр числа, например, ввели "123" - получаем число 123
Так?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401683
6
08.01.2018, 19:31
общий
1) по первому пункту до 5
2) да нужно получить двоичное представление каждой введенной цифры. хранить с адреса в памяти. кодировка 8421 нужно просто чтобы сделать, как вы и сказали.
3) именно так да.

давно
Посетитель
7438
7205
08.01.2018, 19:44
общий
Адресаты:
Ок, сделаю завтра. Сегодня некогда. Заодно проверю Ваш код...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401683
6
08.01.2018, 19:56
общий
Заранее спасибо.
P.S. Не забывайте что мой код без перекодировки в 8421.
давно
Посетитель
7438
7205
09.01.2018, 21:35
общий
Адресаты:
Голубчик, это не Ваш код. Это - мой код. Из вопроса 190277
Один в один... Без зазрения совести назвали своим кодом... Даже помогать расхотелось...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401683
6
09.01.2018, 21:45
общий
Нехорошо получилось. Данный код мне предоставил один товарищ, которого я так же попросил помочь мне и выходит, что выдал его за свой...
Я дико извиняюсь перед Вами... Но может все таки возможно возобновить наше сотрудничество. Очень неудобно перед Вами. Еще раз прошу прощения, что я проглядел(
давно
Посетитель
7438
7205
09.01.2018, 21:56
общий
Адресаты:
Что значит "проглядел"? Даже, если код взят у товарища, уже не Ваш...
Впрочем, может и ошибаюсь... Может вариант в вопросе и не мой... Давненько было. В любом случае - не Ваш...
Но уж больно комменты на мои похожи...

Ладно, сделаю, но уже не сегодня...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401683
6
09.01.2018, 21:58
общий
Огромное спасибо.
давно
Посетитель
7438
7205
18.01.2018, 11:53
общий
это ответ
Здравствуйте, Дмитрий!
Программа делает следующее:
1) клавиатура настраивается на ввод всей строки целиком. ввод завершается нажатием на "конец ввода"
2) любой символ-нецифра прерывает ввод числа из строки, также, как и "конец ввода" и превышение 5 цифр
3) введенное число сохраняем в ячейке 80
4) двоичное представление каждого введенного разряда сохраняем в памяти в обратном порядке! Разряды сохраняем в виде строки символов-цифр '0','1' (48,49). Адрес строки 8421-кода - 90
Обратный порядок вывода, т.к. последовательно определяем биты, начиная с младшего. Строка завершается нулем.
[code lang=asm h=200]RD #0 ;сначала будет 0
wr R8 ;здесь будем накапливать наше число
RD #5 ;максимум 5 цифр
wr R5 ;сохраним
rd #94 ;адрес 8421-представления (адрес за младшим битом первой цифры)
wr r0 ;в r0

RDI #101 ;команда очистки буфера
out 1 ; для клавиатуры
RDI #102 ; команда сброса ошибки
out 1 ; для клавиатуры
RDI #10 ; команда разрешения МВУ
OUT 1 ; для клавиатуры без прерываний (по опросу)

LOOP:IN 2 ; читаем регистр состояния клавиатуры
SBI #10 ; если состояние 10, то есть код, отняв 10, проверим на 0
JNZ LOOP ; если исходное состояние не 10, то нет кода в буфере, идем на цикл

GET:IN 0 ; считываем код с клавиатуры
jz SAVE ; конец строки по "Завершить ввод"

sbi #48 ; <'0' ;проверим на цифру
js SAVE ; по любой нецифре заканчиваем ввод
sbi #10 ; >'9'
jns SAVE
adi #10 ;восстановим число 0-9
wr r2 ; сохраним

rd r8 ; наше число
mul #10 ; умножаем на 10
add r2 ; добавляем введенный разряд
wr r8 ; и на сохранение

call c8421 ;віведем 8421 цифры в r2 по адресу в r0

jrnz r5,GET ; на анализ следующего знака (ждем максимум 5 цифр)

SAVE:rdi #0
wr @r0

rd #80 ;адрес ячейки, куда запишем результат
wr r0 ; будем адресовать через R0
rd r8 ; введенное число
wr @r0 ; сохраняем в памяти

hlt ; останов

;выведем цифру в виде двоичного кода
c8421:
rdi #4 ;4 бита
wr r7 ;счетчик бит
rd r2 ;наше число

bin_loop: ;цикл по формированию цифр-бит числа
div #2 ;делим на 2
wr r6 ;сохраним частное для дальнейшего расчета
mul #2 ;и умножим на 2, тем самым обнулим младший бит!
sub r2 ;и сравним с изначальным
jz digit0 ;если равны, то младший бит - 0
;неравны, младший бит - '1'
rdi #49 ;код символа-цифры '1'
jmp save_digit ;на сохранение
digit0: ;равны
rdi #48 ;код символа-цифры '0'
save_digit:
wr -@r0 ;сохраняем в памяти в обратном порядке, перед сохранением уменьшаем указатель r0 на 1
rd r6 ;остальные биты числа
wr r2 ;сохраним для анализа на четность
jrnz r7,bin_loop ;пока не выведем все биты
rd r0 ;сдвинем указатель в конец средующей группы бит
adi #8
wr r0
ret
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
18.01.2018, 13:58
общий
Адресаты:
Обратите внимание: внес изменения в код...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа