|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Функції завжди перечислюються у такому порядку1. INITIALIZE (ініціалізація) 2. CHECK_MEDIA (перевірка носія) 3. MAKE _BPB 4. IOCTL_IN 5. IMPUT_DATA (ввід даних) 6. NONDESTRUCT_IN 7. IMPUT_STATUS (статус вводу) 8. CLEAR_INPUT (очищення вводу) 9. OUTPUT_DATA (вивід даних) 10. OUTPUT_VERIFY (перевірка виводу) 11. JUTHUT_STATUS (статус виводу) 12. CLEAR_OUTPUT (очищення виводу) 13. IOCTL_OUT
Приклад 3. Процедура обробки переривань. В цьому прикладі приведена загальна форма процедури обробки переривання, за виключенням реального коду, що керує пристроєм. Тут використовується функція виводу. Процедура, що виконує вивід отримує з заголовка запит адреси буфера, в якому знаходяться дані, що виводяться (зміщення 14). Вона також зчитує число байтів, що потрібно вивести (зміщення 18). Коли процедура завершить вивід даних, то вона встановлює слово статусу в заголовку запита (зміщення 3) і поверне управління. Коли операція успішна, то потрібно встановити біт 8 слова статусу.
;---ініціалізація обробника переривань пристрою DEV_INTERRUPT: PUSH ES;зберігаємо регістри PUSH DS PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH BP MOV AX,CS:KEEP_ES;ES:BX вказує на заголовок запиту MOV ES,AX MOV BX,CS:KEEP_BX MOV AL,ES:[BX+2];отримуємо код команди із заголовку SHL AL,1;помножуємо на 2) SUB AH,AH;обнуляємо AH LEA DI,FUNCTIONS;DI вказує на зміщення до(перед) таблиці(ею) ADD DI,AX;додаємо зміщення в таблиці JMP WORD PTR [DI];переходимо на адресу з таблиці FUNCTIONS LABEL WORD;це таблиця функцій DW INITIALIZE DW CHECK_MEDIA DW MAKE_BPB DW IOCTL_IN DW INPUT_DATA DW NONDESTRUCT_IN DW INPUT_STATUS DW CLEAR_INPUT DW OUTPUT_DATA DW OUTPUT_VERIFY DW OUTPUT_STATUS DW CLEAR_OUTPUT DW IOCTL_OUT ;-вихід із драйверу, якщо функція не підтримується CHECK_MEDIA: MAKE_BPB: IOCTL_IN: INPUT_DATA: NONDESTRUCT_IN: INPUT_STATUS: CLEAR_INPUT: OUTPUT_VERIFY: OUTPUT_STATUS: CLEAR_OUTPUT: IOCTL_OUT: OR ES:WORD PTR [BX]+3,8103H;модифікуємо статус JMP QUIT ;-процедури для двох кодів, що підтримуються INITIALIZE: LEA AX,E_O_P;зміщення кінця програми в AX MOV ES:WORD PTR [BX]+14,AX;помістимо його у заголовок MOV ES:WORD PTR [BX]+16,CS ... (тут іде ініціалізація пристрою) ... JMP QUIT OUTPUT_DATA: MOV CL,ES:[BX]+18;отримуємо число, символ CBW CX;CX використовуємо як лічильник MOV AX,ES:[BX]+16;отримуємо адресу буфера даних MOV DS,AX MOV DX,ES:[BX]+14 ... (операції по виводу) ... JMP QUIT ;-вихід з модифікацією байту статусу в заголовку запита QUIT: OR ES:WORD PTR [BX]+3,100H;установлюємо біт 8 POP BP;повертаємо регістри POP DI POP SI POP DX POP CX POP BX POP AX POP DS POP ES RET E_O_P:;мітка кінця програми DEVICE12 ENDP CSEG ENDS END DEVICE12
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |