Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
75
Добавлен:
09.02.2015
Размер:
5.1 Mб
Скачать

Глава 6: Избранные программы для MS-DOS7

4-я строка: добавление выделенных файлов в архив. Добавление вызывается нажатием клавиши F5 (копирование), если архив открыт в пассивной панели.

5-я строка: удаление файлов из архива. Эта операция вызывается нажатием клавиши F8 (удаление).

Операция распаковки, указанная в третьей строке записи, вызывается также нажатием клавиш F3 (просмотр) и F4 (редактирование), но в таких случаях

результат распаковки помещается во временный файл и сразу передается той программе, которая определена в установках файлов VCVIEW.EXT и VCEDIT.EXT. Для редко встречающихся архивов, активно пользоваться которыми заведомо не придется, бывает достаточно операций просмотра содержания и извлечения запрашиваемых файлов. В таких случаях длина соответствующей записи в файле VCARCH.EXT может быть сокращена до трех строк.

Во время интерпретации строк в записях файла VCARCH.EXT файл-менеджер не предоставляет доступа к переменным окружения, но вместо того предоставляет возможность пользоваться несколькими особыми макрокомандами, отличающимися от тех, которые доступны при интерпретации строк в файлах расширения. Вот список макрокоманд, которыми можно пользоваться в файле

VCARCH.EXT:

!A

вставка имени файла с предшествующим путем

!T

вставка пути к каталогу для временных файлов

!F

вставка имени файла, выделенного левой кнопкой "мыши"

!M

вставка группы имен файлов, выделенных правой кнопкой

 

"мыши"

!@

вставка имени временного файла, содержащего список имен

 

файлов, выделенных правой кнопкой "мыши".

В любом случае все программы, упоминаемые в строках файла VCARCH.EXT, должны быть доступны по путям, записанным в значение переменной PATH.

Ниже приведены предлагаемые примеры записей для файла VCARCH.EXT.

ARC: N S W C W D T W Pkxarc.exe –v !A Pkxarc.exe –e !A @!@

BSA:

BSN: W S C W W D "–" M "–" Y T A L N; W S C W W D "–" M "–1" Y T A L N Bsa.exe v !A

Bsa.exe x –S !A @!@

CAB: M "–" D "–" Y T A S N; N ":" W W W W W W W Extract.exe /d !A

Extract.exe /e !A !M

– 241 –

Глава 6: Избранные программы для MS-DOS7

RAR:

 

 

 

 

R0?:

 

 

 

 

R1?:

 

 

 

 

R2?: "*" N L

S

C W D T A

W

W W; N L S C W D T A W W W

Unrar.exe

v –r –w!T

!A

 

Unrar.exe

x –r –w!T

!A @!@

Rar.exe

a

–std –ds –r

–rr -ems- –w!T !A @!@

Rar.exe

d

-std –r –rr

-ems- –w!T !A @!@

TAR: A W S N

L

 

 

 

Tar.exe

-tvf !A

 

 

Tar.exe

-xnf !A !M !F

 

UHA: N S D "-"

M "-" Y T

A

 

Uharcd.exe

l -y+ !A

 

 

Uharcd.exe

x !A !M

!F

 

ZIP:

??!: ?$:

??$: S W C W D T W A N Pkunzip.exe –v !A Pkunzip.exe –d !A @!@

Pkzip.com –b!T –P –wHS !A @!@ Pkzip.com –b!T -d !A @!@

1:

2:

3:

4:

Z:M "–" D "–" Y T S A C N Command.com /c Icomp.exe –l –h !A

Command.com /c Icomp.exe –d –i –h !A !F

Впоставке файл-менеджера Volcov Commander версии 4.99.07 имеется образец файла VCARCH.EXT, содержащего записи для довольно большого числа разных архивов. Предложенные здесь записи не следует рассматривать как законченный файл, скорее это просто совокупность примеров, которые отличаются от записей в оригинальном файле и могут быть введены туда по мере надобности. Упоминаемые здесь и многие другие программы архивирования, отсутствующие в поставке Windows-95/98, имеются в обширной коллекции программ на сервере ftp://ftp.elf.stuba.sk/pub/pc/pack/ .

242 –

Глава 6: Избранные программы для MS-DOS7

6.26XCOPY.EXE – копирование файлов и каталогов

Программа XCOPY.EXE копирует файлы и каталоги со всеми подкаталогами. Ей необходимо, чтобы в одном каталоге с ней находился вспомогательный файл XCOPY32.EXE. Вот пример пользования программой XCOPY.EXE:

XCOPY.EXE D:\TEMP\*.* C:\DOS /A /D /P /S /V /W

здесь:

D:\TEMP\*.* – пример пути и маски для копируемых файлов.

C:\DOS

пример пути к каталогу назначения.

/A

копировать только файлы с атрибутом "A". Параметр /M

 

означает то же, но со снятием атрибута "A" при копировании.

/D

не копировать файлы, копии которых с той же или более поздней

 

датой обновления уже имеются в каталоге назначения. Если

 

после параметра /D указана дата (например, /D:18/12/2003), то

 

будут копироваться только файлы, имеющие более позднюю

 

дату обновления (примечание 2).

/P

запрашивать разрешение на каждый акт копирования.

/S

копировать каталоги и подкаталоги, за исключением пустых.

 

Если совместно указать параметры /S /E, то пустые каталоги

 

будут копироваться тоже.

/V

сверять каждую копию файла с оригиналом.

/W

задержка исполнения копирования до получения сигнала с

 

клавиатуры: нажатия любой клавиши (для обеспечения

 

возможности смены дискет).

Примечание 1: в операционной среде MS-DOS программа XCOPY.EXE не копирует файлы, имеющие атрибуты H (скрытый) и S (системный). Эту и ряд других функций программа XCOPY.EXE выполняет только в "окне DOS" операционной системы Windows.

Примечание 2: формат даты после параметра /D, зависит от установок, заданных командой COUNTRY (4.05). В любом случае формат даты должен быть такой же, какой выдает команда DATE (3.08).

Примечание 3: в MS-DOS8 файл XCOPY32.EXE переименован в XCOPY32.MOD.

Примечание 4: в рамках проекта FreeDOS в 2003 году Rene Ableidinger написал одноименную программу XCOPY.EXE, которая выложена на сервере ftp://sunsite.unc.edu/pub/micro/pc-stuff/freedos/files/dos/ в

составе файла архива RXCOPY2.ZIP. Эта программа, в отличие от описанной выше программы фирмы Microsoft, не нуждается во вспомогательных файлах и способна в среде MS-DOS7 копировать все, включая файлы с атрибутами HS (скрытые и системные).

– 243 –

Глава 7 Ассемблерные команды отладчика Debug.exe

Стоит ли сейчас тратить время на ассемблерные команды архаичного отладчика DEBUG.EXE, когда существуют более совершенные ассемблеры например, MASM ? Этот вопрос заставляет вспомнить историю. Еще в 1950-х годах были созданы вычислительные машины, способные исполнять сразу несколько прикладных программ, запускаемых с разных терминалов. Каждой программе надо было предоставить не всю оперативную память, а лишь ее часть. В связи с этим были стандартизованы форматы исполняемых файлов с заголовком, в котором каждая программа заявляла необходимое ей пространство оперативной памяти. Тогда же ассемблеры и трансляторы, не обеспечивающие автоматического формирования заголовков исполняемых файлов, стали считать устаревшими. Именно такое отношение к себе унаследовал отладчик DEBUG.EXE.

Более совершенные ассемблеры автоматически формируют заголовки и адреса переходов. Это большое удобство, но у него есть обратная сторона: потеря свободы манипулирования адресным пространством и сегментными регистрами. Такие ограничения несущественны для прикладных программ, но могут препятствовать решению исследовательских и системных задач. По этой причине, кстати, ассемблер MASM откажется компилировать примеры программ из разделов 9.06, 9.08 и 9.10. Подобные не допускаемые ассемблером фрагменты были обнаружены в прошивках BIOS и даже в загрузочных модулях операционной системы Windows-XP. Однако то, что не позволяет сделать ассемблер MASM, можно сделать с помощью отладчика DEBUG.EXE.

При подборе материалов в этой книжке не менее важно то, что для начального

знакомства с программированием в учебных целях предпочтительны инструменты более простые и наглядные, чем ассемблеры MASM или TASM. Отладчик DEBUG.EXE выделяется уникальной комбинацией качеств, которая делает его незаменимым для начального обучения системному программированию:

во-первых, он дает наглядное представление о машинном коде;

во-вторых, он сочетает в себе средства ассемблирования и отладки;

в-третьих, он предоставляет доступ к системным областям памяти;

в-четвертых, он интерактивно взаимодействует с пользователем.

Хотя отладчик DEBUG.EXE может подать на исполнение процессору любой машинный код, тем не менее полного описания всех машинных команд в этой книжке нет. Материал отобран так, чтобы вложиться в разумные рамки объёма и притом по мере возможности упростить Ваше начальное знакомство с ним. Потому основу содержания 7-й главы составляют ассемблерные команды, "понимаемые" версией отладчика DEBUG.EXE из комплекта поставки операционных систем Windows-95/98. Они представляют лишь часть команд современных процессоров

– 244 –

Глава 7: Ассемблерные команды отладчика Debug.exe

платформы x86, но эта часть играет особую роль. Во-первых, она включает почти все наиболее активно используемые команды. Во-вторых, число компьютеров, которым "понятны" эти команды, сейчас достигло 96% всего парка действующих компьютеров. Совместимость машинных кодов у подавляющего большинства современных компьютеров "держится" именно на том подмножестве команд, которое представлено здесь.

Более "свежие" команды у процессоров разных фирм совпадают не всегда. Тем

не менее некоторые из таких команд получили широкое признание и необходимы для настройки современных компьютеров. В порядке исключения несколько таких команд и префиксов также приведены здесь, причем они представлены машинными кодами, чтобы их можно было бы вводить как данные независимо от того, каким вариантом отладчика Вам предстоит пользоваться. В любом случае это не будет препятствовать отладке программ, содержащих такие коды.

Для использования в качестве ассемблера отладчик DEBUG.EXE должен быть переведен в режим ассемблирования (6.05-02). Ассемблерный диалект отладчика имеет особенности, но основные принципы композиции ассемблерных команд везде одинаковы. Командная строка начинается с имени команды, за которым обычно следуют операнды. Между именем команды и операндами иногда требуется вводить маркер типа операнда. Если указаны несколько операндов, то они разделяются знаком запятой. Команды, которые выдают численный результат, замещают им свой первый (левый) операнд, и тогда прежнее содержимое того регистра или той ячейки памяти теряется. Примеры командных файлов с переводом отладчика DEBUG.EXE в режим ассемблирования и с множеством конкретных ассемблерных команд даны в разделах 9.05, 9.06, 9.08, 9.10.

Поскольку альтернативные спецификации ассемблерных команд весьма разнообразны, некоторым переменным и операндам в главе 7 даны легко опознаваемые обозначения, одни и те же во всех последующих описаниях ассемблерных команд. Допустимые подстановки для этих обозначений вместе с пояснениями приведены в следующей таблице.

Таблица 7.00

Обозначения

Пояснения и допустимые подстановки

bl

Любой из следующих однобайтовых регистров:

 

AL ,CL, DL ,BL, AH, CH, DH, BH .

bx

Любой из следующих двухбайтовых регистров:

 

AX , CX , DX , BX, SP, BP, SI , DI .

ss

Любой из сегментных регистров: CS, DS, ES, SS.

ST

Регистр ST(0) стека сопроцессора (примечание 1)

ST(0-7)

Любой регистр стека сопроцессора от ST(0) до ST(7)

far

Маркер 4-байтового адреса (сегмент + смещение).

 

– 245 –

 

Глава 7:

Ассемблерные команды отладчика Debug.exe

Продолжение таблицы 7.00

 

 

 

 

byte ptr

 

Маркер однобайтового операнда (ptr = "pointer")

 

 

 

 

 

 

word ptr

 

Маркер 2-байтового операнда (слова)

 

 

 

dword ptr

 

Маркер 4-байтового операнда

 

 

 

qword ptr

 

Маркер 8-байтового операнда

 

 

 

tbyte ptr

 

Маркер 10-байтового операнда

 

 

 

f

 

Любая одиночная шестнадцатеричная цифра

 

 

 

±7f

 

Любое шестнадцатеричное число от –7Fh до +7Fh

 

 

 

ff

 

Любое шестнадцатеричное число от 00h до FFh

 

 

 

ffff

 

Любое шестнадцатеричное число от 0000h до FFFFh

 

 

 

aaaa

 

Адрес для "коротких" переходов (примечание 2)

 

 

 

[bp+si+ffff]

 

Выражение в квадратных скобках означает адресацию

 

 

 

 

 

операнда, находящегося в ячейке памяти. Адрес этой

 

 

 

 

 

ячейки (смещение) определяется путем вычисления

 

 

 

 

 

выражения. Две группы форм таких выражений,

 

 

 

 

 

используемых при 16-разрядной адресации, показаны

 

 

 

 

 

ниже в примечаниях 3 и 4.

 

 

Примечание 1: верхний

регистр стека

арифметического сопроцессора обычно

 

обозначается ST(0), но

в некоторых позициях, где вместо него

нельзя использовать какой-либо другой регистр, отладчик DEBUG.EXE принимает сокращенное обозначение ST.

Примечание 2: "aaaa" – число, содержащее не более четырех шестнадцатеричных цифр и обозначающее адрес перехода (смещение) в командах "ближней" передачи управления. Это смещение должно быть в пределах окрестности ±7fh от следующей машинной команды, иначе отладчик DEBUG.EXE выдаст сообщение об ошибке.

Примечание 3: выражения первой группы дают смещение, отсчитываемое от сегментного адреса в регистре DS:. Эти выражения представляют

собой

 

либо просто смещение:

[ffff]

либо ссылку на число в регистре:

[BX], [DI], [SI]

либо сумму чисел из двух регистров:

[BX+DI], [BX+SI]

либо сумму со смещением:

 

[BX±7f], [BX+ffff], [BX+DI±7f], [BX+DI+ffff], [BX+SI±7f],

[BX+SI+ffff], [DI±7f], [DI+ffff], [SI±7f], [SI+ffff].

Примечание 4: выражения второй группы отличаются

тем, что ссылаются на

регистр BP и дают смещение, отсчитываемое относительно сегментного регистра SS:

[BP+DI], [BP+SI], [BP±7f], [BP+ffff], [BP+DI±7f], [BP+DI+ffff], [BP+SI±7f], [BP+SI+ffff].

– 245 –

Глава 7: Ассемблерные команды отладчика Debug.exe

Примечание 5: в качестве разделительного знака перед именами регистров в выражениях можно использовать знак минус, и результат от этого не изменяется: та же сумма вычисляется в любом случае.

Примечание 6: принимаемый по умолчанию сегментный регистр может быть заменен другим посредством введения префикса (7.02-01).

Примечание 7: если ассемблерная команда не содержит маркера типа операнда

("byte ptr", "word ptr"...), то отладчик DEBUG.EXE определяет тип операнда по регистру, содержащему другой операнд. Обращение к двухбайтовому регистру (AX, BX...) определяет двухбайтовый операнд типа "word", обращение к однобайтовому регистру (AL, AH, BL...) определяет однобайтовый операнд типа "byte". Но когда обращений к регистру в команде нет, наличие маркера типа операнда становится обязательным. В любом случае маркеры типа операнда можно сокращать до двух букв: "by", "wo", и т.д.

7.01Управляющие инструкции отладчика

При работе в режиме ассемблирования отладчик DEBUG.EXE воспринимает не только ассемблерные команды, но также управляющие инструкции, которые в машинный код не транслируются, но влияют на процесс трансляции и потому могут играть очень важную роль.

7.01-01 DB – инструкция ввода байтов

Инструкция DB ("Data Byte" = байт данных) сообщает отладчику DEBUG.EXE, что данные, следующие за ней в той же строке, не нужно интерпретировать как ассемблерную команду, а нужно просто по байтам ввести их в машинный код.

Каждый байт данных представляется двумя шестнадцатеричными цифрами без добавления буквы "h". Помимо того, строка может включать последовательности знаков кода ASCII, заключенные в кавычки или в двойные кавычки. Обе формы представления данных можно чередовать в любом порядке. Последовательности знаков кода ASCII, за исключением окружающих их кавычек, переводятся в шестнадцатеричные цифры байт за байтом. В строках с инструкцией DB комментарии не допускаются. Вот пример пользования инструкцией DB:

DB 71 6C 65 'data array'

Примечание 1: при дизассемблировании машинного кода могут встретиться байты, которые отладчик DEBUG.EXE не идентифицирует как "известные" ему машинные команды. Тогда "DB" выводится в качестве префикса перед каждым таким байтом.

– 245 –

Глава 7: Ассемблерные команды отладчика Debug.exe

7.01-02 DW – инструкция ввода слов

Инструкция DW ("data word" = слово данных) сообщает отладчику DEBUG.EXE, что данные, следующие за ней в той же строке, не нужно интерпретировать как ассемблерную команду, а нужно ввести их в машинный код как двухбайтовые слова. Каждое слово должно включать не более четырех шестнадцатеричных цифр. Если в слове менее четырех цифр, оно автоматически будет дополнено нулями в старших разрядах. В составе машинного кода две младших цифры каждого слова образуют первый байт, а две старших цифры того же слова следующий байт. Строка с инструкцией DW может содержать группы знаков кода ASCII, заключенные в кавычки или двойные кавычки. Эти знаки переводятся в шестнадцатеричные цифры по одному байту на знак, то есть точно так же, как после инструкции DB (7.01-01). В строках с инструкцией DW комментарии не допускаются. Вот пример пользования инструкцией DW:

DW 71A0 F01 06D5 "other key" 0FFF

7.01-03 ORG – инструкция смены адреса

Инструкция ORG (ORGanize = организовать) сообщает отладчику DEBUG.EXE, что машинные коды ассемблируемых команд, начиная со следующей, надлежит записывать в другой адрес памяти в тот, который указан в строке вслед за инструкцией ORG. После этого адреса в той же строке может следовать комментарий (7.01-05). На процесс исполнения ассемблированных машинных кодов инструкция ORG не влияет.

При интерактивной работе в режиме ассемблирования инструкция ORG позволяет перемещаться по адресному пространству, чтобы корректировать ошибки

ите отсылки вперед, которые нельзя правильно написать заранее.

Впробных командных файлах отладчика инструкция ORG позволяет фиксировать положения точек рестарта и точек назначения переходов (пример в разделе 9.02-02). Резервирование свободного адресного пространства перед

фиксированными позициями точек назначения помогает избежать пересчета адресов, который иначе был бы необходим при каждом внесении исправлений в предыдущие части того же пробного командного файла.

Примеры

Действие

ORG ffff:ffff

установить заданные сегментный адрес и смещение

ORG fff

задать смещение 0fffh, сегментный адрес не изменять

ORG

ss:ffff

установить сегментный адрес из ss:, смещение ffffh

ORG

ss:

установить сегментный адрес из ss:, смещение 0000h

– 246 –

Глава 7: Ассемблерные команды отладчика Debug.exe

7.01-04 Инструкция "пустая строка"

Абсолютно пустая строка, без команд, без инструкций и без комментариев, сама по себе воспринимается отладчиком DEBUG.EXE как инструкция выйти из режима ассемблирования в обычный режим отладки, при котором DEBUG.EXE не будет воспринимать команды, описываемые в главе 7, но начнет воспринимать команды, описываемые в разделах 6.05-016.05-23. При вводе ассемблерных команд с

клавиатуры для этого достаточно оставить последнюю строку пустой и просто нажать клавишу ENTER. При вводе ассемблерных команд через перенаправление

переход в режим отладки будет вызван первой встреченной пустой строкой в ассемблерном тексте. Поэтому перед посылкой файла на исполнение необходимо убедиться, что внутри блока ассемблерных команд пустых строк нет, и что конец блока ассемблерных команд отмечен обязательным наличием пустой строки.

7.01-05 Точка с запятой инструкция ввода комментариев

Знак точки с запятой " ; ", встреченный отладчиком DEBUG.EXE в любом месте ассемблерной строки, воспринимается как инструкция не переводить в машинный

код сам знак точки с запятой и игнорировать все последующие знаки до конца данной строки. Благодаря такому действию знак точки с запятой используется в ассемблерных текстах для введения комментариев к командам.

Примечание 1: если строка содержит только комментарий, начинающийся со знака точки с запятой, то такая строка не считается пустой и не вызывает перехода в режим отладки (7.01-04). Это позволяет вводить в

ассемблерные тексты заголовки и многострочные комментарии. Примечание 2: сообщение отладчика " ^ Error" (= ошибка), указывающее на знак

точки с запятой в предыдущей строке, означает, что ошибка имеется в предшествующей части строки. Наиболее вероятно, отладчик DEBUG.EXE считает спецификацию команды незавершенной из-за отсутствия какого-либо обязательного параметра.

Примечание 3: знак точки с запятой нельзя использовать для введения комментариев в строках с управляющими инструкциями DB и DW, а также при работе отладчика DEBUG.EXE вне режима ассемблирования.

7.02Префиксы

Вмашинном коде AT-совместимых компьютеров имеются несколько конкретных байтов, которые наделены особым статусом префиксов. Каждый из них не является отдельной машинной командой. Однако байт префикса, встреченный процессором в позиции, предшествующей первому байту кода машинной команды,

247 –

Глава 7: Ассемблерные команды отладчика Debug.exe

заставляет изменить характер ее интерпретации или ее исполнения. Далее одной команды действие префиксов не распространяется.

Отладчик DEBUG.EXE допускает указание префикса отдельной строкой перед той ассемблерной командой, на которую должен действовать префикс, например:

CS:

 

ADD

byte ptr [BX],0F

Однако в равной мере допустимо указание префикса перед ассемблерной командой в одной строке:

CS: ADD byte ptr [BX],0F

Машинной команде могут предшествовать до четырех префиксов, если их действие не противоречит друг другу. Все префиксы при одной команде должны быть разные, повторение любого префикса не допускается.

7.02-01 Префиксы смены сегмента

В большинстве ассемблерных команд сегментный адрес не указывают. Абсолютные адреса (примечание 2 к 6.05-01) для таких команд процессор

вычисляет на основе сегментного адреса из принимаемого по умолчанию сегментного регистра (примечания 3 и 4 к таблице 7.00). Префиксы смены сегмента

позволяют назначить желаемый сегментный регистр для вычисления адреса в ходе исполнения машинной команды вместо того сегментного регистра, который был бы взят по умолчанию. Естественно, указывать префиксы смены сегмента допускается только перед теми командами, которым приходится вычислять адрес для обращения к памяти.

Диалект отладчика DEBUG.EXE включает четыре префикса смены сегмента. Они обозначаются по именам соответствующих сегментных регистров, как показано во второй колонке приведенной ниже таблицы. Пример пользования одним из префиксов смены сегмента приведен в разделе 7.02. Многочисленные подобные примеры имеются в ассемблерных текстах в разделах 9.06 и 9.08.

В современных процессорах сегментных регистров не четыре, а шесть. Префиксы для адресации относительно дополнительных сегментных регистров FS и GS "неизвестны" отладчику DEBUG.EXE, но он позволяет вводить эти префиксы посредством инструкции DB и не препятствует отладке программ, содержащих такие префиксы. Естественно, для отладки и исполнения таких программ необходим компьютер с процессором не древнее 80386.

– 248 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]