Задание
Код: Выделить всё
1.Программа должна быть реализована как резидентная в среде DOS
2.Способ вывода функции программное прерывание по вектору 60h. Номер конкретной функции передается в регистр Ah
3.Таблица вызова функции должна быть рассчитана на диапазон номеров функций 0-255
4.Должна быть реализована функция заглушки, которая выводит на экран номер вызванной функции и сообщение о том что данная функция не реализована.
Вызов заглушки должен быть установлен во все элементы таблицы вызова кроме номера функции реализованной по 5
5.реализовать функцию возвращает серийный номер тома.
6.Сообщение при ошибках при выполнении функции стандартная для функции DOS
Код: Выделить всё
assume CS:CSEG, DS:CSEG, SS:CSEG, ES:CSEG
CSEG segment
org 100h
Begin:
mov ah, 33h
mov si, offset File
int 60h
mov ah, 9
mov dx, offset File
int 21h
mov ax, 4C00h
int 21h
File db 11 dup (0), 24h
CSEG ends
end Begin
Код: Выделить всё
ASSUME CS:KNSEG, DS:KNSEG, SS:KNSEG, ES:KNSEG
KNSEG segment
org 100h
Start:
jmp INIT
Obrabotchik:
push ds
push cs
pop ds
mov FN, ah
mov al, ah
xor ah, ah
shl ax, 1
mov di, offset Addr_Table
add di, ax
call di
pop ds
iret
Func proc
xor ax, ax ;Обнуление регистра ax
mov ch, 0 ;номер дорожки
mov cl, 1 ;номер сектора
mov dh, 0 ;номер головки
mov dl, 0 ;номер устройства
push es ;сохранение регистра ES в стеке
mov ax, cs ;Настройка регистра ES на сегмент кода
mov es, ax
mov bx, offset BootSect ;Буфер для чтения сектора
mov ah, 2 ;Номер функции
mov al, 1 ;число секторов для чтения
int 13h ;Прерывание BIOS для чтения с диска
cmp ah, 0
jz Ok
jmp near ptr Goto_Ret
Ok:
mov OldSI, si ;Сохранение переданного указателя
mov si, offset BootSect ;Настройка регистра SI на начало буфера
pop es ;Восстановление из стека в регистр ES
add si, 39 ;Установка смещения
mov di, offset LabelOfDisk ;Настройка регистра DI на переменную
mov cx, 4
NextSymb: ;Перевод
mov al, [si] ;метки диска
mov [di], al ;из буфера
inc di
inc si
loop NextSymb ;в переменную
mov cx, 4
mov si, OldSI ;восстановление переданного в прерывание параметра в регистр SI
mov di, offset LabelOfDisk ;Настройка регистра DI на переменную
NextSymbol: ;Перенос
mov al, [di] ;метки диска
mov es:[si], al
inc di ;в сегмент
inc si ;программы, вызвавшей прерывание
loop NextSymbol
Goto_Ret:
ret
Func endp
Zaglushka proc
mov ah, 0EEh
ret
Zaglushka endp
OldSI dw 0 ;Переданный указатель, в котором находится адрес, по которому нужно записать метку диска
LabelOfDisk db 11 dup (0) ;Метка диска
Addr_Table dw 256 dup (0) ;Таблица адресов
FN db 0
BootSect db 512 dup (0) ;Буфер для чтения загрузочного сектора
INIT:
mov di, offset Addr_Table
mov si, offset Zaglushka
mov cx, 256
Label2:
mov [di], si
add di, 2
loop Label2
mov di, offset Addr_Table
add di, 66h
mov si, offset Func
mov [di], si
mov ah, 25h
mov al, 60h
lea dx, Obrabotchik
int 21h
lea dx, INIT
int 27h
KNSEG ends
end Start
Что я только не пробовал, DOS либо виснет или выводит сообщение
Код: Выделить всё
Memory allocation error
cannot load COMMAND, system halted