Хук прерывания в реальном режиме

Тема в разделе "WASM.BEGINNERS", создана пользователем Aoizora, 21 июл 2019.

  1. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    351
    Хочу похукать прерывание 10h и вывести звук во время его вызова. Вот такая программа для реального режима:

    Код (Text):
    1. #fasm#
    2.  
    3. #make_boot#
    4.  
    5. org 7c00h
    6.  
    7.   ; calculate interrupt offset
    8.   lea si, [10h*4]
    9.  
    10.   ; save segment in ax, offset in bx
    11.   mov ax, [si+2]
    12.   mov bx, [si]
    13.  
    14.   ; save original interrupt vector
    15.   mov [original_vector+3], ax
    16.   mov [original_vector+1], bx
    17.  
    18.   ; set hook
    19.   xor ax, ax
    20.   mov bx, int10_handler
    21.   mov [si+2], ax
    22.   mov [si+0], bx
    23.  
    24.   ; use interrupt inside of 'print'
    25.   mov si,  tst
    26.   call print
    27.  
    28.   hlt
    29.  
    30. int10_handler:
    31.   call beep
    32. original_vector:
    33.   jmp far 0000:0000
    34.   iret
    35.  
    36. print:
    37.   lodsb
    38.   or al, al     ; al - current character
    39.   jz print_done ; null-terminator found
    40.   mov ah, 0x0E
    41.   int 10h
    42.   jmp print
    43. print_done:
    44.   ret
    45.  
    46. beep:
    47.   push ax
    48.   push bx
    49.  
    50.   mov al, 182
    51.   out 43h, al
    52.   mov ax, 2280
    53.  
    54.   out 42h, al
    55.   mov al, ah
    56.   out 42h, al
    57.   in al, 61h
    58.  
    59.   or al, 00000011b
    60.   out 61h, al
    61.   mov bx, 4
    62.  
    63.   pop bx
    64.   pop ax
    65.  
    66.   ret
    67.  
    68. msg db "Fuck!", 0Ah, 0Dh, 0
    69. tst db "Test!", 0Ah, 0Dh, 0
    Она отрабатывает и завершается, но при этом звука нет. Что еще интересного можно сделать в моем обработчике прерывания? Как можно, например, использовать цвет в хуке? Есть еще какие-нибудь идеи?

    Более интересный для меня вопрос:

    Код (Text):
    1. int10_handler:
    2.   call beep
    3. original_vector:
    4.   jmp far 0000:0000
    5.   iret
    Здесь iret нужен или не нужен? В моем понимании, оригинальный обработчик сам делает iret, а второй iret может разбалансировать стек. Но в данном случае программа простая и это будет незаметно.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Это баг эмулятора. Или фича. При запрещённых прерываниях аппаратура не работает.
    Поэтому Вы должны вначале разрешить прерывания после этого бикнуть.

    А он туда попадает?
     
  3. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    351
    Ну у меня хук выводит строку, так что попадает
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Да нет же у вас процессор на первом iret минуя второй сразу попадёт в код где был вызван int 10h.
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Aoizora,

    > Здесь iret нужен или не нужен?

    Не правильно понимаешь. Думай с точки зрения задачи. Задача имеет контекст, не важно какой. Вход в ISR(прерывание) сохраняет контекст(он выгружается из процессора). Соответственно его нужно назад вернуть, загрузить при возврате из ISR. Может быть рекурсивный вызов, но это ничего не меняет, текущий контекст нужно вернуть назад.

    Есчо нужно помнить что вход в ISR выключает прерывания, тоесть ось становится.
     
    Aoizora нравится это.