• Драйверы и резидентные программы, использующие область НМА, не должны держать линию А20 постоянно включенной, т. к. это может привести к неправильной работе программ, не рассчитанных на наличие и доступностьэтой области.
• Векторы прерываний не должны указывать в область НМА. Эторезультат предыдущего ограничения.
4. Примеры использования драйвера HIMEM.SYS.
Данная программа копирует флоппи диск через расширенную память. Эта программа написана на Ассемблере:
.286
.MODEL TINY
JUMPS
S SEGMENT STACK
db 128 dup(?)
S ENDS
DATA SEGMENT
buffer db 32770 dup(0)
number_drive db 1
sectors dw 0
numb_s dw 0 ; номер копируемого сектора
handle dw 0
LengthBlock dd 32768
SourceHandle dw 0
SourceOffset dd 0
DestHandle dw 0
DestOffset dd 0
HMMEntryPt dd 0
all db "Всего : 0000 секторов",13,'$'
mess db 10,13,"Вставте следующий диск и нажмите любую клавишу",10,13,'$'
mess1 db "Ошибка при работе с линией A20 (82h) !",10,13,'$'
mess2 db "Вся расширенная память уже распределена!!!",10,13,'$'
mess3 db "Больше нет свободных блоков EMB.",10,13,'$'
mess4 db "Ошибка : Нет диска в дисководе.",10,13,'$'
mess5 db "Ошибка : Диск защищен от записи или нет диска в дисководе.",10,13,'$'
mess6 db "Копирование c дискеты",10,13,'$'
mess6_1 db "Запись на дискету",10,13,'$'
mess8 db "Драйвер himem.sys отсутствует",10,13,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:S
start:
mov bx,DATA
mov ds,bx
mov ah,09h
mov dx,offset mess7
int 21h
; считывание корневого сектора дискеты
mov al,number_drive
mov cx,1
mov dx,0
mov bx,offset buffer
int 25h
pop ax
jnb ok1
mov bl,01h
jmp Error
ok1: mov ax,word ptr [bx][13h]
mov sectors,ax
; проверка наличия himem.sys
mov ax,4300h
int 2fh
mov bl,0eeh
cmp al,80h
jne Error
mov ax,4310h
int 2Fh
mov word ptr [HMMEntryPt][0],bx ; получение адреса программы управления XMS
mov word ptr [HMMEntryPt][2],es
mov ah,05h ; локальное открывание линии A20
call HMMEntryPt
or ax,ax
jz Error
mov ah,09h ; запрос блока памяти
mov dx,1500d
call HMMEntryPt
or ax,ax
jz Error
mov handle,dx
; первоначальное заполнение таблицы для копирования
mov bx,offset buffer
mov word ptr SourceOffset[0],bx
mov word ptr SourceOffset[2],ds
mov bx,handle
mov DestHandle,bx
mov word ptr DestOffset[0],0
mov word ptr DestOffset[2],0
mov ah,09h
mov dx,offset mess6
int 21h
mov cx,45 ; кол-во секторов на диске
mov si,offset LengthBlock
next_sector:
; считывание группы секторов
mov al,number_drive
mov dx,numb_s
push cx
mov cx,64d
mov bx,offset buffer
int 25h
pop cx
pop cx
add numb_s,64d
; копирование блока памяти в EMB
mov ah,0Bh ;ф-ия 0B - копирование блока
call HMMEntryPt ;вызов драйвера
or ax,ax ;проверка на ошибку
jz Error ;если ошибка то переход на метку Error
call OutDec ;вызов процедуры OutDec
add word ptr DestOffset[0],32768d ;увеличение текущего смещения в EMB
adc word ptr Destoffset[2],0 ;прибавляем 32кб в первое слово
;и 0 - во второе
loop next_sector ;продолжение цикла
mov ah,09h ;вывод на экран сообщения
mov dx,offset mess ;"Вставьте следующий диск ..."
int 21h
mov ah,08h ; ожидание нажатия клавиши
int 21h
; первоначальное заполнение таблицы для копирования
mov numb_s,0
mov DestHandle,0
mov bx,offset buffer
mov word ptr DestOffset[0],bx
mov word ptr DestOffset[2],ds
mov bx,handle
mov SourceHandle,bx
mov word ptr SourceOffset[0],0
mov word ptr SourceOffset[2],0
mov cx,45 ; кол-во секторов на диске
mov ah,09h
mov dx,offset mess6_1
int 21h
mov si,offset LengthBlock
next_copy:
; копирование блока из EMB в память
mov ah,0Bh
call HMMEntryPt
or ax,ax
jz Error
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.