Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
 Аватар для Old_DeD
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 28

Вектор прерываний

26.02.2017, 14:53. Показов 3222. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте форумчане. Написал простенький обработчик прерывания:
Assembler
1
2
3
init:
nop
iret
Подскажите как занести его адрес в вектор прерываний. Чтобы вызвав прерывание 75h(непринципиально) управление перешло на обработчик, а потом вернулось в исходное состояние(откуда было вызвано прерывание).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.02.2017, 14:53
Ответы с готовыми решениями:

обработчик прерываний
Скопировал обработчик прерывания с Калашникова, а он не работает. В чом проблема??? (работаю в выне)

Обработчик прерываний
Необходимо сделать так, чтобы каждое второе нажатие игнорировалось. Почему то этого не происходит. Помогите кто может, очень срочно надо ...

Обработчик прерываний
Задача: написать обработчик прерываний, заменяющий вектор прерывания от часов (1СН) и выводящий на экран окно размером в целый экран,...

10
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,900
Записей в блоге: 12
26.02.2017, 16:09
Лучший ответ Сообщение было отмечено Old_DeD как решение

Решение

Можно двумя способами.
1. Средствами ОС DOS int 25h ah=25h http://www.codenet.ru/progr/dos/dos_0040.php
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
    ;установка обработчика прерывания
    mov ax, 3575h           ; AH = 35h, AL = номер прерывания
    int 21h                     ; получить адрес обработчика
    mov word ptr old_int75h, bx ; и записать его в old_int75h
    mov word ptr old_int75h+2, es
    mov ah, 25h
    mov al, 75h ; номер прерывания условно 75h
    push ds
    push cs
    pop ds
    mov dx, InterruptHandler
    int 21h
    pop ds
2. прямой записью в таблицу векторов.

Добавлено через 9 минут
Вот из недавних примеров перехвата прерываний Динамический вывод системного времени
1
 Аватар для Old_DeD
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 28
26.02.2017, 17:16  [ТС]
ФедосеевПавел, можно про второй способ(прямой записью в таблицу векторов) поподробней?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,900
Записей в блоге: 12
26.02.2017, 19:49
Лучший ответ Сообщение было отмечено Old_DeD как решение

Решение

Здесь, в первом примере в строках 26-35 - https://www.cyberforum.ru/post5664788.html

Assembler
1
2
3
4
5
6
7
8
9
10
11
    cli
    push 0
    pop es
    mov si, 4*75h ;для условного прерывания 75h
    mov ax, es:[si]; сохранение старого вектрора
    mov old_vector75h, ax
    mov ax, es:[si+2]
    mov old_vector75h, ax
    mov word ptr es:[si], offset new_vector75h ;запись нового вектора
    mov word ptr es:[si], segment new_vector75h
    sti
или, как в материалах по ссылке
Assembler
1
2
3
4
5
6
7
8
9
MOV AX, 0000H                   ; запись в ES значения
MOV ES, AX                      ; сегмента 0000h
MOV DI, N                       ; запись в DI номера обработчика
MOV CL, 2                       ; умножение DI
SHL DI, CL                      ; на 4
MOV AX, OFFSET HANDLER          ; запись в AX смещения обработчика
STOSW                           ; сохранение смещения в таблице
MOV AX, SEGMENT HANDLER         ; запись в AX сегмента обработчика
STOSW                           ; сохранение сегмента в таблице
1
 Аватар для Old_DeD
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 28
27.02.2017, 13:42  [ТС]
ФедосеевПавел, спасибо

Добавлено через 1 час 36 минут
ФедосеевПавел, И на последок не могли бы вы привести полный листинг примера, то есть с использованием моего обработчика:
Assembler
1
2
3
init:
nop
iret
И под компилятор fasm(как я понимаю пример который вы скинули это для tasm, так как я его видел у Зубкова(в учебнике))
Буду очень признателен.
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
27.02.2017, 14:10
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
org     100h
 
INTNO = 75h                     ; номер прерывания
 
Start:
 
        jmp     SetIntVec       ; прыгаем, чтобы не занимать лишнюю память (ненужным после кодом установки обработчика прерывания)
 
Handler:                        ; обработчик прерывания
        nop
        iret
 
SetIntVec:
        mov     ax,2500h + INTNO
        mov     dx,Handler
        int     21h             ; устанавливаем наш обработчик (ds = cs = сегменту кода обработчика!!!)
 
        mov     ah,49h
        mov     es,[2Ch]
        int     21h             ; освобождаем память, выделенную под переменные окружения
 
        mov     dx,SetIntVec
        int     27h             ; выходим, оставляя прогу резидентной
Добавлено через 3 минуты
А вообще, по-хорошему, нужно сделать так:
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
org     100h
 
IntNo   =       75h             ; номер прерывания
ChkCode =       '?!'            ; код проверки обработчика (любое значение)
RetCode =       'oK'            ; код ответа (любое значение, отличное от ChkCode)
 
Start:
 
        jmp     SetIntVec       ; прыгаем, чтобы не занимать лишнюю память (ненужным после кодом установки обработчика прерывания)
 
Handler:                        ; обработчик прерывания
        cmp     ax,ChkCode
        jne     @f
        mov     ax,RetCode
        iret
@@:
;       iret                    ; если будет что-то ещё, раскомментируем строку
 
SetIntVec:
        mov     ax,3500h + IntNo
        int     21h             ; получаем текущий вектор прерывания
        mov     ax,es
        add     ax,bx
        jz      NotSetYet       ; если там 0, прыгаем на установку
 
        mov     ax,ChkCode
        int     IntNo           ; иначе делаем проверку: отправляем запрос
        cmp     ax,RetCode      ; проверяем результат
        jne     NotSetYet       ; если неверный, прыгаем на установку
 
        int     20h             ; если наш обработчик уже установлен, выходим
 
NotSetYet:
        mov     ax,2500h + IntNo
        mov     dx,Handler
        int     21h             ; устанавливаем наш обработчик (ds = cs = сегменту кода обработчика!!!)
 
        mov     ah,49h
        mov     es,[2Ch]
        int     21h             ; освобождаем память, выделенную под переменные окружения
 
        mov     dx,SetIntVec
        int     27h             ; выходим, оставляя прогу резидентной
0
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
27.02.2017, 14:48
Цитата Сообщение от Jin X Посмотреть сообщение
org 100h
У ТС загрузчик.
0
 Аватар для Old_DeD
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 28
27.02.2017, 16:18  [ТС]
И напоследок, если я еще не задолбал .
Можно пример без средств DOS'a, только BIOS'a?
0
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
28.02.2017, 08:50
Лучший ответ Сообщение было отмечено Old_DeD как решение

Решение

Цитата Сообщение от Old_DeD Посмотреть сообщение
Можно пример без средств DOS'a, только BIOS'a?
Вот накидал простой пример обработчика - закрашивает экран разным фоном.
Логика замены, думаю, понятна. Если надо потом будет восстанавливать исходный вектор, то его надо аналогично сначала сохранить.
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
; FASM
org 100h        ; для теста пусть будет .com
MyVect equ 75h             ; какой вектор меняем
xor ax,ax                  ; замена вектора
mov ds,ax                  ; пишем в нулевой сегмент
mov word [4*MyVect],MyInt  ; сначала адрес обработчика
mov word [4*MyVect+2],cs   ; потом сегмент (=CS)
 
; Использование обработчика
mov ax,3        ; инициализация экрана
int 10h
mov cx,0x2000   ; гашение курсора
mov ah,1
int 10h
@@:xor ah,ah    ; цикл
   int 16h      ; ожидание нажатия клавиши
   cmp al,13    ; Enter - выход из программы
   je @f
   int MyVect   ; вызов нашего обработчика
   jmp @b
@@:ret
 
; Собственно, обработчик
MyInt:
pushf           ; сохранение состояния
pusha
mov ax,0xb800   ; сегмент видеопамяти
mov ds,ax
mov si,3999     ; размер экрана
@@:add byte [si],0x10 ; цикл изменения фона
   sub si,2
   jnc @b
popa            ; восстановление состояния
popf
iret
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6812 / 2052 / 238
Регистрация: 14.12.2014
Сообщений: 4,304
Записей в блоге: 12
28.02.2017, 16:09
Цитата Сообщение от shmkv Посмотреть сообщение
У ТС загрузчик.
А, ну тогда см. вариант Kukuxumushu (только pushf/popf там лишние, int/iret уже выполняют эту работу).
2
 Аватар для Old_DeD
0 / 0 / 0
Регистрация: 30.10.2016
Сообщений: 28
28.02.2017, 16:22  [ТС]
Всем огромное спасибо. Особенно Kukuxumushu!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.02.2017, 16:22
Помогаю со студенческими работами здесь

Таблица прерываний в PM
Работает вот такая таблица! dd 0,0 ; 0 dw syscall_handler, 08h, 1000111000000000b, 0 ; 1 dd 0,0 ; 2 ...

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

Написать обработчик прерываний.
Здраствуйте, меня интересует как написать свой обработчик прерываний? может где нить есть туториал нормальные?

Обработчик прерываний пользователя
Доброго времени суток! Помогите пожалуйста с вопросом,мне дали задание написать программу которая считает значение выражения и выводит его...

Задание с обработкой прерываний
Приветствую. Задача следующая: в одной из подпрограмм вектора прерывания нужно посчитать сумму элементов обратной диагонали квадратной...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru