Хочу похукать прерывание 10h и вывести звук во время его вызова. Вот такая программа для реального режима: Код (Text): #fasm# #make_boot# org 7c00h ; calculate interrupt offset lea si, [10h*4] ; save segment in ax, offset in bx mov ax, [si+2] mov bx, [si] ; save original interrupt vector mov [original_vector+3], ax mov [original_vector+1], bx ; set hook xor ax, ax mov bx, int10_handler mov [si+2], ax mov [si+0], bx ; use interrupt inside of 'print' mov si, tst call print hlt int10_handler: call beep original_vector: jmp far 0000:0000 iret print: lodsb or al, al ; al - current character jz print_done ; null-terminator found mov ah, 0x0E int 10h jmp print print_done: ret beep: push ax push bx mov al, 182 out 43h, al mov ax, 2280 out 42h, al mov al, ah out 42h, al in al, 61h or al, 00000011b out 61h, al mov bx, 4 pop bx pop ax ret msg db "Fuck!", 0Ah, 0Dh, 0 tst db "Test!", 0Ah, 0Dh, 0 Она отрабатывает и завершается, но при этом звука нет. Что еще интересного можно сделать в моем обработчике прерывания? Как можно, например, использовать цвет в хуке? Есть еще какие-нибудь идеи? Более интересный для меня вопрос: Код (Text): int10_handler: call beep original_vector: jmp far 0000:0000 iret Здесь iret нужен или не нужен? В моем понимании, оригинальный обработчик сам делает iret, а второй iret может разбалансировать стек. Но в данном случае программа простая и это будет незаметно.
Это баг эмулятора. Или фича. При запрещённых прерываниях аппаратура не работает. Поэтому Вы должны вначале разрешить прерывания после этого бикнуть. А он туда попадает?
Aoizora, > Здесь iret нужен или не нужен? Не правильно понимаешь. Думай с точки зрения задачи. Задача имеет контекст, не важно какой. Вход в ISR(прерывание) сохраняет контекст(он выгружается из процессора). Соответственно его нужно назад вернуть, загрузить при возврате из ISR. Может быть рекурсивный вызов, но это ничего не меняет, текущий контекст нужно вернуть назад. Есчо нужно помнить что вход в ISR выключает прерывания, тоесть ось становится.