Консультация № 190277
11.12.2016, 19:37
0.00 руб.
0 1 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

програмку нужно переделать в режим прерывания. написано у compmodel
Код:
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 ; на чтение состояния клавиатуры

Обсуждение

давно
Посетитель
7438
7205
12.12.2016, 21:40
общий
это ответ
Здравствуйте, misha.ya.ndex!
Где-то так:
[code lang=asm h=200]
RD #0 ;сначала будет 0
wr R1 ;здесь будем накапливать наше число
RD #5 ;максимум 5 цифр
wr R5 ;сохраним

;настроим клавиатуру
RDI #24 ;задаем адрес отработки прерывания клавиатуры
;точный адрес можно посмотреть в окне "программа"
WR 100 ;фиксированный адрес ячейки 0 прерывания (клавиатуры)
RDI #101 ;команда сброса
OUT 1
RDI #11 ;разрешение и работа по прерыванию
OUT 1
RDI #103 ;посимвольный режим
OUT 1

EI ;разрешаем прерывания

LOOP: ;основной цикл
rd r5 ;циклим, пока в регистре r5 не 0
jnz LOOP
;заканчиваем работу
rd #80 ;адрес ячейки, куда запишем результат
wr r0 ; будем адресовать через R0
rd r1 ; введенное число
wr @r0 ; сохраняем в памяти
hlt ; останов

;Т.к. у нас основной цикл непустой,
;в анализе переполнения буфера клавиатуры используется аккумулятор
;то в прерывании необходимо сохранить аккумулятор
KEYBOARD: ;прерывание от клавиатуры
WR R9 ;сохраним аккумулятор в регистре
IN 0 ;читаем код
wr R2 ; сохраним
jz FINISH ; было просто нажатие на "Завершить ввод" - завершаем работу
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 цифр
;ввели все 5 разрядов, R5=0 - автоматом завершится и основной цикл
RD R9 ;восстанавливаем аккумулятор
IRET ;возврат из прерывания

RESET:RDI #101 ; команда сброса
out 1 ; в клавиатуру
RDI #103 ; команда установки посимвольного ввода (сбрасывается при сбросе)
out 1 ; в клавиатуру
RD R9 ;восстанавливаем аккумулятор
IRET ;возврат из прерывания

FINISH:RDI #0 ;обнулим счетчик разрядов, чтобы завершился основной цикл!
wr r5
rd r9 ;восстановим аккумулятор
IRET ;возврат из прерывания
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа