Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
 
Feverr
0 / 0 / 0
Регистрация: 10.11.2019
Сообщений: 1
1

По нажатию кнопки прекратить выполнение прерывания 1Ch

10.11.2019, 17:19. Просмотров 152. Ответов 1
Метки нет (Все метки)

Здравствуйте. Нужна помощь с выполнением задания.

Задание заключается в том, чтобы переопределить прерывание 1Ch на вывод сообщения на экран. Это я сделал, теперь у меня каждые 18,2 сек. выводится нужное мне сообщение. Теперь мне нужно, чтобы при нажатии клавиши 'c' вывод сообщения останавливался, а когда клавиша отжимается - продолжался. Чтобы выйти из программы нужно нажать Escape. Собственно с выходом из программы я тоже справился, но остановку вывода сообщения по нажатии кнопки я не знаю как сделать.

Вот код, который у меня получился:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
        ASTACK SEGMENT STACK
        DW 2048 DUP(?)
     ASTACK ENDS
 
     
     DATA SEGMENT
        OLD_1CH DD 0
        STRING DB '0 $' 
 
     DATA ENDS
       
       CODE SEGMENT
        ASSUME CS:CODE, DS:DATA, SS:ASTACK
 
        NEW_1CH PROC
            PUSH AX
 
            MOV AH, 09H
            MOV DX, OFFSET STRING
            INT 21H
    
            POP AX
            IRET
        NEW_1CH ENDP
 
        MAIN PROC FAR
            PUSH DS
            PUSH AX
            MOV AX, DATA
            MOV DS, AX
            MOV AX, 351CH
            INT 21H
            MOV WORD PTR OLD_1CH, BX
            MOV WORD PTR OLD_1CH+2, ES
            PUSH DS
            MOV DX, OFFSET NEW_1CH
            MOV AX, SEG NEW_1CH
            MOV DS, AX
            MOV AX, 251CH
            INT 21H
            POP DS
 
            BUTTON:
                MOV AH, 0H
                INT 16H
                CMP AL, 27
                JE EXIT
                JMP BUTTON
 
            EXIT:
                CLI
                LDS DX, OLD_1CH
                MOV AX, 251CH
                INT 21H
                POP DS
                POP AX
                STI
                MOV AX, 4C00h   
                INT 21h
            
        MAIN ENDP
       CODE ENDS
    END MAIN
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2019, 17:19
Ответы с готовыми решениями:

Выполнение запросов к БД по нажатию кнопки
Почему кнопка не выполняет этот скрипт по нажатию??? база подключина!!! <form action=""...

Выполнение действия по нажатию кнопки
Делаю шутер на андроид,нашел в интернете подходящий мне скрипт для оружия но там выстрел происходит...

1

ФедосеевПавел
Модератор
4732 / 2633 / 1051
Регистрация: 01.02.2015
Сообщений: 8,616
Записей в блоге: 1
10.11.2019, 19:15 2
Подозреваю, что вам придётся действовать следующим образом:
1. перехватывать ещё одно прерывание - int 09h от клавиатуры
2. в обработчике int 09h считывать из порта 60h код нажатой клавиши
3. если он совпал с кодом нажатия клавиши "с", то установить переменную - флаг остановки вывода
4. если он совпал с кодом отпускания клавиши "с", то обнулить переменную - флаг остановки вывода

Коды нажатия и отпускания клавиш одной клавиши чем-то отличаются, поэтому уточните их экспериментально.
И соответственно Esc - тоже, т.к. ваш обработчик клавиатуры прекратит поток в клавиатурный буфер.

Кажется так. Детали уже не помню, т.к. никогда не интересовался, хотя описания и читал.

Добавлено через 31 минуту
Описание из http://www.codenet.ru/progr/dos/int_0007.php
Функции BIOS - INT 09H: прерывание от клавиатуры.

Это аппаратно генерируемое прерывание (IRQ 1) выполняется при каждом нажатии и отпускании клавиши. код ROM-BIOS интерпретирует это, сохраняя значения в буфере клавиатуры по адресу 0:041e. Он также обрабатывает специальные случаи клавиш PrtSc и SysReq, и отслеживает состояние клавиш Shift и различных Lock.

Резидентные popup-программы, которые обычно предусматривают "кнопку вызова", перехватывают INT 09H и проверяют на определенный ключ примерно так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
         push    ax
         in      al,60H             ;читать ключ
         cmp     al,POP_KEY         ;это кнопка вызова?
         je      do_pop             ; да, активизировать popup
                                    ;  нет, уйти на исходный обработчик
         pop     ax
         jmp     cs:[int9_vect]     ;переход на первоначальный обработчик
do_pop:  ;------ следующий код необходим для отработки аппаратного прерывания
         in      al,61H             ;взять значениe порта управления клавиатурой
         mov     ah,al              ; сохранить его
         or      al,80h             ;установить бит разрешения для клавиатуры
         out     61H,al             ; и вывести его в управляющий порт
         xchg    ah,al              ;извлечь исходное значение порта
         out     61H,al             ; и записать его обратно
         mov     al,20H             ;послать сигнал "конец прерывания"
         out     20H,al             ; контроллеру прерываний 8259
         ;------ дальше - прочие проверки, и наконец - активизация popup
Здесь http://frolov-lib.ru/books/bsp/v02/ch2_3.htm
2.3. Аппаратное прерывание клавиатуры

Клавиатура подключена к линии прерывания IRQ1. Этой линии соответствует прерывание INT 09h.

Клавиатурное прерывание обслуживается модулями BIOS. Драйверы клавиатуры и резидентные программы могут организовывать дополнительную обработку прерывания INT 09h. Для этого может быть использована цепочка обработчиков прерывания. В первой книге первого тома мы приводили примеры расширения обработчика прерывания INT 09h.

Как работает стандартный обработчик клавиатурного прерывания, входящий в состав BIOS?

Этот обработчик выполняет следующие действия:
  • читает из порта 60h скан-код нажатой клавиши;
  • записывает вычисленное по скан-коду значение ASCII-кода нажатой клавиши в специальный буфер клавиатуры, расположенный в области данных BIOS;
  • устанавливает в 1 бит 7 порта 61h, разрешая дальнейшую работу клавиатуры;
  • возвращает этот бит в исходное состояние;
  • записывает в порт 20h значение 20h для правильного завершения обработки аппаратного прерывания.
Обработчик прерывания INT 09h не просто записывает значение ASCII-кода в буфер клавиатуры. Дополнительно отслеживаются нажатия таких комбинаций клавиш, как Ctrl-Alt-Del, обрабатываются специальные клавиши PrtSc и SysReq. При вычислении кода ASCII нажатой клавиши учитывается состояние клавиш Shift и CapsLock.
И ещё, любопытное и достаточно подробное описание и примеры работы с клавиатурой на низком уровне (на уровне портов) я встречал в книге
Владимир Кулаков «Программирование на аппаратном уровне»

Добавлено через 47 минут
В книге Кулакова пример list1_06 в шестнадцатеричном виде выводит коды нажатых и отпущенных клавиш, полученных из порта 60h.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
..............
ОСНОВНАЯ ПРОГРАММА
 
; Установить новый обработчик прерывания
        call    SetKeyboardInterrupt
 
; Ожидать, пока не будет произведено 200 
; операций нажатия/отпускания
@@Next: cmp     [PressCounter],200
        jb      @@Next
 
; Восстановить исходный обработчик прерывания
        call    RestoreOldKeyboardInterrupt
..............................
;*********************************************
;* НОВЫЙ ОБРАБОТЧИК ПРЕРЫВАНИЯ ОТ КЛАВИАТУРЫ *
;*********************************************
proc KeyboardInterrupt far
        pusha
        push    DS
        mov     AX,[CS:MainDataSeg]
        mov     DS,AX
; Получить скэн-код
        in      AL,60h
; Разрешить прерывания с более низким приоритетом
        push    AX
        mov     AL,20h  ;команда EOI
        out     20h,AL
        pop     AX
        sti             ;разрешить прерывания
; Отобразить на экране монитора принятый от клавиатуры
; код в шестнадцатеричном представлении
        ; Отобразить принятый байт
        call    ShowHexByte
        ; Перевести текущую позицию на 2 символа влево
        ; (подготовка для вывода следующего кода)
        add     [ScreenColumn],2
        ; Проверить пересечение правой границы экрана
        cmp     [ScreenColumn],80
        jb      @@EndShowCode
        ; Если достигнута правая граница
        ; экрана - перейти на следующую строку
        sub     [ScreenColumn],80
        inc     [ScreenString]
@@EndShowCode:
; Завершение обработки прерывания
        ; Увеличить значение счетчика нажатий/отпусканий
        inc     [PressCounter]
        pop     DS
        popa
        iret
endp KeyboardInterrupt
Здесь видно - прерывание перехватывается и на старый обработчик не отдаёт, в самом прерывании организован вывод на экран кодов клавиш, принятых из порта 60h, т.к. прерывание аппаратное и на старый обработчик передачи управления нет - самостоятельно сбрасывается PIC (контроллер прерываний - порт 20h).

Найдите в интернете дискету - на ней и исходники и компилированные программы. Вам нужен list1_06
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2019, 19:15

Выполнение процедуры на сервере по нажатию кнопки
Kak pri nazhatii na knopku (<input type='button'...) wypolnit' proceduru na servere? To jest',...

Выполнение расчета по одному нажатию Кнопки.
Привет всем! помогите пожалуйста разобраться. Я делаю расчеты по Таблице. Но мне приходиться 2...

Выполнение скрипта по нажатию кнопки из админки
Доброго времени суток. Я только начал изучение django. Стоит задача запустить выполнение python...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.