Ставлю свой обработчик прерываний, управление на него не попадает. Помогите понять, что не так. Файл .com, код такой: Код (Text): org 100h use16 main: ; Установка cli lfs si,[13h*4] ;Адрес вектора int 13h грузим в -> fs:si mov word [cs:13h*4], Handler_13 ;Смещение mov word [cs:13h*4 + 2], fs ;Сегмент sti ; Проверка: mov ah, 02h ;.... заполняем ch, cl, dh, dl int 13h ; Перехватчик Handler_13: pushad pushf ;сюда не попадаю.... :-((( ;что-то делаем (затрагивая флаги, поэтому pushf) popf popad ret ; Возврат в DOS mov ax, 4C00h int 21h Где хомут?
Да я пробовал и такое выриант, чтобы на него попасть: Код (Text): cli push cs pop ds push cs pop ss mov word [cs:13h*4], Addr_Handler_13 mov word [cs:13h*4 + 2], fs sti ; и т.д Addr_Handler_13 = (($ - main) + 100h) Handler_13: ; и т.д. Все равно не фурычит. А приведенный в посте вариант следует из доки по FASM-у где было сказано, что смещения учитывают org ... Поэтому и написал просто Код (Text): mov word [cs:13h*4], Handler_13 Но беда в том, что ни тот, ни другой вариант не катят.... Что делать? Помогите, задолбался совсем уже ~~~))
Поддерживаю вопрос: Советую просто сесть и подумать, а не клепать очередную реинкарнацию кода, который не правилен по сути. Таблица прерываний находится НЕ у тебя в сегменте данных, а кое в каком другом месте И зачем lfs si,[13h*4]?? Чтоб кода по-больше было?
Я в курсе, где находится таблица векторов. Дабы Вы не сомневались, привожу работающий вариант. Код (Text): SetInterrupt: pusha push es mov ax, 0 mov es, ax cli mov word [es:13h*4], Handler_13 mov word [es:13h*4 + 2], cs sti pop es popa ret Но я-то хотел использовать lfs как раз для того, чтобы руками этого не делать....
Во-первых, мы с Вами не так близко знакомы, чтобы тыкать, а где лежит таблица ежу мне известно не хуже чем Вам. А во-вторых, если Вам не понятно, зачем lfs si,[13h*4] - то что Вы делаете на этом форуме? Клепаете (по вашему выражению) стандартный код? Не задумываясь о железе? Не обижайтесь. Просто я давно устал от советов такого типа.
на сколько я понял, то нужно получить при fs = 0; двойное слово(т.е. вектор прерывания), поэтому болшенстов делает так: Код (Text): push cs pop ds xor si,si mov es,si ; Получим вектор Int 13h и сохраним его : mov bx,word es:[13h*4] mov word [old_13h_1],bx mov bx,word es:[13h*4+2] mov word [old_13h_2],bx а теперь смотри вашь вариант: Код (Text): ; Установка cli lfs si,[13h*4] ;Адрес вектора int 13h грузим в -> fs:si mov word [cs:13h*4], Handler_13 ;Смещение mov word [cs:13h*4 + 2], fs ;Сегмент sti получается, что по команде lfs первые два байта из абстрактного адреса [13h*4] попадают в si, а следующие два в fs - в результате у вас в si не адрес 13h перерывания - хреновина какая-то...
Незнаю как Вам, а по мне приятнее видеть что-то вроде Код (Text): mov ax, 0x3513 int 21h mov [old13o], bx mov [old13s], es push ds pop es mov dx, 13_handler push cs pop ds mov ax, 0x2513 int 21h но если от прямой коррекции таблицы отказываться не хочется или пишите не под ДОС, то попробуй те так Код (Text): xor ax, ax mov es, ax mov bx, 13h*4 mov ax, 13_handler mov dx, cs cli xchg [es:bx+0], ax xchg [es:bx+2], dx sti ;в dx:ax - старый вектор и вот еще что. Если пытаться контролировать программу отладчиком, то все уважающие себя отладчики следят за таблицей векторов и не позволяют ее так просто корректировать. Плюс хотелось еще отметить, что флаги сохранять не обязательно. Они сохраняются при вызове вектора.