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

vassamblere

.pdf
Скачиваний:
9
Добавлен:
21.02.2016
Размер:
478.81 Кб
Скачать

 

Окончание табл. 3.13

 

 

Команда

Описание

 

 

REPLACE

Заменяет файлы

RMDIR

Удаляет каталог

SET

Отображает, устанавливает или удаляет переменные окружения Windows

SETLOCAL

Начинает локализацию окружения Windows в командных файлах

SHIFT

Сдвигает позицию заменяемых параметров в командных файлах

SORT

Выполняет сортировку

START

Запускает указанную команду или программу в отдельном окне

SUBST

Создает виртуальный диск

TIME

Отображает или устанавливает системное время

TITLE

Устанавливает имя окна для интерпретатора команд

TREE

Графически отображает структуру каталогов

TYPE

Отображает содержимое текстового файла

VER

Отображает версию Windows

VERIFY

Устанавливает режим проверки файлов на корректность записи на диск

VOL

Отображает метку тома и серийный номер

XCOPY

Копирует файлы и каталоги

 

 

Как видите, команд операционной системы DOS не так уж и много и запомнить их не со" ставляет особого труда. Но даже этого делать не надо (те несколько команд, которые необ" ходимы для запуска и работы с ассемблером, будут рассмотрены подробно далее, а аналоги всех команд есть в системе Windows, так как режим DOS просто эмулируется системой Windows и в конечном итоге производится обращение к процедурам Windows). В Windows 98 и в более ранних версиях можно работать и непосредственно в DOS, так как эти системы являются только надстройками над DOS, но начиная с версии Windows NT все обстоит по"другому. Здесь системы DOS в чистом виде уже нет и вся работа производится только через процедуры Windows.

Чтобы получить более подробное описание каждой команды, необходимо набрать в ко" мандной строке имя команды и дополнить ее символами ‘‘/?’’. Например, если набрать cd /?, то получим следующую справку.

Отображает или изменяет имя текущего каталога. CHDIR [/D] [drive:][path]

CHDIR [..]

CD [/D] [drive:][path] CD [..]

Две точки (..) указывают, что необходимо перейти к каталогу, включающему данный каталог.

Если набрать CD без параметров, то отобразится обозначение текущего тома и каталог. Если набрать CD с обозначением тома, то отобразится текущий каталог.

Параметр /D используется для переключения текущего тома на указанный том с не" обходимым каталогом.

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

Глава 3. Введение в язык ассемблера

83

А вот командные файлы, которые существовали еще в первых системах DOS, могут принести пользу даже при работе в системе Windows. Рассмотрим подробнее команд" ные файлы.

Командный файл

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

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

В командный файл можно включать все команды DOS, а также команды условного пе" рехода for, goto и if, которые позволяют реализовывать различную последовательность выполнения команд в зависимости от наличия определенных условий. Еще несколько команд позволяют контролировать ввод"вывод и вызывать другие командные файлы.

Контролировать процесс выполнения можно по возвращаемым приложениями кодам ошибок, которые могут быть равны 0 (ошибок нет) или 1 (большие значения при нали" чии ошибок).

Командный файл может иметь параметры, которые дописываются в командный файл при его запуске на выполнение. Для подстановки параметров в команды используются переменные от %0 до %9. Если используется переменная %0, то вместо ее при запуске подставляется имя командного файла, а переменные от %1 до %9 заменяются соответст" вующими аргументами. Для доступа к аргументу за пределами %9 используется команда shift. Переменная %* ссылается на все аргументы, за исключением %0.

Например, для копирования содержимого каталога Folder1 в каталог Folder2 можно создать командный файл Mybatch.bat, содержимое которого будет представлять одну строку

xcopy %1\*.* %2

и при вызове этого файла как

Mybatch.bat C:\folder1 D:\folder2

вместо переменной %1 будет подставлен каталог Folder1, а вместо переменной %2 """

каталог Folder2.

Тот же самый результат можно получить, если в среде DOS выполнить команду

xcopy C:\folder1\*.* D:\folder2

Дополнительно с параметрами командного файла можно применять модификаторы. Модификаторы используют информацию о текущем диске и каталоге для расширения параметров. При использовании модификаторов сначала поставьте символ процента (%), затем тильду (~), а за ней """ требуемый модификатор.

Все возможные модификаторы перечислены в табл. 3.14.

84

Глава 3. Введение в язык ассемблера

Таблица 3.14. Модификаторы для командных файлов

Модификатор

Описание

 

 

%~1

Удаляет все фрагменты, ограниченные кавычками ("")

%~f1

Дополняет аргумент полным путем

%~d1

Дополняет аргумент буквенным символом текущего диска

%~p1

Дополняет аргумент путем

%~n1

Дополняет аргумент именем файла

%~x1

Дополняет аргумент расширением файла

%~s1

Использует только короткие имена

%~a1

Дополняет аргумент атрибутами файла

%~t1

Дополняет аргумент датой и временем создания файла

%~z1

Дополняет аргумент размером файла

%~$PATH:1

Ищет каталоги, перечисленные в переменной окружения PATH

 

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

 

 

Подготовка к запуску ассемблера

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

Для начала нужно обязательно указать пути, по которым операционная система будет находить каталог с установленными модулями ассемблера. Например, если ассемблер находится в каталоге E:\MASM615\, то необходимо выполнить следующую команду:

path E:\MASM615;%path%

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

А для того чтобы сделать активным каталог с вашими программами, необходимо вы" полнить команду cd. Например:

cd /d H:\Gennady\Work\Assembl\Book1\Programs

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

Теперь можно откомпилировать разработанную ранее программу Hello, которая должна находиться в активном каталоге. Для этого необходимо вызвать компилятор. Ко" мандная строка для вызова компилятора имеет следующий синтаксис:

ML [ /options ] filelist [ /link linkoptions ]

Здесь options """ это опции, или дополнительные элементы настройки; filelist """

имя файла; linkoptions """ опции компоновщика. Так как имена заключены в квад" ратные скобки, то их указывать не обязательно. Если не установить соответствующие опции, эти файлы все равно будут созданы, но с именем исходного файла. Все допусти" мые опции перечислены в табл. 3.15.

Глава 3. Введение в язык ассемблера

85

Таблица 3.15. Опции компилятора MASM

Опция

Описание

 

 

/AT

Разрешена тонкая модель памяти (.COM)

/Bl<linker>

Использовать альтернативный компоновщик

/c

Компилировать без компоновки

/Cp

Сохранять регистры пользовательских идентификаторов

/Cu

Все идентификаторы в верхнем регистре

/Cx

Сохранять регистры для открытых и внешних идентификаторов

/coff

Генерировать объектный файл в формате COFF

/D<name>[=text]

Задать макроопределение

/EP

Вывести листинг препроцессора

/F <hex>

Задать размер стека в байтах

/Fe<file>

Ввести имя исполняемого файла

/Fl[file]

Генерировать листинг

/Fm[file]

Генерировать карту распределений

/Fo<file>

Ввести имя объектного файла

/Fpi

Эмулировать код 80× 87

/Fr[file]

Генерировать ограниченную обзорную информацию

/FR[file]

Генерировать полную обзорную информацию

/G<c|d|z>

Использовать вызовы Pascal, C или Stdcall (по умолчанию Stdcall)

/H<number>

Установить максимальную длину внешних имен

/I<name>

Добавить пути для подключаемых файлов

/link

Задать <Опции компоновщика и библиотеки>

/nologo

Не выводить авторские права

/omf

Генерировать объектный файл в формате OMF

/Sa

Задать максимальный размер листинга

/Sc

Генерировать временные метки

/Sf

Генерировать листинг первого прохода

/Sl<width>

Задать длину строки

/Sn

Не выводить таблицу перекрестных ссылок

/Sp<length>

Задать длину страницы

/Ss<string>

Задать подзаголовок

/St<string>

Задать заголовок

/Sx

Выводить ошибочные условия

/Ta<file>

Компилировать файл с не .ASM"расширением

/w

То же самое, что и /W0 /WX

/WX

Трактовать предупреждения как ошибки

/W<number>

Задать уровень предупреждений

/X

Игнорировать путь к INCLUDE

/Zd

Добавить номера строк в отладочную информацию

 

 

86

Глава 3. Введение в язык ассемблера

Окончание табл. 3.15

Опция

Описание

 

 

/Zf

Сделать все идентификаторы открытыми

/Zi

Добавить символическую отладочную информацию

/Zm

Обеспечить совместимость с MASM 5.10

/Zp[n]

Выравнивать структуры

/Zs

Проверить синтаксис без создания выходного файла

 

 

Теперь можно давать команду на трансляцию рассмотренного выше файла Hello, который находится в каталоге \Work\HelloWord, в следующем виде:

G:\Work\HelloWord>ML /nologo /B link32 /coff Hello.asm /link /nologo / SUBSYSTEM:CONSOLE F:\MASM615\LIB\KERNEL32.LIB F:\MASM615\LIB\USER32.LIB F:\ MASM615\LIB\Study32.lib

А это значит, что вы указываете транслятору не выводить информацию об автор" ских правах (/nologo), использовать 32"разрядный компоновщик (/Bl link32), создать объектный модуль формата coff (/coff) и использовать консольное окно (/SUBSYSTEM:CONSOLE). При компоновке необходимо использовать следующие библиоте" ки: F:\MASM615\LIB\KERNEL32.LIB, F:\MASM615\LIB\USER32.LIB, F:\MASM615\ LIB\Study32.lib

При трансляции программ для Windows следует использовать стандартные библиоте" ки Windows: KERNEL32.LIB и USER32.LIB, в которых находятся все необходимые про" цедуры и которые входят в поставку ассемблера. В данном случае использована также библиотека Study32.lib, в которой находятся процедуры, написанные пользователем. (Об этом уже говорилось ранее и еще будет говориться в дальнейшем, когда вы будете разрабатывать собственную библиотеку.)

При успешной трансляции на экране появится следующее сообщение:

Assembling: Hello.asm

G:\Work\HelloWord>

После трансляции в указанном каталоге появятся файлы с расширением .obj и .lst (при заданной опции). Полностью файл листинга (.lst) приведен ниже.

Microsoft (R) Macro

Assembler Version 6.15.8803

08/15/06 16:28:02

(.asm)

Page

1

- 1

 

TITLE

(.asm)

 

 

 

.386

 

 

 

 

.model flat, stdcall

ExitProcess PROTO,

x:dword

WaitMsg PROTO

WriteString PROTO

Crlf PROTO

00000000

 

 

 

 

.data

00000000

48 65

6C

6C

6F

strHello BYTE "Hello Word!",0

 

20 57

6F

72

64

 

 

21 00

 

 

 

 

00000000

 

 

 

 

.code

Глава 3. Введение в язык ассемблера

87

00000000

 

main PROC

 

 

00000000

BA 00000000 R

 

 

 

mov EDX, OFFSET strHello ; Аргументы для WriteString.

invoke WriteString

; Вывод строки на консоль.

invoke Crlf

 

; Перевод каретки.

invoke WaitMsg

 

; Запрос для нажатия клавиши.

invoke ExitProcess,0

; Корректное окончание программы.

0000001B

main ENDP

 

 

 

 

 

END main

 

 

 

 

Microsoft (R) Macro Assembler Version 6.15.8803

08/15/06 16:28:02

(.asm)

Symbols 2 - 1

 

 

 

Segments

and Groups:

 

 

 

 

N a m e

Size

Length

Align

Combine

Class FLAT GROUP

_DATA .

. 32 Bit

0000000C

DWord

Public

'DATA'

_TEXT .

. 32 Bit

0000001B

DWord

Public

'CODE'

Procedures,

parameters and locals:

 

N a m e

Type

Value

Attr

 

Crlf . . . .P Near

00000000

FLAT Length= 00000000 External STDCALL

ExitProcess P Near

00000000

FLAT Length= 00000000 External STDCALL

WaitMsg . . P Near

00000000

FLAT Length= 00000000

External STDCALL

WriteString P Near

00000000

FLAT Length= 00000000

External STDCALL

main . . . P Near

00000000 _TEXT Length= 0000001B Public STDCALL

Symbols:

 

 

 

N a m e

Type

Value

Attr

@CodeSize . . . .

. ..Number

00000000h

 

@DataSize . . . .

. . Number

00000000h

 

@Interface . . . .

. . Number

00000003h

 

@Model . . . . . .

. . Number

00000007h

 

@code . . . . . .

. . Text

 

_TEXT

@data . . . . . .

. . Text

 

FLAT

@fardata? . . . .

. . Text

 

FLAT

@fardata . . . . .

. . Text

 

FLAT

@stack . . . . . .

. . Text

 

FLAT

strHello . . . . .

. . Byte

00000000 _DATA

0 Warnings

0Errors

Вэтом листинге приведена вся информация о созданной программе, начиная с ис" ходных команд и их машинных эквивалентов и заканчивая распределением имен, памяти

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

Синтаксические ошибки

Очень немного найдется программистов, которые сразу смогут написать даже неболь" шую программу без ошибок. Поэтому ассемблер проверяет написанные команды и вы" водит на экран все строки, в которых есть ошибки, причем с их объяснением. Например, если в программе Hello первую команду MOV ошибочно набрать как MIV, то появится следующее сообщение:

88

Глава 3. Введение в язык ассемблера

Assembling: Hello.asm

Hello.asm(17) : error A2008: syntax error : edx

Иными словами, компилятор зафиксирует синтаксическую ошибку перед операндом edx в строке номер 17.

Компоновка программы

После компиляции будет получен объектный файл с расширением .obj, который не" обходимо преобразовать в исполняемый модуль. На данном этапе используется про" грамма"компоновщик, которая использует объектный файл (в данном случае hello.obj) в качестве входного и создает выполняемый файл, называя его hello.exe. Командная строка для компоновщика имеет следующий формат:

LINK [options] [files] [@commandfile]

Здесь link """ имя программы компоновщика, files """ файлы библиотек.

Не будем рассматривать все опции компоновщика, так как на первом этапе они не приго" дятся. Необходимо знать только опцию /DEBUG (она заставляет компоновщик вставлять в создаваемую программу нужные для отладчика коды) и опцию /SUBSYSTEM:CONSOLE (приводит к созданию формата файла, который ‘‘понимает’’ Windows и рассчитан на ра" боту в консольном режиме). Чтобы просмотреть все опции 32"разрядного отладчика, просто наберите в командном окне имя отладчика link32. Также можно использовать опцию /MAP, которая приводит к созданию файла распределения памяти с расширением

.map. Попробуйте создать этот файл и проанализируйте его. От его использования тоже может быть ощутимая польза.

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

Использование программы ML позволяет выполнять компиляцию и компоновку одной командой. Но можно использовать отдельно компилятор (MASM) и 32"разрядный компо" новщик (LINK32). Также необходимо отметить, что версии 32"разрядного компоновщика, которые Microsoft использует в более поздних версиях, чем MASM615, называются просто LINK, без цифр 32 (в версии MASM615 так называется 16"разрядный компоновщик). На" чиная с этой версии, Microsoft уже не разрабатывает 16"разрядные компоновщики.

Запуск программы

Для запуска программы наберите в командной строке имя выполняемой программы hello или просто щелкните на ней мышкой в среде Windows.

Отладчик

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

Существует несколько хороших отладчиков, но мы будем использовать универсаль" ный и довольно удобный отладчик Microsoft, который распространяется бесплатно и на" зывается dbg_x86_6.5.3.8.exe. Этот отладчик имеет оконный интерфейс и привыч" ные для работающих в среде Windows функции.

Глава 3. Введение в язык ассемблера

89

Простая программа

Для знакомства с отладчиком напишем на языке ассемблера небольшую программу Sum, которая складывает три числа и сохраняет сумму в памяти. Оттранслируем и вы" полним компоновку программы с использованием опций отладки, как показано на рис. 3.14, а затем начнем работу с отладчиком.

Рис. 3.14. Компиляция и компоновка программы с опциями отладки

Программа Sum

TITLE Программа суммирования (sum.asm)

.386

.MODEL flat, stdcall

; Задаем модель памяти.

WaitMsg PROTO

; Прототип функции WaitMsg.

ExitProcess PROTO,

; Прототип функции ExitProcess.

x: DWORD

 

.DATA

 

; Задаем сегмент данных.

sum DW ?

; Объявляем переменную sum, не присваивая значения.

.CODE

 

; Задаем сегмент кодов.

main PROC

; Точка входа в программу.

MOV

EAX,5

; Поместить в регистр AX значение 5.

ADD

EAX,10

; Сложить содержимое регистра EAX с 10.

ADD

EAX,15

; Сложить содержимое регистра EAX с 15.

MOV

sum, AX

; Сохранить содержимое регистра EAX в sum.

invoke WaitMsg

; Запрос для нажатия клавиши.

invoke ExitProcess,0 ; Корректное окончание программы.

main ENDP

; Конец процедуры.

END main

; Конец программы (для компилятора).

MOV EAX, 5

EAX = 5

ADD EAX, 10

EAX = 15

ADD EAX, 15

EAX = 35

Память

 

 

011C

 

011E

35

0120

 

0122

 

0124

 

0126

Рис. 3.15. Диаграмма выполнения простой программы

Каждая строка в процедуре main этой програм" мы начинается с кода команды (MOV, ADD) с соответствующими операндами или вызова про" цедуры (макроопределение invoke). Если после этого поставить точку с запятой, то до конца строки все будет восприниматься как комментарий, не влияющий на ход выполнения программы.

Пошаговая диаграмма выполнения показана на рис. 3.15.

90

Глава 3. Введение в язык ассемблера

Команда MOV заставляет процессор переместить или скопировать значение исходного операнда в принимающий оператор, поэтому в первой строке число 5 перемещается в регистр AX. Во второй строке происходит суммирование числа 10 и содержимого реги" стра AX, в результате значение регистра становится равным 15. В третьей строке также складываются содержимое регистра AX с числом 20. В регистре AX уже будет находиться число 35. Далее это число копируется в ячейку памяти по адресу, определенному для пе" ремененной sum. Команды в пятой и шестой строках необходимы для выхода из про" граммы и передачи управления системе.

Как обычно, программу можно написать в текстовом редакторе и сохранить в файле с именем sum.asm, после чего ее нужно откомпилировать с опцией /Zi, которая застав" ляет отладчик включить в объектный модуль информацию для отладчика. Затем нужно будет вызвать компоновщик для получения исполняемого файла. Однако поскольку эта программа в дальнейшем будет использоваться с отладчиком, то необходимо запускать компоновщик с опцией /DEBUG, т.е. команда вызова компоновщика будет включать оп" цию, включающую информацию для отладчика, в исполняемый модуль:

/link /DEBUG

После получения выполняемого файла можно запустить отладчик и поработать с этой программой, для чего необходимо сначала открыть исходный, а затем исполняемый файл (это команда File Open Sourse File и команда File Open Executable). После чего мож" но настроить рабочий стол отладчика, как показано на рис. 3.16.

Рис. 3.16. Рабочий стол отладчика dbg_x86_6.5.3.8

На рисунке вы видите открытым окно с исходной программой и дополнительные окна Registers (значения всех регистров), Disassembly (восстановленная последовательность команд) и Command (окно ввода команд). Все окна можно закрывать и открывать по желанию

Глава 3. Введение в язык ассемблера

91

пользователя, создавая удобную для себя среду отладки. Все окна по умолчанию стараются пристыковаться к ближайшей границе (dock) окна, хотя их можно сделать и плавающими (floating). Потребуется некоторая практика, чтобы быстро создавать удобный рабочий стол от" ладчика. Щелчок правой кнопкой мыши на заголовке окна приводит к появлению контекст" ного меню, которое позволяет установить необходимый режим работы окна.

Окна можно открывать либо воспользовавшись пунктом меню Window, либо с помо" щью отдельных кнопок, расположенных на управляющей панели. Названия кнопок, ко" торые появляются в момент задержки курсора на кнопке, перечислены в табл. 3.16.

Таблица 3.16. Названия управляющих кнопок

Название

Быстрые клавиши

Описание

 

 

 

Open sourse file

Ctrl"O

Открыть файл

Cut

Ctrl"X

Удалить выделенный текст

Copy

Ctrl"C

Копировать выделенный текст

Paste

Ctrl"V

Вставить выделенный текст

Go

F5

Выполнить программу

Restart

Ctrl"Shft"F5

Подготовить отладчик к выполнению программы

Stop debugging

Shft"F5

Закончить отладку

Break

Ctrl"Break

Передача управления отладчику

Step into

F11 (F8)

Заходить в процедуры

Step over

F10

Выполнять программу без захода в процедуры

Step out

Shft"F11

Выйти из процедуры

Run to cursor

Ctrl"F10 (F11)

Выполнить до курсора

Insert or remove breakpoint

F9

Установить или убрать точку останова

Command

Alt"1

Отобразить окно команд

Watch

Alt"2

Показать текущие переменные

Locals

Alt"3

Показать локальные переменные

Registers

Alt"4

Показать регистры

Memory window

Alt"5

Показать фрагмент памяти

Call stack

Alt"6

Показать текущую информацию из стека

Disassembly

Alt"7

Дисассемблировать исходный файл

Scratch pad

Alt"8

Открыть окно буфера обмена

Sourse mode on

 

Использовать исходный текст

Sourse mode off

 

Использовать ассемблерный текст

Font

 

Использовать шрифты

Options

 

Использовать настройки

 

 

 

Работа с отладчиком не представляет особых трудностей. Необходимо только ввести исходный файл (.asm), соответствующий ему исполняемый файл (.exe) и выполнить дисассемблирование. Затем установить точку прерывания на процедуре main и выпол" нить команду Go. Отладчик остановится на первой команде, после чего можно проводить отладку, просматривая состояние всех регистров, флагов, памяти и текущих команд,

92

Глава 3. Введение в язык ассемблера

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