Свой irq0-обработчик.

Тема в разделе "WASM.OS.DEVEL", создана пользователем n0name, 1 июн 2007.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Что-то вообще не выходит каменный цветок :\
    код тривиален.
    Код (Text):
    1. use16
    2.  
    3. org 7C00h
    4.  
    5. STACK_BASE      equ     9000h
    6. STACK_PTR       equ     9F00h
    7.  
    8. start:
    9.         cli
    10.         push cs
    11.         pop ds
    12.         mov ax, STACK_BASE
    13.         mov ss, ax
    14.         mov sp, STACK_PTR
    15.         mov word [08h * 4], irq0_handler
    16.         mov word [08h * 4 + 2], 0
    17.         sti
    18.         mov bh, 2
    19.         call delay
    20.         mov al, 11h
    21.         call print_byte
    22. test_hlt:
    23.         jmp test_hlt    
    24.  
    25. irq0_handler:
    26.         inc [t_count]
    27.         iret
    28.  
    29. print_byte:
    30.         push ax
    31.         shr al, 4
    32.         call print_byte_
    33.         pop ax
    34.         and al, 0Fh
    35. print_byte_:
    36.         add al, 90h
    37.         daa
    38.         adc al, 40h
    39.         daa
    40.         mov ah, 0Eh
    41.         int 10h
    42.         retn
    43.  
    44. delay:
    45.         mov [t_count], 0
    46. delay_loop:
    47.         cmp [t_count], bh
    48.         jne delay_loop
    49.         ret
    причём обработчик прерывания вызывается один раз и всё.

    пробовал в коде вызывать
    int 8h
    int 8h
    всё в порядке, вызывается дополнительно(к тому первому) 2 раза.
    я вообще в недоумении :\
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    эээ так нельзя=\
    а кто заявку в контроллере сбросит?

    http://www.wasm.ru/article.php?article=ia32int почитай =\
     
  3. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    если очень хочется, то можно, но есть вероятность повторной входимости
    n0name
    добавь
    Код (Text):
    1. irq0_handler:
    2.         inc [t_count]
    3.         mov al, 0x20
    4.         out 0x20, al
    5.         iret
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    да уже поняд ;)
    вкурил доки, понял что дурак :)
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну irq0 то можно, а вот если ирк от девайса, то можно таким образом обработать фиктивное событие от девайса и чем это закончится еще Х его З..
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    да ничем в его случае (старый обработчик то не вызывается)
    out 0x20, al тоже ни к чему не приведет (если никакой бит в ISR не был установлен, а то сброситься что-нибудь не то и тогда точно ХЗ :))
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    эмм ну это уже если вызовется int8 внутри другого обработчика IRQ, тогда точно ХЗ :)
    Да вообще в случае irq0 от таймера ниче плохого не будет )
     
  8. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    Запросто, возьмите другой таймер IRQ8 который :) сработает один раз и утухнет.
    Или прерывание от винта придет и не будет должным образом обработано, тогда, при следующей команде он уйдет в BUSY и не вернется...