Здравствуйте!
Пишу лабораторную по теме "Драйвер клавиатуры" (полный код приведен ниже) и столкнулся с некоторыми трудностями:
1. Линковщик отказывается генерить COM-файл, выдаёт сообщение
"Fatal:Cannot generate COM-file:segment-relocatable items present" - в чём причина? вроде все данные описаны в сегменте кода, других сегментов нет...
2. обработчик прерывания (9h) на клавиатуру - требуется работа с портами, чего раньше никогда не делал. У Зубкова изложено только в теории, что помогает мало. Считал что-то там из порта и... что с этим делать? Да и неохота изобретать велосипед честно говоря... Может кто-нибудь поделится кусочком кода?
В общем вроде установил вектора на свои обработчики, а что дальше делать - ума не приложу
Асм только изучаю, примеров катастрофически не хватает - как дальше реализовывать обработчики? Нужно ли в их начале вызывать старые обработчики и зачем эта мера вообще?
Немножко сумбурно получилось, но точнее не получается. Заранее спасибо.
Приложение:
.model tiny.286 ;разрешаем инструкции 286.codeorg 100h ;выделяем стековую памятьstart proc far push cs ;DS на сегмент кода pop ds push 0 pop es ;-----для клавиатуры----- push word ptr es:[9h*4] ;достаём смещение старого обработчика pop kbd_old_off ;сохраняем в переменной push word ptr es:[9h*4+2] ;достаём сегмент старого обработчика pop kbd_old_seg ;сохраняем в переменной ;-----для видеоадаптера----- push word ptr es:[10h*4] ;достаём смещение старого обработчика pop vga_old_off ;сохраняем в переменной push word ptr es:[10h*4+2] ;достаём сегмент старого обработчика pop vga_old_seg ;сохраняем в переменной pushf ;сохраняем в стек состояние флагов ;устанавливаем наш обработчик на клавиатуру cli ;запрещаем прерывания mov word ptr es:[9h*4],offset k_int ;в таблицу векторов - смещение нового обработчика mov word ptr es:[9h*4+2],seg k_int ;в таблицу векторов - сегмент нового обработчика ;устанавливаем наш обработчик на видео mov word ptr es:[10h*4],offset v_int ;в таблицу векторов - смещение нового обработчика mov word ptr es:[10h*4+2],seg v_int ;в таблицу векторов - сегмент нового обработчика popf ;восстановим исходное значение флага IF sti ; ;отработали здесь, после восстанавливаем вектора прерываний ; push 0 pop es pushf cli mov word ptr es:[9h*4],offset kbd_old_off ;в таблицу векторов - смещение нового обработчика mov word ptr es:[9h*4+2],seg kbd_old_seg ;в таблицу векторов - сегмент нового обработчика ;устанавливаем наш обработчик на видео mov word ptr es:[10h*4],offset vga_old_off ;в таблицу векторов - смещение нового обработчика mov word ptr es:[10h*4+2],seg vga_old_seg ;в таблицу векторов - сегмент нового обработчика popf sti retnstart endpk_int proc far ;обработчик клавиатуры pusha ;сохраняем все регистры общего назначения push es push ds push cs ;DS на сегмент кода pop ds in al,60h ;считали в AL скан-код клавиши push ax ;сохранили в стек in al,61h ;считали данные из порта 61h push ax ;закинули их в стек or al,80h ;установили бит 7 out 61h,al ;вывели назад в порт 61h pop ax ;достали данные из стека out 61h,al ;вывели назад в порт 61h pop ax ;восстановили скан-код клавиши в AX mov al,20h out 20h,al pop es pop ds popa iretk_int endpv_int proc far ;обработчик видео iretv_int endpkbd_old_off dw 0hkbd_old_seg dw 0hvga_old_off dw 0hvga_old_seg dw 0hend start