Консультация № 192084
10.12.2017, 13:47
0.00 руб.
0 6 1
Здравствуйте, уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Программа CompModel Жмакина
Задание: подключить клавиатуру и дисплей. На клавиатуре в произвольном порядке набирать символы (буквы, цифры), на дисплее должно отображаться только наибольшее число. Наибольшим числом считаются подряд идущие цифры. Например, в последовательности "ad5pm23tio" наибольшим числом будет 23.

Заранее благодарю!

С уважением,
Ярослав.

Обсуждение

давно
Посетитель
7438
7205
11.12.2017, 18:59
общий
Адресаты:
Здравствуйте, Ярослав!
Самостоятельно сделать не пробовали? Программка уже достаточно неочевидная
Т.е. можно сделать вывод, что до этого как-то программки писались, или нет?
Пробуйте, покажите свои наработки (пусть и ошибочные), подправим.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401594
2
13.12.2017, 10:09
общий
Игорь Витальевич, знаю только как выводить символы с клавиатуры на дисплей:
RDI #10
OUT 1
OUT 11
давно
Посетитель
7438
7205
13.12.2017, 11:00
общий
Адресаты:
Скажем прямо, не густо
Ну да ладно, сделаю... Правда, как только будет время. Пока занят.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
401594
2
13.12.2017, 14:05
общий
Адресаты:
Заранее благодарен
давно
Посетитель
7438
7205
20.12.2017, 13:42
общий
это ответ
Здравствуйте, Yaroslav!
Смотрите комментарии.
С клавиатуры вводим всю строку сразу, затем ее разбираем, т.е. ищем подстроку- максимальное число,
которую потом и выводим.
[code lang=asm h=220]RDI #101 ;команда очистки буфера
out 1 ; для клавиатуры
RDI #102 ; команда сброса ошибки
out 1 ; для клавиатуры
RDI #10 ; команда разрешения МВУ
OUT 1 ; для клавиатуры без прерываний (по опросу)

RD #101 ;команда очистки дисплея
OUT 11 ;в регистр CR
RD #11 ;разрешаем дисплей с автоинкрементом адреса
OUT 11 ;в регистр CR

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

;анализируем введенную строку
;инициируем необходимые регистры
RDI #110
WR R0 ;здесь будет адрес строки цифр, максимального числа
RDI #120
WR R1 ;здесь будет адрес текущей строки цифр
RDI #0
WR R2 ;значение максимального числа
WR R3 ;значение текущего числа
WR R4 ;длина строки максимального числа
WR R5 ;длина строки текущего числа

LOOP1:IN 0 ; считываем код с клавиатуры
jz FINISH ;пока не введем все символы

sbi #48 ;проверим на цифру
js NODIG ;<0 - нецифра
WR R6 ;сохраним число 0-9
sbi #10 ;проверим на 0-9
jns NODIG ;>9 - нецифра

;введена цифра, добавим десятичный разряд к текущему числу
RD R5 ;инкремент длины строки текущего числа
ADI #1
WR R5
RD R6 ;превратим в символ для вывода
adi #48
WR @R1+ ;сохраним в буфере строки текущего числа
RD R3 ;предыдущее значение умножаем на 10
MULI #10
add R6 ;и добавляем текущий разряд 0-9
WR R3 ;сохраним текущее значение
JMP LOOP1 ;на получение очередного кода

;введена нецифра
NODIG:
RD R5 ;было ли перед этим введено число?
JZ LOOP1 ;не было ничего - на получение очередного кода
CALL NEWMAX ;сравним с максимальным, и если что, сохраним, как новое максимальное
jmp LOOP1 ;на получение очередного кода

;последовательность кодов закончилась
FINISH:
RD R5 ;было ли последним введено число?
JZ output ;если нет, то на вывод найденного максимального числа
CALL NEWMAX ;если было, то сравним с максимальным

;вывод на дисплей
output:
RD R2 ;А было ли вообще число?
jZ FINISH ;не было - просто завершимся (можно вывести какое-то сообщение)

;выводим максимальное число
RDI #110 ;адрес буфера строки
WR R0 ;будем адресовать с помощью R0

TOSCREEN:
RD @R0+ ;читаем
OUT 10 ;и на экран
RD R4 ;счетчик цифр
SBI #1 ;уменьшаем
WR R4
JNZ TOSCREEN ;до 0

hlt ; останов

;подпрограмма сравнения с максимальным
;и сохранения нового максимального
NEWMAX:
RD R3 ;текущее число
SUB R2 ;сравниваем с максимальным
js NEXT ;меньше - на обнуление текущего

;найдено большее число
RD R3 ;значение
WR R2 ;нового максимального

;копируем строку цифр из текущего в максимальное
RDI #110 ;адрес максимального
WR R0
RDI #120 ;адрес текущего
WR R1
MOV R7,R5 ;счетчик цикла копирования равен количеству цифр текущего числа
MOV R4,R5 ;сохраним количество цифр нового максимального
COPY: ;копируем
RD @R1+
WR @R0+
RD R7
SBI #1
WR R7
JNZ COPY ;пока счетчик не обнулится

NEXT: ;обнулим текущего
RDI #120 ;адрес строки текущего
WR R1
RDI #0
WR R3 ;значение текущего числа
WR R5 ;длина строки текущего числа
RET
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
20.12.2017, 14:39
общий
20.12.2017, 14:39
Адресаты:
Извините, что долго не отвечал...
Действительно, некогда...
Если что непонятно - спрашивайте
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа