Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Met_Lab2.pdf
Скачиваний:
159
Добавлен:
11.05.2015
Размер:
1.1 Mб
Скачать

3. Основы программирования

3.1. Процесс программирования

Программированием мы называем составление программы, т.е. списка инструкций (команд), которые должен будет последовательно выполнять процессор. Этот список инструкций в виде двоичного кода должен быть размещен в памяти компьютера. Выполнение программы начинается тогда, когда процессор будет настроен на первую выполнямую команду программы. Настройка производится следующим образом: сегмент первой выполняемой команды загружается в регистр сегмента команд CS, а смешение первой команды загружается а регистр указателя команд IP. После этого первая команда выполняется, а в регистр IР автоматически заносится смещение следующей команды, подлежащей выполнению. Изменение значений в регистре IP производится автоматически, программно доступа этому регистру нет. Обычно команды выполняются в естественной последовательности, т.е. в порядке их написания в программе, но иногда эта последовательность может нарушаться, а именно тогда, когда среди команд встречается команда перехода (иногда называют также командой передачи управления). Такие команды фактически изменяют содержимое регистра IP (а иногода и CS). Явным образом изменить содержимое этих регистров изменить невозможно. После выполнения всех инструкций программы управление передается на другую программу (например, в операционную систему, которая также является программой), т.е. фактически производится перенастройка IP и CS.

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

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

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

Существует несколько комплектов программных продуктов для разработки ассемблерных программ. Наиболее популярными из них являются компилятор, компоновщик и отладчик TASM, TLINK и TD компании Borland, а также MASM, LINK и CV компании Microsoft. Сами языки Ассемблера TASM и MASM также несколько различаются, однако в большинстве случаев удается создавать программы, переносимые с одного стандарта на другой.

33

Программа на ассемблере пишется при помощи любого текстового редактора (необходимо следить лишь за тем, чтобы редактор не вставлял в файл дополнительную информацию по форматированию текста и т. п.) и помещается в файл с любым именем и расширением *.asm. Такой файл называется исходным модулем. Затем запускается программа компилятора Ассемблера и в качестве аргумента ей передается имя исходного модуля. Если компиляция прошла без ошибок, создается новый файл с тем же именем и расширением *.obj, называемый обьектным модулем. Затем запускается программа компоновщика, предназначенная для разрешения внешних ссылок в объектном модуле и для объединения объектных модулей, если их несколько. В качестве аргумента программы компоновщика ей передается имя объектного модуля (или имена нескольких модулей). В результате работы компоновщика при отсутствии ошибок порождается исполняемый модуль - готовая к выполнению программа в файле с расширением ЕХЕ или СОМ.

Задавая различные опции компилятора и отладчика, можно попутно получать или не получать файл листинга (с расширением LST), содержащий протокол компиляции, и файл распределения памяти (с расширением MAP).

3.1.1. Этапы создания программы

Разработка программы на языке ассемблера включает четыре этапа.

1-й этап. Подготовка исходного текста программы и оформление его в виде текстового файла (одного или нескольких) с помощью какого-нибудь редактора в формате DOS с расширением .asm.

2-й этап. Ассемблирование программы с применением транслятора Tasm, результатом которого является объектный файл с расширением obj. Когда программа состоит из нескольких файлов (модулей), то их ассемблирование производится независимо друг от друга. Если в процессе трансляции будут обнаружены ошибки, то объектный файл не создаётся, а формируется сообщение об ошибках. Ошибки устраняются, после чего трансляция повторяется. Объектный файл (двоично-кодированное представление программы) не может быть запущен на исполнение, так как в нём не содержится информация о загрузке сегментов программы в памяти компьютера.

3-й этап. Компоновка программы производится компоновщиком (редактором связей) Turbo Linker и заключается в объединении объектных модулей в один исполняемый файл с назначением стартового адреса программы. Исполняемый файл имеет расширение exe. 2-й и 3-й этапы определяют процесс подготовки исполнительного файла программы, называемого

трансляцией.

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

Можно написать простой командный файл для последовательной компиляции ассемблерной программы, ее компоновки и выполнения полученного исполняемого файла, например, для компилятора TASM:

echo off

tasm -zi -l %1

if errorlevel 1 goto exit tlink -v -x %1

34

if errortevel t goto exit %1

:exit

Здесь ключ компилятора zi служит для включения в obj-файл информации для работы отладчика ключ I разрешает генерацию файла листинга. Ключ компоновщика v служит для включении в ехе-файл информации для работы отладчика, ключ х подавляет генерацию map файла.

Данный текст необходимо ввести в файл пакетной обработки BAT. Данный набор команд производит автоматически 2й и 3й шаги, описанные выше, сначала запускается транслятор tasm.exe, если написанная программа прошла трансляцию без ошибок, то запускается компоновщик tlink.exe, если и компоновка прошла успешно, то происходит запуск созданного после компоновки исполняемого модуля.

Здесь запись %1 заменяется параметром, поданым на вход при запуске этого BAT файла. Например, имеется созданый BAT файл с именем Compile.bat, и если при его запуске указать параметр, например, prog, то реально выполнится следующий набор команд:

echo off

tasm -zi -l prog

if errorlevel 1 goto exit tlink -v -x prog

if errortevel t goto exit prog

:exit

Замечание. Желательно в качестве параметра использовать только имя файла программы, не указывая его расширение, поскольку на трансляцию подается файл с раширением ASM, на компоновку с расширением OBJ, а на запуск EXE или COM. Транслятору и компоновщику из пакета TASM не обязательно указывать расширение.

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

Проверяется, не ввёл ли пользователь имя внутренней команды DOS (в том числе и имя внутренней утилиты, например ATTRIB). Если введена внутренняя команда, она будет выполнена.

Проверяется текущая директория на предмет выявления программного файла с именем и расширением .com или .exe. и только затем ищется командный файл с расширением .bat. Найденный файл исполняется.

Если ничего из перечисленного в пп. 1 и 2 не найдено, то система начнёт поиск по путям, записанным в файле Autoexec.bat (Windows 9x) или в Autoexec.nt (Windows 2000).

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

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

компилятор, компоновщик и их вспомогательные модули, а так же и сам BAT файл, можно записать в файл Autoexec.bat путь к папке, в которой располагаются эти файлы. Производится это с помощью команды PATH.

Добавляем следующую строку в файл Autoexec.bat:

35

PATH=Путь к папке с компилятором и транслятором

К примеру, если пакет TASM установлен в папку C:/Tasm, то нужно будет записать

строку

PATH C:/Tasm/Bin

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

Для дальнейшей работы запишите в файл Autoexec.bat команду PATH с указанием пути до папки Bin пакета Tasm.

3.1.2. Компиляция программы. Опции командной строки

Рассмотрим процесс трансляции программы на примере простой интерактивной программы Hello.asm (см. лаб. Работу № 1). Для ассемблирования файла Hello.asm в командной строке наберите:

tasm hello.asm

и нажмите клавишу Enter. Поскольку Вы не задали другое имя для объектного файла, то будет создан объектный файл с этим же именем hello.obj. Заметим, что расширение имени файла .asm вводить не требуется, т.к. tasm принимает это по умолчанию. На экране вы увидите следующее:

Turbo Assembler Version 4.1 Copyright (C) 1988,1996 Borland International

Assembling file: Hello.asm Error messages: None Warning messages: None Passes 1

Remaining memory: ***K

Из сообщения следует, что ассемблирование завершено без ошибок (Error messages: None) и отсутствия предупреждений (Warning messages: None). Предупреждение не является ошибкой, однако его игнорирование может привести к неприятностям в дальнейших этапах работы с программой, поэтому лучше своевременно реагировать на данный тип замечаний. Если в программе имеются ошибки, транслятор в сообщении в строке Error messages: укажет количество ошибок и в последующих строках опишет каждую ошибку, в т.ч. номер строки в которой находится ошибка.

Для компоновки программы введите в командную строку: tlink hello.obj.

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

Turbo Linker Version 7.1. 30.1 Copyright (C) 1987,1996 Borland International

Теперь программу hello.exe можно запустить на исполнение, результатом которого будет вывод на экран сообщения:

Это время после полудня? (Да/Нет-Y/N)

36

Курсор будет мерцать после последнего символа в ожидании ввода ответа. Введите букву y. Программа ответит:

Здравствуйте!

Если будет введена строчная буква n, то программа ответит: Доброе утро!

В процессе ассемблирования или компоновки вы можете выбирать различные исполнения процесса, которые задаются опциями в командной строке Tasm или Tlink. Для вывода списка опций командной строки Turbo Assembler наберите tasm и нажмите <Enter>; то же самое проделайте с командой tlink.

Опции описываются одной или несколькими буквами. Для задания опции наберите косую черту (или дефис) и соответствующую букву между командой tasm или tlink и именем программы, которую вы ассемблируете либо компонуете. Например, для ассемблирования программы Hello.asm и получения файла с листингом (файл, в котором содержится описание процесса ассемблирования), используйте команду: tasm/l hello. Опции разрешается набирать как прописными, так и строчными буквами. Исполните эту команду и затем рассмотрите файл с листингом Hello.lst, используя текстовый редактор. В листинге каждая строка начинается с номера, затем следуют байты объектного кода и, наконец, собственно текст программы. Кроме того, TASM выводит в файле листинга таблицу идентификаторов, где содержится информация о метках и сегментах, включая значение и тип каждой метки и атрибуты каждого сегмента. При ассемблировании программы вы можете использовать в одной командной строке несколько опций, разделяя их косыми чертами. Рассмотрим некоторые примеры для команды tasm:

tasm/l/c hello – команда дополняет файл листинга таблицей перекрёстных ссылок, в которой указывается, где была определена каждая метка и где на неё есть ссылка;

tasm/l/n hello – исключает таблицу идентификаторов из листинга;

tasm/ml – включает различие прописных и строчных символов в пользовательских идентификаторах;

tasm/zi hello – команда добавляет в Hello.obj информацию, необходимую для использования отладчика Turbo Debugger.

Для команды tlink:

tlink/v hello – опция /v включает в Hello.exe информацию, необходимую для последующего открытия этого файла в отладчике Turbo Debugger;

tlink/m hello – опция /m приводит к созданию файла отображения или файла загрузки Hello.map. В нём перечисляются имена, адреса загрузки и размеры всех сегментов, входящих в программу;

tlink/x/v hello – команда даёт возможность загрузить Hello.exe в отладчик Turbo Debugger, запрещает создание (опция /x) файла отображения.

Tlink/3 <file_name.obj> – компоновщик создаёт файл типа .exe с поддержкой 32-битного кода.

Tlink/t <file_name.obj> – опция /t создаёт файл типа .com.

37

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