Продолжаю писать программу, переходящую в защищённый режим.. =) Следующий пункт, вызвавший затруднения - обработка прерываний. В мануале Intel я прочитал, что все аппаратные прерывания надо расположить в области (надеюсь, я правильно выразился) от int 20h и выше. Для этого я попытался перепрограммировать контроллер прерываний следующим образом: Код (Text): 00000190 C HalRemapDeviceInterrupts PROC stdcall, bMasterControllerBase: BYTE, bSlaveControllerBase: BYTE C C ; Initialize PICs C HalWritePortUchar PIC0_PORT1, ICW1_ISSUED OR ICW1_4BYTES_VECTOR_SIZE OR ICW1_ICW4_NEEDED 00000193 B0 15 1C mov al, ICW1_ISSUED OR ICW1_4BYTES_VECTOR_SIZE OR ICW1_ICW4_NEEDED 00000195 E6 20 1C out PIC0_PORT1, al C HalWritePortUchar PIC1_PORT1, ICW1_ISSUED OR ICW1_4BYTES_VECTOR_SIZE OR ICW1_ICW4_NEEDED 00000197 B0 15 1C mov al, ICW1_ISSUED OR ICW1_4BYTES_VECTOR_SIZE OR ICW1_ICW4_NEEDED 00000199 E6 A0 1C out PIC1_PORT1, al C C ; Remap PICs C HalWritePortUchar PIC0_PORT2, bMasterControllerBase 0000019B 8A 45 08 1C mov al, bMasterControllerBase 0000019E E6 21 1C out PIC0_PORT2, al C HalWritePortUchar PIC1_PORT2, bSlaveControllerBase 000001A0 8A 45 0C 1C mov al, bSlaveControllerBase 000001A3 E6 A1 1C out PIC1_PORT2, al C C ; Slave controller is attached C HalWritePortUchar PIC0_PORT2, 1 SHL ICW3_SLAVE_CONTROLLER_PIN0 000001A5 B0 04 1C mov al, 1 SHL ICW3_SLAVE_CONTROLLER_PIN0 000001A7 E6 21 1C out PIC0_PORT2, al C HalWritePortUchar PIC1_PORT2, 1 SHL ICW3_SLAVE_CONTROLLER_PIN1 000001A9 B0 02 1C mov al, 1 SHL ICW3_SLAVE_CONTROLLER_PIN1 000001AB E6 A1 1C out PIC1_PORT2, al C C HalWritePortUchar PIC0_PORT2, ICW4_BUFFERED_MODE OR ICW4_MASTER_BUFFERED OR ICW4_8086_MODE 000001AD B0 0D 1C mov al, ICW4_BUFFERED_MODE OR ICW4_MASTER_BUFFERED OR ICW4_8086_MODE 000001AF E6 21 1C out PIC0_PORT2, al C HalWritePortUchar PIC1_PORT2, ICW4_BUFFERED_MODE OR ICW4_8086_MODE 000001B1 B0 09 1C mov al, ICW4_BUFFERED_MODE OR ICW4_8086_MODE 000001B3 E6 A1 1C out PIC1_PORT2, al C C ret 000001B9 C HalRemapDeviceInterrupts EndP , а после чего написал следующий обработчик прерывания от клавиатуры: Код (Text): 000003C7 C _KiKeyboardInterrupt: 000003C7 50 C push eax C C ; Print the pressed key C HalReadPortUchar KEYBOARD_DATA_BUFFER_PORT 000003C8 E4 60 1C in al, KEYBOARD_DATA_BUFFER_PORT C Invoke ExConvertScanCodeToASCIIChar, al C Invoke VidWriteConsoleChar, al, CA_DEFAULT C C ; Reset keyboard interrupt C HalReadPortUchar KEYBOARD_SYSTEM_CONTROL_PORT 000003D8 E4 61 1C in al, KEYBOARD_SYSTEM_CONTROL_PORT 000003DA 0C 80 C or al, SCP_IRQ1_RESET C HalWritePortUchar KEYBOARD_SYSTEM_CONTROL_PORT, al 000003DC 8A C0 1C mov al, al 000003DE E6 61 1C out KEYBOARD_SYSTEM_CONTROL_PORT, al C C ; Send EOI C HalWritePortUchar PIC0_PORT1, OCW2_NONSPECIFIC_EOI 000003E0 B0 02 1C mov al, OCW2_NONSPECIFIC_EOI 000003E2 E6 20 1C out PIC0_PORT1, al 000003E4 58 C pop eax 000003E5 CF C iretd и по каким-то причинам потерпел фиаско =) - буковки на экране не появляются. В чём может быть проблема? Заранее спасибо!
Вот как было у Финогенова (16 битные сегменты!!) Код (Text): new_09 proc cli in al,60h mov kode,al ; Запись AL в глобальную переменную и вывод на экран xor ah,ah mov gs:[0],ax mov place,860 call dword ptr task1_offs ; Запись AL в глобальную переменную и вывод на экран: done sti in al,61h or al,80h out 61h,al and al,7fh out 61h,al mov al,20h out 20h,al db 66h iret new_09 endp
"Ссылку" дать не могу - могу прикрепить файл - я когда изучал PM, перебивал с книги руками. В аттаче немного модифицированный пример, там еще установлена ловушка на доступ к портам IN/OUT.
могу прикрепить пример своей лабы.. там обработка прерываний идет . в некоторых дефолт , а из аппаратных обрабатывается таймер и клавиатура. Код не ахти. Но писал чтоб препод понял .. а то задолбался бы ему вдалбливать что там делаю, а то там. компилить тасмом.