Страница 25 из 41
5.3.6 Анализ информации командной строки. При запуске многие программы позволяют пользователю поместить добавлчную информацию в командной строке, обычно указывающую имя файла, с которым программа будет работать. Эта информация записы- вается в 128-байтную область, начинающуюся со смещения 80H в префиксе программного сегмента [1.3.0]. (Эта же область исполь- зуется как DTA по умолчанию, как обсуждалось в [5.3.5].) Первый байт содержит длину строки, а затем идет сама строка.
Для программ, использующих метод дескриптора файла для работы с файлами, имя файла, вводимое в командной строке, должно иметь адекватную форму. Требуется, чтобы пользователь программы исполь- зовал стандартный протокол MS DOS для строки пути. С другой сто- роны, управляющий блок файла требует, чтобы строка вида 'A:ACCT.- BAK' была преобразована к виду 1,'ACCT BAK'. MS DOS имеет специальную функцию, которая выполняет такое преобразование над первой порцией информации, следующей за именем программы в ко- мандной строке. Эта процедура называется разбором строки (par- sing).
Средний уровень. Имя файла должно быть первой информацией, следующей за именем загружаемой программы. Оно должно быть отделено от имени програм- мы одним из следующих символов : . ; , = + табуляцией или пробе- лом. Конец имени файла должен быть указан одним из символов : . ; , = + \ < > | / " [ ] табуляцией, пробелом или одним из управляю- щих символов (коды ASCII от 1 до 31). Функция 29H прерывания 21H производит разбор имени файла. DS:SI должны указывать на смещение 81H в PSP. Помните, что при загрузке программы как DS, так и ES указывают на начало PSP. ES:DI должны указывать на область памяти, которая будет служить управляющим блоком для нового файла. Установка битов в AL опреде- ляет как будет выполняться разборка. Имеют значение только биты 0-3:
бит 0 1 = начальный ограничитель игнорируется 1 1 = байт, идентифицирующий накопитель, устанавливается в FCB, только если он указан в командной строке 2 1 = имя файла в FCB меняется только если командная строка содержит имя файла 3 1 = расширение файла в FCB меняется только если коман- ная строка содержит расширение файла
После того как эта информация установлена, программа может вызы- вать функцию. Если в командной строке не указан накопитель, то берется накопитель по умолчанию. Если отсутствует расширение файла, то предполагается, что оно пробельное (ASCII 32). Если в имени файла указана звездочка, то она заменяется на нужное число вопросительных знаков в поле имени файла FCB. AL возвращает 1, если имя файла содержит * или ? и FF, если указан неверный нако- питель. При возврате DS:SI указывают на первый символ, следующий за именем файла, которое начинается со смещения 81H. Дальнейшая информация, содержащаяся в командной строке должна расшифровы- ваться Вашей программой. ES:DI указывают на первый байт вновь сформированного FCB. Если в FCB не создано допустимого имени файла, то содержимое ES:[DI]+1 равно пробелу. Вот пример, который помещает код в область FCB в PSP, начиная со смещения 5CH:
;---разбираем командную строку, создавая FCB со смещением 5CH ;---в PSP MOV AH,29H ; MOV SI,81H ; MOV DI,5CH ; MOV AL,1111B ; INT 21H ; MOV AL,ES:[DI]+1 ; CMP AL,32 ; JE ERROR_ROUTINE ;
|