Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

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        ;Комец программы
 

Всего записей: 2 | Зарегистр. 25-10-2016 | Отправлено: 19:33 25-10-2016
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru