mov ax,word ptr es:[di].TrackSector ; получить
; значение слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr SectorBytes_Msg ; отобразить на экране
; дисплея количество байтов в секторе
mov ax,word ptr es:[id].SectorBytes ; получить значе-
; ние слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr НiddenSectors_Msg ; отобразить на экране
; дисплея количество скрытых секторов
mov ax,word ptr es:[di].HiddenSectors ; получить зна-
; чение слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
cmp word ptr es:[di].HiddenSectors,0 ; есть ли
; скрытые сектора?
je hidden_done ; нет, мы закончили
@DisStr PartitionInfo_Msg ; иначе, дать инфор-
; мацию о разделении
hidden_done:
@NewLine
;
@DisStr TotalSectors_Msg ; отобразить на экране
; дисплея общее количество секторов диска
mov ax,word ptr es:[di].TotalSectors ; получить
; значение слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr TotalBytes_Msg ; отобразить на экране
; дисплея общее количество байтов на диске
mov ax,word ptr TotalBytes ; получить значение,
; состоящее из двух слов и ...
mov dx,word ptr TotalBytes.2 ; поместить его в
; регистры AX и DX
call bin2dec2 ; и вывести на экран
; результат DX:AX
@NewLine
;
@DisStr ReservedSec_Msg ; отобразить на экране
; дисплея количество зарезервированных секторов
mov ax,word ptr es:[di].ReservedSec ; получить
; значение слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr FATsectors_Msg ;отобразить на
; экране дисплея количество секторов
; в одной таблице FAT
- 11-25 -
mov ax,word ptr es:[di].FATsectors ; получить
; значение слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr FATcopies_Msg ; отобразить на экране дисплея
; количество копий таблицы FAT
xor ah,ah ; очистить AH
mov al,byte ptr es:[di].FATcopies ; получить
; значение байта
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr TotalFATsectors_Msg ; отобразить на экране
; дисплея общее количество секторов для
; всех таблиц FAT
mov ax,word ptr TotalFATSec ; получить значение слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr DirEntries_Msg ; отобразить на экране
; дисплея количество элементов корневого каталога
mov ax,word ptr es:[di].DirEntries ; получить значение
; слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr DirSektors_Msg ; отобразить на экране
; дисплея общее количество секторов
; корневого каталога
mov ax,word ptr DirSectors ; получить значение слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr DataSectors_Msg ; отобразить на экране
; ; дисплея общее количество секторов данных
mov ax,word ptrDataSectors ; получить значение слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr ClusterSectors_Msg ; отобразить на экране
; дисплея количество секторов в кластере
xor ah,ah ; очистить AH
mov al,byte ptr es[di].ClusterSec ; получить значение
; байта
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr ClusterBytes_Msg ; отобразить на экране
; дисплея количество байтов в кластере
mov ax,word ptr ClusterBytes ; получить значение слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr Totalclusters-Msg ; отобразить на экране
; дисплея общее количество кластеров
- 11-26 -
mov ax,word ptr Totalclusters ; получить значение слова
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@NewLine
;
@DisStr FATentrySize_Msg ; отобразить на экране
; дисплея размер каждого элемента таблицы FAT
xor ah,ah ; очистить AH
mov al,byte ptr FATentryBits ; получить значение
; байта
@DisNum ax,10,1,0 ; вывод десятичного числа без знака
@DisStr Bits_Msg ; указать, что значение
; задано в битах
cmp byte ptr FATentryBits,12 ; определить, сколько
; имеется байтов
jg dis_two_bytes
@DisStr SmallFAT_Msg ; элемент таблицы FAT = 1,5 байта
jmp short show_fat_done
dis_two_bytes:
@DisStr LargeFAT_Msg ; элемент таблицы
; FAT = 2 байта
show_fat_done:
;
@NewLine
;
@DisStr DataBytes_Msg ; отобразить на экране дисплея
; количество байтов данных на диске
mov ax,word ptr DataBytes ; получить значение
mov dx,word ptr DataBytes.2 ; состоящее из двух
; слов и поместить его в регистры AX и DX
call bin2dec2 ; и вывести его на экран дисплея
@NewLine
;
push es ; сохранить текущее значение ES
mov ax,word ptr BootSeg ; получить адрес сегмента
; распределенного блока
mov es,ax ; и назначить ему ES
call memfree ; освободить блок
pop es ; восстановить значение ES
;
terminate:
@ExitToDOS ; завершить программу
;
;************************************************************
; Конец программы
;************************************************************
main ENDP ; конец главного процесса
;
;************************************************************
; Запуск стандартных программ
;*************************************************************
;
;+++++++++++++++++++++++++++++++++++++++++++++++++
; MEM_ERR_HANDLER: Описатель ошибки распределения памяти
; (освобождения памяти) изменения размера.
;BXОД: AX = код ошибки
; BX = максимальный доступный блок памяти
; (если код ошибки = 8)
; ЕX = адрес сегмента распределенного блока
- 11-27 -
; (если код ошибки = 9)
;
;ВЫХОД: ни один (все регистры восстановлены)
;
;Вызываемые стандартные программы : нет
;- - - - - - - - - - - - - - - - - - - - - - - - -
mem_err_handler PROC NEAR
;
cmp ax,7 ; очищенные от мусора управляющие
; блоки памяти ?
jne mem_error8 ; нет, продолжить проверку
.DATA
NranshedMemErr_Msg db "Ошибка распределения памяти:"
db"разрушены управляющие блоки памяти.",CR,LF,"$"
.CODE
@DisStr TrashedMemErr_Msg ; да, выйти с сообщением
ret ; возврат
;
mem_error8:
cmp ax,8 ; недостаточно памяти ?
jne mem_error9 ; нет, продолжить проверку
.DATA
InsuffMemErr_Msg db "Ошибка распределения памяти:"
db "недостаточно памяти",CR,LF
db "Hаибольший доступный блок памяти = $"
.CODE
@DisStr InsuffMemErr_Msg ; да, выйти с сообщением
@DisNum bx,10,1,0 ; доступен
@NewLine ; вывести на экран пустую строку
ret ; возврат
;
mem_error9:
cmp ax,9 ; неправильный адрес блока памяти?
jne mem_err_unknown ; нет, неизвестная причина
.DATA
IncorrSegAddr_Msg db "Неправильный адрес сегмента для изменения"
db "изменения размера/освобождения.",CR,LF
db "Адрес сегмента = $"
.CODE
@DisStr IncorrSegAddr_Msg ; вывести на экран
; дисплея сообщение об ошибке
@DisNum es,16,4 ; вывести на экран дисплея адрес
; сегмента
@NewLine ; вывести на экран пустую строку
ret ; возврат
;
mem_err_unknown:
.DATA
UnknownMemErr_Msg db "Hеизвестная ошибка распределения/"
db "/изменения размера/освобождения памяти.",CR,LF,"$"
.CODE
@DisStr UnknownMemErr_Msg ; вывести на экран
; дисплея сообщение
ret
;
mem_err_handler ENDP
- 11-28 -
;
;;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; MEMALLOC: Распределить блок памяти заданного размера в