Dos7book
.pdf
Глава 9: |
Примеры композиции исполняемых файлов |
|||
; 05C - адрес перехода со строки 06C |
||||
CS: |
|
|
;=03C |
Подготовлено ли в CS:002Fh |
cmp byte ptr |
[002F],FE |
; 03D |
смещение записи CDS? |
|
jnb |
008E |
|
;*042 |
Возврат назад, если нет |
mov |
AH,52 |
|
; 044 |
Запросим "Список Списков" |
int |
21 |
|
; 046 |
Адрес возвращен в ES:BX |
ES: |
|
|
; 048 |
Загрузим адрес 1-й записи |
les |
BX,[BX+16] |
; 049 |
CDS в регистры ES:BX |
|
CS: |
|
|
; 04C |
Вычислим смещение CDS |
add |
BX,[002F] |
;*04D |
1-го фиктивного диска |
|
CS: |
|
|
; 051 |
FFh в ячейке 002Fh значит |
mov byte ptr |
[002F],FF |
;*052 |
что проверка выполнялась |
|
CS: |
|
|
; 057 |
Считаем число записей CDS |
mov |
AH,[000A] |
; 058 |
для фиктивных дисков |
|
cmp |
AH,01 |
|
;=05C |
Сравним это число с 01h |
jb |
008E |
|
;*05F |
Выходим, если дисков нет |
ES: |
|
|
; 061 |
Внесем недействительные |
mov word ptr |
[BX+43],0000 |
; 062 |
атрибуты в запись CDS |
|
add |
BX,0058 |
|
; 067 |
Найдем следующую CDS |
dec |
AH |
|
; 06A |
Число оставшихся циклов |
jmp |
005C |
|
;*06C |
Повтор для следующей CDS |
;******** Секция 5: программа прерывания
;06E - указан в слове 008
;08E - адрес перехода от 042, 05F, 082, 13C
pushf |
|
;=06E |
Точка входа |
push |
ES |
; 06F |
Сохраним состояния |
push |
BX |
; 070 |
флагов и регистров |
push |
AX |
; 071 |
|
CS: |
|
; 072 |
Загрузим адрес данных |
les |
BX,[0012] |
;*073 |
запроса в ES:BX |
ES: |
|
; 077 |
Зададим статус |
mov word ptr |
[BX+03],8007 |
; 078 |
"непригодный носитель" |
ES: |
|
; 07D |
Проверим код операции |
cmp byte ptr |
[BX+02],01 |
; 07E |
в блоке данных запроса |
ja |
008E |
;*082 |
Выходим, если больше 01h |
jz |
003C |
;*084 |
Если 01h, то - в секцию 4 |
CS: |
|
; 086 |
Если меньше 01h, то эта |
cmp byte ptr |
[002F],FE |
;*087 |
инициализация - первая? |
jz |
00C3 |
;*08C |
Если да - к инициализации |
pop |
AX |
;=08E |
Восстановим |
pop |
BX |
; 08F |
состояния регистров |
pop |
ES |
; 090 |
|
popf |
|
; 091 |
Восстановим флаги |
retf |
|
; 092 |
и вернем управление DOS |
|
|
|
– 531 – |
|
Глава 9: |
Примеры композиции исполняемых файлов |
||
|
;******** Секция 6: адреса таблицы BPB для дисков |
|||
|
; 093 - упомянут в строках 11E, 12A |
|||
dw |
0016,0016,0016,0016,0016,0016,0016,0016 |
|||
dw |
0016,0016,0016,0016,0016,0016,0016,0016 |
|||
dw |
0016,0016,0016,0016,0016,0016,0016,0016 |
|||
|
;********** Секция 7: нерезидентная часть драйвера |
|||
|
; 0C3 - адрес перехода от строки 08C |
|||
push |
DX |
|
;=0C3 |
Сохраним |
push |
DS |
|
; 0C4 |
состояния регистров |
push |
SI |
|
; 0C5 |
|
cld |
|
|
; 0C6 |
Счет - на приращение |
ES: |
|
|
; 0C7 |
Занесем в AH номер диска, |
mov |
AH,[BX+16] |
; 0C8 |
который предлагает DOS |
|
mov |
AL,41 |
|
; 0CB |
Преобразуем номер диска в |
add |
AL,AH |
|
; 0CD |
букву диска в AL |
CS: |
|
|
; 0CF |
Заменим этой буквой диска |
mov |
[01E0],AL |
;*0D0 |
букву в сообщении 2 |
|
mov |
AL,58 |
|
; 0D3 |
Найдем смещение записи CDS |
mul |
AH |
|
; 0D5 |
первого фиктивного диска |
CS: |
|
|
; 0D7 |
Запишем смещение |
mov |
[002F],AX |
;*0D8 |
в ячейку CS:[002F] |
|
|
;******* Секция 8: считывание из командной строки |
|||
;0E2 - адрес перехода от строки 0E7
;0E9 - адрес перехода от строки 0EE
ES: |
|
; 0DB |
Указатель на аргументы |
lds |
SI,[BX+12] |
; 0DC |
командной строки в DS:SI |
mov |
DX,013F |
;*0DF |
Смещение 1-го сообщения |
lodsb |
|
;=0E2 |
Загрузим в AL знак и |
cmp |
AL,20 |
; 0E3 |
организуем цикл поиска |
jb |
00F8 |
;*0E5 |
первого пробела после |
ja |
00E2 |
;*0E7 |
имени драйвера |
lodsb |
|
;=0E9 |
Загрузим в AL знак и |
cmp |
AL,20 |
; 0EA |
организуем цикл поиска |
jb |
00F8 |
;*0EC |
первой значащей буквы |
jz |
00E9 |
;*0EE |
после первого пробела |
cmp |
AL,43 |
; 0F0 |
Буква меньше чем C: ? |
jb |
00F8 |
;*0F2 |
Если да, то - в секцию 9 |
cmp |
AL,59 |
; 0F4 |
Буква меньше чем Y: ? |
jbe |
0102 |
;*0F6 |
Если да, то - в секцию 10 |
|
;********* Секция 9: выведение на экран сообщений |
||
|
; 0F8 - переходы от строк 0E5, 0EC, 0F2, 10C |
||
push |
CS |
;=0F8 |
Подготовим DS = CS для |
pop |
DS |
; 0F9 |
адресации сообщений |
mov |
AH,09 |
; 0FA |
Вызовем функцию выведения |
|
|
|
– 532 – |
|
Глава 9: |
Примеры композиции исполняемых файлов |
||
int |
21 |
; 0FC |
сообщений на |
экран |
mov |
AL,00 |
; 0FE После ошибки - 0 дисков |
||
jmp |
010E |
;*100 Готовимся к возврату |
â DOS |
|
|
;************* Секция 10: размер резидентной части |
|||
;102 - адрес перехода со строки 0F6
;10E - адрес перехода со строки 100
inc |
AL |
|
;=102 |
Получим букву RAM-диска |
mov |
DX,01C3 |
; 104 |
Смещение 2-го сообщения |
|
CS: |
|
|
; 107 |
Рассчитаем число дисков |
sub |
AL,[01E0] |
;*108 |
которое надо запросить |
|
jb |
00F8 |
;*10C |
Если меньше 0, то ошибка |
|
ES: |
|
|
;=10E |
Запишем число дисков |
mov |
[BX+0D],AL |
; 10F |
в блок данных запроса |
|
CS: |
|
|
; 112 |
Запишем число дисков |
mov |
[000A],AL |
; 113 |
в заголовок драйвера |
|
mov |
AH,00 |
; 116 |
Вычислим смещение для |
|
cmp |
AL,00 |
; 118 |
указателя на 1-й байт |
|
jz |
0121 |
;*11A |
после резидентной части |
|
shl |
AX,1 |
; 11C |
драйвера по формуле |
|
add |
AX,0093 |
;*11E |
(2*AX + 093h) |
|
;************* Секция 11: заполнение блока запроса |
||||
; 121 - адрес перехода со строки 11A |
||||
ES: |
|
|
;=121 |
Запишем размер резидентной |
mov |
[BX+0E],AX |
; 122 |
части в блок запроса |
|
ES: |
|
|
; 125 |
Припишем сегмент к размеру |
mov |
[BX+10],CS |
; 126 |
резидентной части |
|
ES: |
|
|
; 129 |
Смещение для указателей на |
mov word ptr |
[BX+12],0093 |
;*12A |
на BPB фиктивных дисков |
|
ES: |
|
|
; 12F |
Припишем сегмент к |
mov |
[BX+14],CS |
; 130 |
указателям на BPB |
|
ES: |
|
|
; 133 |
Объявим успех в статусе |
mov word ptr |
[BX+03],0100 |
; 134 |
в блоке данных запроса |
|
pop |
SI |
|
; 139 |
Восстановим |
pop |
DS |
|
; 13A |
состояния регистров |
pop |
DX |
|
; 13B |
|
jmp |
008E |
;*13C |
Перейдем для возврата DOS |
|
;*********** Секция 12: сообщения об ошибках |
||||
; 13F - 1-е сообщение, указано в строке 0DF |
||||
db |
0D |
0A "SkipDsk: diskletter isn" 27 "t found" |
||
db |
20 |
"or out of range" 0D 0A |
||
db |
"Example:" 0A "device=A:\SkipDsk.sys Q:" |
|||
db |
0D |
0A 09 09 09 "Q: - diskletter (C: - Y:)" |
||
db |
20 |
"to be skipped" 0D 0A 0A 24 |
||
;1C3 - 2-е сообщение, указано в строке 104
–533 –
