truperator
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Вылазит ошибка при создании обектного файла : Fatal: 32-bit record encountered in library file kersova1.asm помогите Вот код: ;************************************************************ ;******************** Это Драйвер консоли ******************** ********* Назначение: заменить стандартный драйвер ************** ;************************************************************* ;^^^^^^^^^^^^^^^ ИНСТРУКЦИИ АССЕМБЛЕРУ ^^^^^^^^^^^^^^^^^^^ .286 cseg segment byte public 'CODE' console proc far assume cs:cseg public _dev_strategy, _dev_interrupt ;Передача меток для вызова из Test1 ;************************************************************* ;***************** Структуры заголовка запроса **************** rh struc ;Фиксированная структура заголовка rh_len db ? ;Длина пакета rh_unit db ? ;Номер устройства (блоковые) rh_cmd db ? ;Команда драйвера устройства rh_status dw ? ;возвращается драйвером rh_res1 dd ? ;Зарезервировано rh_res2 dd ? ;Зарезервировано rh ends rh0 struc ;Заголовок запроса для команды 0 rh0_rh db size rh dup (?) ;фиксированная часть rh0_nunits db ? ;Число устройств в группе (блоковые) rh0_brk_ofs dw ? ;Смещение для конца rh0_brk_seg dw ? ;Сегмент для конца rh0_bpb_tbo dw ? ;Смещение указателя массива ВРВ rh0_bpb_tbs dw ? ;Сегмент указателя массива ВРВ rh0_dn_itr db ? ;Первый доступный накопитель (DOS 3+) rh0 ends rh4 struc ;Заголовок запроса для команды 4 rh4_rh db size rh dup (?) ;фиксированная часть rh4_media db ? ;Дескриптор носителя из DPB rh4_buf_ofs dw ? ;Смещение DTA rh4_buf_seg dw ? ;Сегмент DTA rh4_count dw ? ;Счетчик передачи байтов rh4_start dw ? ;Начальный сектор (блоковые) rh4 ends rh5 struc ;Заголовок запроса для команды 5 rh5_rh db size rh dup (?) ;Фиксированная часть rh5_return db ? ;Возвращаемый символ rh5 ends rh7 struc ;Заголовок запроса для команды 7 rh7_len db ? ;Длина пакета rh7_unlt db ? ;Номер устройства (блоковые) rh7_cmd db ? ;Команда драйвера устройства rh7_status dw ? ;Возвращается драйвером rh7_res1 dd ? ;Зарезервировано rh7_res2 dd ? ;Зарезервировано rh7 ends rh8 struc ;Заголовок запроса для команды 8 rh8_rh db size rh dup (?) ;Фиксированная часть rh8_media db ? ;Дескриптор носителя из DPB rh8_buf_ofs dw ? ;Смещение DTA rh8_buf_seg dw ? ;Сегмент DTA rh8_count dw ? ;Счетчик передачи байтов для символьных rh8_start dw ? ;Начальный сектор (блоковые) rh8 ends rh9 struc ;Заголовок-запроса для команды 9 rh9_rh db size rh dup (?) ;Фиксированная часть rh9_medla db ? ;Дескриптор носителя из DPB rh9_buf_of dw ? ;Смещение DTA rh9_buf_seg dw ? ;Сегмент DTA rh9_count dw ? ;Счетчик передачи байтов rh9_start dw ? ;Начальный сектор (блоковые) rh9 ends ;************************************************************* ;***************************** ОСНОВНАЯ ПРОЦЕДУРА ;************************************************************* begin: ;************************************************************* ;************** ЗАГОЛОВОК УСТРОЙСТВА ДЛЯ DOS ********** ;************************************************************* next_dev dd -1 ;Других драйверов нет attribute dw 8003h ;Символьное, ввод, вывод strategy dw _dev_strategy ;Адрес процедуры СТРАТЕГИЯ interrupt dw _dev_interrupt ;Адрес процедуры ПРЕРЫВАНИЕ dev_name db "CON " ;Имя нашего Драйвера Консоли ;************************************************************* ;*********** РАБОЧЕЕ ПРОСТРАНСТВО ДЛЯ ДРАЙВЕРА ******** ;************************************************************* rh_ofs dw ? ;Смещение заголовка запроса rh_seg dw ? ;Сегмент заголовка запроса sav db 0 ;Символ, считанный с клавиатуры Counters label word ;Счетчики выполнения команд Init dw 0 In_c dw 0 Nd_i dw 0 Outp_c dw 0 Flsh dw 0 Tab label byte ;Таблица счетчиков команд db "Init |" db "In |" db "Nd_i |" db "Out |" db "Flsh |" db "----------" ;************************************************************* ;****************** ПРОЦЕДУРА СТРАТЕГИЯ ****************** ;************************************************************ _dev_strategy: ;Первый вызов из DOS mov cs:rh_seg,es ;Сохранить сегмент mov cs:rh_ofs,bx ;и смещение заголовка запроса ret ;Возврат в DOS ;************************************************************* ;************** ПРОЦЕДУРА ПРЕРЫВАНИЕ ******************** ;************************************************************* _dev_interrupt: ;Обработчик прерывания - второй вызов из DOS ;Сохраним состояние регистров push ax bx ds es bp dx cx si di ;при входе mov ax,cs:rh_seg ;восстановить регистры ES и ВХ, mov es,ax ;сохраненные mov bx,cs:rh_ofs ;процедурой СТРАТЕГИЯ ;Перейти к соответствующей стандартной программе ;для выполнения команды mov al,es:[bx].rh_cmd ;Команда из заголовка запроса rol al,1 ;Удвоить для индексирования lea di,cmdtab ;Адрес таблицы команд xor ah,ah ;Сбросить регистр АН add di,ax ;Прибавить индекс к началу jmp cs:word ptr[di] ;Косвенный переход ;cmdtab - это таблица команд, содержащая 2-байтовый адрес для каждой ;команды. Нужная команда содержится в заголовке запроса. ;Процедура ПРЕРЫВАНИЕ переходит по адресу из таблицы ;к соответствующей стандартной программе. ;Переход по команде, переданной в заголовке запроса cmdtab label byte ;* - символьное устройство dw INITIALIZATION ;Инициализация dw MEDIA_CHECK ;Контроль носителя (блоковые) dw GET_BPB ;Получение ВРВ dw IOCTL_INPUT ;IOCTL ввод dw INPUT ;Ввод dw ND_INPUT ;Неразрушающий ввод dw INPUT_STATUS ;Состояние ввода dw INPUT_FLUSH ;Очистка ввода dw OUTPUT ;Вывод dw OUTPUT_VERIFY ;Вывод с контролем dw OUTPUT_STATUS ;Состояние вывода dw OUTPUT_FLUSH ;Очистка вывода dw IOCTL_OUT ;IOCTL вывод dw OPEN ;Открытие устройства dw CLOSE ;Закрытие устройства dw REMOVABLE ;Сменный носитель dw OUTPUT_BUSY ;Вывод до занятости ;************************************************************* ;*************** ЛОКАЛЬНЫЕ ПРОЦЕДУРЫ ****************** ;************************************************************* ;*************** Вывод таблицы счетчиков ********************** CT_OUT proc near mov ax, 0b800h ;Адрес нулевой видеостраницы mov es, ax mov bx, 142 ;Начало вывода lea si, Tab ;Адрес выводимой таблицы add si, 6 ;Установка в нужную позицию записи xor di, di ;Номер выводимого счетчика mov cx, 5 ;кол-во чисел для перевода в строку Col_C: mov dx, cs:Counters[di] ;Запись счетчика в dx shl dx, 4 mov bp, cx mov cx, 3 ;Кол-во символов в 16-с\с Razl: rol dx, 4 ;Сначала взять старшую цифру в 16-с\с mov al, 1111b ;Маска and al, dl ;Выделение последней (старшей) цифры add al, 30h ;Перевод цифры в символ cmp al, 3ah ;Если цифра в диапазоне букв A-F, jb Out_c ;то необходимо изменить смещение add al, 7 Out_C: mov cs:[si], al ;Записать цифру в строку вывода inc si ; loop Razl ;Повторение 4 раза mov cx, bp add di, 2 add si, 7 ;Переход на нужное поле для записи loop Col_C ; ;Вывод таблицы через видеобуфер mov cx, 54 ;Колличество выводимых соиволов lea si, Tab Out_T: mov al, cs:[si] mov ah, 01100111b ;Цвет символа и фона mov es:[bx], ax add bx, 2 inc si cmp byte ptr cs:[si], "|" jne Next1 add bx, 142 inc si Next1: loop Out_T ret CT_OUT endp ;************************************************************* ;****************** ОБРАБОТКА КОМАНД DOS *************** ;************************************************************* ;************ Команда 0 : Инициализация ****************** initialization: inc cs:Init call initial ;Вывести сообщение lea ax,initial ;Установить адрес конца mov es:[bx].rh0_brk_ofs,ax ;Сохранить смещение mov es:[bx].rh0_brk_seg,cs ;Сохранить сегмент jmp done ;Установить СДЕЛАНО и выйти ;**************** Команда 1 : Контроль носителя ***************** media_check: jmp done ;Установить бит СДЕЛАНО и выйти ;**************** Команда 2 : Получение ВРВ ******************* get_bpb: jmp done ;Установить бит СДЕЛАНО и выйти ;**************** Команда 3 : Ввод IOCTL ********************* IOCTL_input: jmp _unknown ;Установить бит ОШИБКА и выйти ;**************** Команда 4 : Ввод **************************** input: inc cs:In_c mov cx,es:[bx].rh4_count ;Загрузить счетчик ввода mov di,es:[bx].rh4_buf_ofs ;Загрузить смещение mov ax,es:[bx].rh4_buf_seg ;Загрузить сегмент mov es,ax ;Передать сегмент в ES read1: xor ax, ax ;Сбросить АХ xchg al,cs:sav ;Взять сохраненный символ cmp al,0 ;0н равен 0 ? jne read3 ;Нет - возвратить его read2: xor ah,ah ;0бслуживание считывания int 16h ;Вызов клавиатуры BIOS cmp ax,0 ;Клавиша равна 0 ? jz read2 ;Да, взять другой символ cmp al,0 ;Это расширенная клавиша ? jne read3 ;Нет-возвратить ее mov cs:sav,ah ;Сохраноть скэн-код read3: mov es:[di],al ;Сохранить значение в буфере inc di ;Продвинуть указатель loop read1 ;Продолжать до счетчика = 0 mov ax,cs:rh_seg ;восстановить регистр ES mov es,ax ;из rh_seg mov bx,cs:rh_ofs ;Восстановить регистр ВХ jmp done ;Установить бит СДЕЛАНО и выйти ;**************** Команда 5 : Неразрушающий ввод ************** nd_input: inc cs:Nd_i mov al,cs:sav ;Взять сохраненный символ cmp al,0 ;0н равен 0? jne nd1 ;Нет - возвратить его в DOS mov ah,1 ;Обслуживание - контроль состояния int 16h ;Вызов клавиатуры BIOS jnz NotBusy ;При ZF = 0 символ в буфере етсь jmp busy ;При ZF = 1 символа в буфере нет NotBusy: cmp ax,0 ;Клавиша - 0? jne nd1 ;Нет - возвратить ее в DOS xor ah,ah ;Обслуживание - считывание int 16h ;Выэов клавиатуры BIOS jmp nd_input ;Проверять вновь nd1: mov es:[bx].rh5_return,al ;возвратить клавишу в DOS jmp done ;Остановить бит СДЕЛАНО и выйти ;***************** команда 6 : Состояние ввода ***************** input_status: jmp done ;Установить бит СДЕЛАНО и выйти ;**************** Команда 7 : Очистка ввода ********************* input_flush: inc cs:Flsh mov cs:sav,0 ;Сбросить сохраненный символ If_1: mov ah,1 ;Обслуживание - контроль состояния int 16h ;Вызов клавиатуры BIOS jz done ;При ZF = 1 буфер пустой xor ah,ah ;Обслуживание - считывание int 16h ;Вызов клавиатуры BIOS jmp If_1 ;Повторять до опустошения ;**************** Команда 8 : Вывод **************************** output: inc cs:Outp_c mov cx,es:[bx].rh8_count ;Взять счетчик вывода mov di,es:[bx].rh8_buf_ofs ;Загрузить смещение mov ax,es:[bx].rh8_buf_seg ;Загрузить сегмент mov es,ax ;в регистр ES xor bx,bx ;Сбросить ВХ out1: mov al,es:[di] ;Взять выводимый символ inc di ;Продвинуть указатель mov ah,0eh ;Обслуживание - запись как TTY int 10h ;Вызов экрана BIOS loop out1 ;Повторять до исчерпания счетчика mov ax,cs:rh_seg ;Восстановить в регистре ES mov es,ax ;сегмент заголовка запроса mov bx,cs:rh_ofs ;восстановить регистр ВХ jmp done ;Установить бит СДЕЛАНО и выйти ;Команда 9 : Вывод с контролем output_verify: jmp output ;Аналогично команде вывода ;Команда 10 : Состояние вывода output_status: jmp done ;Установить бит СДЕЛАНО и выйти ;Команда 11 : Очистка вывода output_flush: jmp done ;Установить бит СДЕЛАНО и выйти ;Команда 12 : IOCTL-вывод ioctl_out: jmp _unknown ;Установить бит ОШИБКА и выйти ;Команда 13 : Открытие open: jmp done ;Установить бит СДЕЛАНО и выйти ;Команда 14 : Закрытие close: jmp done ;Остановить бит СДЕЛАНО и выйти ;Команда 15 : Сменный носитель removable: jmp _unknown ;Остановить бит ОШИБКА и выйти ;Команда 16 : Вывод до занятости output_busy: jmp _unknown ;Установить бит ОШИБКА и выйти ;************************************************************* ;************ ВЫХОД ПО ОШИБКЕ И ОБЫЧНЫЙ ВЫХОД ******* ;************************************************************* _unknown: or es:[bx].rh_status,8003h ;Остановить бит и код ошибки jmp done ;Установить бит СДЕЛАНО и выйти ;************************************************************* ;********************* ОБЫЧНЫЙ ВЫХОД ****************** ;************************************************************* busy: or es:[bx].rh_status,0200h ;Установить бит ЗАНЯТ done: or es:[bx].rh_status,0100h ;Установить бит СДЕЛАНО call CT_OUT pop di si cx dx bp es ds bx ax ;восстановить все регистры ret ;Возврат в DOS ;*********************************************************** ;********************** КОНЕЦ ПРОГРАММЫ **************** ;************************************************************* ;процедура - вызывается командой инициализации и действует ;только один раз. Сюда указывает "адрес конца". После инициализации ;память, занимаемая этой процедурой возвращается DOS. initial proc near ;Вывод сообщения на консоль mov ax, cs mov ds, ax lea dx, line ;Адрес выводимого сообщения mov ah, 09h ;Вывод на экран int 21h ;Вызов вывода строки ret ;Возврат initial endp line db " Driver Console ",13,10 db " design by student group KS-07n",13,10 db " Voloshin Dmitriy Nikolaevich",'$' console endp ;Конец процедуры CONSOLE cseg ends ;Конец сегмента cseg end begin ;Комец программы |