FASM проблема с перехватом int

Тема в разделе "WASM.ASSEMBLER", создана пользователем 4omin, 22 май 2008.

  1. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    Ставлю свой обработчик прерываний, управление на него не попадает.
    Помогите понять, что не так.
    Файл .com, код такой:
    Код (Text):
    1.         org 100h
    2.         use16
    3. main:
    4. ; Установка
    5.         cli
    6.         lfs  si,[13h*4]                                 ;Адрес вектора int 13h грузим в  -> fs:si
    7.         mov  word [cs:13h*4], Handler_13      ;Смещение
    8.         mov  word [cs:13h*4 + 2], fs            ;Сегмент
    9.         sti
    10.  
    11. ; Проверка:
    12.         mov ah, 02h
    13.         ;.... заполняем ch, cl, dh, dl
    14.         int 13h
    15.  
    16. ; Перехватчик
    17. Handler_13:
    18.        pushad
    19.        pushf
    20.  
    21.        ;сюда не попадаю.... :-(((
    22.        ;что-то делаем (затрагивая флаги, поэтому pushf)
    23.  
    24.       popf
    25.       popad
    26.       ret
    27.  
    28. ; Возврат в DOS
    29.         mov ax, 4C00h
    30.         int 21h
    Где хомут?
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    кто сказал, что при старте программы cs=0 и ds=0?
     
  3. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    Да я пробовал и такое выриант, чтобы на него попасть:
    Код (Text):
    1.     cli
    2.     push cs
    3.     pop  ds
    4.     push cs
    5.     pop  ss
    6.     mov  word [cs:13h*4], Addr_Handler_13
    7.     mov  word [cs:13h*4 + 2], fs            
    8.     sti
    9.     ; и т.д
    10.  
    11.  
    12. Addr_Handler_13   = (($ - main) + 100h)
    13. Handler_13:
    14.         ; и т.д.
    Все равно не фурычит.
    А приведенный в посте вариант следует из доки по FASM-у где было сказано,
    что смещения учитывают org ...
    Поэтому и написал просто
    Код (Text):
    1. mov  word [cs:13h*4], Handler_13
    Но беда в том, что ни тот, ни другой вариант не катят....
    Что делать? Помогите, задолбался совсем уже ~~~:)))
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Поддерживаю вопрос:
    Советую просто сесть и подумать, а не клепать очередную реинкарнацию кода, который не правилен по сути.
    Таблица прерываний находится НЕ у тебя в сегменте данных, а кое в каком другом месте :)

    И зачем lfs si,[13h*4]??
    Чтоб кода по-больше было?
     
  5. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    Я в курсе, где находится таблица векторов. Дабы Вы не сомневались,
    привожу работающий вариант.
    Код (Text):
    1. SetInterrupt:
    2.         pusha
    3.         push es
    4.         mov  ax, 0
    5.         mov  es, ax
    6.         cli
    7.         mov  word [es:13h*4], Handler_13
    8.         mov  word [es:13h*4 + 2], cs      
    9.         sti
    10.  
    11.         pop es
    12.         popa
    13.         ret
    Но я-то хотел использовать lfs как раз для того, чтобы руками этого не делать....
     
  6. 4omin

    4omin New Member

    Публикаций:
    0
    Регистрация:
    23 апр 2008
    Сообщения:
    22
    Во-первых, мы с Вами не так близко знакомы, чтобы тыкать, а где лежит таблица ежу мне известно не хуже чем Вам.
    А во-вторых, если Вам не понятно, зачем lfs si,[13h*4] - то что Вы делаете на этом форуме?
    Клепаете (по вашему выражению) стандартный код? Не задумываясь о железе?

    Не обижайтесь. Просто я давно устал от советов такого типа.
     
  7. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    используйте, только сночало ds=0 сделойте... и используйте debug.
     
  8. KiNDeR

    KiNDeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2003
    Сообщения:
    258
    Адрес:
    Russia
    на сколько я понял, то нужно получить при fs = 0; двойное слово(т.е. вектор прерывания), поэтому болшенстов делает так:

    Код (Text):
    1. push cs
    2. pop ds
    3. xor si,si
    4. mov es,si
    5. ; Получим вектор Int 13h и сохраним его :
    6. mov bx,word es:[13h*4]
    7.        mov word [old_13h_1],bx
    8. mov bx,word es:[13h*4+2]
    9.        mov word [old_13h_2],bx
    а теперь смотри вашь вариант:

    Код (Text):
    1. ; Установка
    2. cli
    3. lfs si,[13h*4] ;Адрес вектора int 13h грузим в -> fs:si
    4. mov word [cs:13h*4], Handler_13 ;Смещение
    5. mov word [cs:13h*4 + 2], fs ;Сегмент
    6. sti
    получается, что по команде lfs первые два байта из абстрактного адреса [13h*4] попадают в si, а следующие два в fs - в результате у вас в si не адрес 13h перерывания - хреновина какая-то...
     
  9. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    полагаю по умолчанию считаецо что это [ds:13*4].
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Незнаю как Вам, а по мне приятнее видеть что-то вроде
    Код (Text):
    1. mov ax, 0x3513
    2. int 21h
    3. mov [old13o], bx
    4. mov [old13s], es
    5. push ds
    6. pop es
    7. mov dx, 13_handler
    8. push cs
    9. pop ds
    10. mov ax, 0x2513
    11. int 21h
    но если от прямой коррекции таблицы отказываться не хочется или пишите не под ДОС, то попробуй те так
    Код (Text):
    1. xor ax, ax
    2. mov es, ax
    3. mov bx, 13h*4
    4. mov ax, 13_handler
    5. mov dx, cs
    6. cli
    7. xchg [es:bx+0], ax
    8. xchg [es:bx+2], dx
    9. sti
    10. ;в dx:ax - старый вектор
    и вот еще что. Если пытаться контролировать программу отладчиком, то все уважающие себя отладчики следят за таблицей векторов и не позволяют ее так просто корректировать. Плюс хотелось еще отметить, что флаги сохранять не обязательно. Они сохраняются при вызове вектора.