Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RFPRO.RU

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

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 371
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 4-й класс
Рейтинг: 323
∙ повысить рейтинг »
nikitos82.01
Статус: 1-й класс
Рейтинг: 1
∙ повысить рейтинг »

∙ Assembler

Номер выпуска:1639
Дата выхода:16.12.2016, 19:45
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:35 / 13
Вопросов / ответов:1 / 1

Консультация # 190277: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: програмку нужно переделать в режим прерывания. написано у compmodel
RD #0 ;сначала будет 0 
w
...

Консультация # 190277:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

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

Дата отправки: 11.12.2016, 19:37
Вопрос задал: misha.ya.ndex (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


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

Здравствуйте, 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 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное