20.01.2017, 15:01 [+3 UTC]
в нашей команде: 1 762 чел. | участники онлайн: 12 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.40 (02.09.2016)

Общие новости:
31.12.2016, 18:43

Форум:
18.01.2017, 11:36

Последний вопрос:
20.01.2017, 14:11

Последний ответ:
20.01.2017, 14:06

Последняя рассылка:
19.01.2017, 23:45

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
08.05.2010, 12:17 »
Королев Олег Владимирович
Удовлетворил ответ спасибо. [вопрос № 178192, ответ № 261279]
05.12.2012, 19:40 »
Денис
асяня, Вы как всегда бесподобны) [вопрос № 186895, ответ № 271791]
05.08.2010, 16:39 »
Виталий Анатольевич
Спасибо! Уже что то прояснил для себя! [вопрос № 179665, ответ № 262742]

РАЗДЕЛ • Assembler

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 750
Evgen aka Chuma
Статус: 4-й класс
Рейтинг: 193
Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 177

Перейти к консультации №:
 

Консультация онлайн # 190277
Раздел: • Assembler
Автор вопроса: misha.ya.ndex (Посетитель)
Отправлена: 11.12.2016, 19:37
Поступило ответов: 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 ; на чтение состояния клавиатуры 

Состояние: Консультация закрыта

Ответ # 274429 от Лысков Игорь Витальевич (Старший модератор)

Здравствуйте, misha.ya.ndex!
Где-то так:

Код (Assembler) :: выделить код
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 ;возврат из прерывания


Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 12.12.2016, 21:40

5
нет комментария
-----
Дата оценки: 12.12.2016, 22:36

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос | интересные статьи

Время генерирования страницы: 0.13604 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.40 от 02.09.2016
Бесплатные консультации онлайн