Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Программа типа EXE на макроассемблере



1. В наших работах мы будем использовать макроассемблер фирмы Microsoft (masm) и турбоассемблер фирмы Borland (tasm), а транслятор, компоновщик и отладчик - tasm.exe, tlink.exe и td.exe, соответственно, фирмы Borland. Последние могут работать с обоими ассемблерами.

Программа на языке ассемблера состоит из сегментов - любая программа имеет хотя бы один сегмент.

Сегмент образуется директивой segment, которая имеет следующий формат:

имя_сегмента segment [параметры]

имя_сегмента ends

Имя может быть произвольным, но соответствовать соглашениям для имен. Директивой ends заканчивается сегмент. У директивы segment может быть три типа параметров: выравнивание, объединение и класс.

Функционально различаются три сегмента.

А).Сегмент кода, в котором содержится основная последовательность команд (кодов), выполняющая те функции, для которых, собственно, и предназначена программа. В сегменте кода может содержаться одна или более процедур (аналог функций языка С++). Процедуры образуются директивой proc, которая имеет следующий формат:

имя_процедуры proc [параметр]

имя_процедуры endp

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

В). Сегмент стека – обязательная для каждой программы область памяти, куда для временного хранения заносятся адреса и данные, возникающие во время выполнения программы. Объем стека резервируется, как правило, программистом. Чем сложнее программа, тем больше требуется объем стека. Для простых программ достаточен объем в 128 ¸ 256 слов.

При использовании транслятора фирмы Microsoft, в сегменте кода обязательно присутствие директивы assume, которая связывает сегментные регистры CS, DS, ES и SS с именами соответствующих сегментов.

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

mov AX, имя_сегмента_данных

mov DS, AX,

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

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

Итак, наберите текст нижеприведенной программы (для ускорения процесса набора без примечаний) и запишите его в виде файла z1_pr1.asm в Вашу директорию. Обратите внимание на сегментную структуру программы.

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

;=================================================================

title Программа 1 (типа EXE);имя текстового файла - z1_pr1.asm

;------------------------------------------------------------------------------------------------------------

;Определения

stdout equ 1

lf equ 10; код ASCII перевода строки

cr equ 13;код ASCII возврата каретки

;------------------------------------------------------------------------------------------------------------

text segment 'code';начало сегмента, содержащего текст;программы – сегмент кода с именем text

assume cs:text, ds:data, es:data, ss:stack;регистры cs, ds, es, ss;связаны с соответсвующими сегментами

myproc proc;начало процедуры по имени myproc

mov AX,data;инициализируем сегментный регистр DS

mov DS,AX

;Вывод на экран строки текста "Работаешь на ПК – изучи ассемблер"

mov AH,40h;номер функции вывода в байт AH

mov BX,stdout;дискриптор монитора в регистр BX

mov CX,meslen;длину сообщения в регистр CX

mov DX,offset mes;адрес (смещение) mes в регистр DX

int 21h;прерывание MS DOS, которое при

;наличии функции 40h в байте AH

;выводит строку на экран

;Завершение программы – возвращение в родительский процесс

outprog: mov AH,4Ch;номер функции завершения в AH

mov AL, 00h;код завершения

int 21h;прерывание MS DOS, которое при

;наличии функции 4Сh в байте AH

;обеспечивает возврат в систему

myproc endp;конец тела процедуры

text ends;конец сегмента кода

;------------------------------------------------------------------------------------------------------------

data segment;начало сегмента данных

mes db 'Работаешь на ПК – изучи ассемблер',cr,lf

meslen equ $-mes;в meslen длина выводимого сообщения

data ends;конец сегмента данных

;------------------------------------------------------------------------------------------------------------

stack segment stack 'stack';начало сегмента стека

dw 128 dup (0);для стека выделено 128 слов

stack ends;конец сегмента стека

;------------------------------------------------------------------------------------------------------------

end myproc;конец программы

;=================================================================

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

Формат командной строки для запуска tasm.exe следующий:

tasm [опции] имя_исходного_файла [, имя_объектного_файла]

[, имя_файла_листинга] [, имя_файла_перекрестных_ссылок]

tasm /z /zi /n z1_pr1,z1_pr1,z1_pr1 - возможная команда трансляции программы z1_pr1.asm.

Опция /z обеспечивает включение в объектный файл информации для отладки.

Опция /zi позволяет при наличии ошибок наряду с сообщениями о них выводить соответствующие строки текста.

Опция /n подавляет вывод в файл листинга таблицы идентификаторов, что сокращает размер листинга.

Стоящие далее параметры определяют имена модулей: исходного (z1_pr1.asm), объектного (z1_pr1.obj) и листинга (z1_pr1.lst).

Формат командной строки запуска компоновщика:

tlink [опции] список_объектных файлов [, имя_загрузочного_модуля]

[, имя_файла_карты] [, имя_файла_библиотеки ]

tlink z1_pr1, z1_pr1 - возможная команда компоновки z1_pr1.obj. Параметры, стоящие после tlink, обозначают имена модулей: объектного (z1_pr1.obj) и загрузочного (z1_pr1.exe).

3.Запустите программу на выполнение:

z1_pr1.exe - команда запуска исполняемого модуля.

Должна быть выведена строка текста. Замените предлагаемый текст на другой и вновь запустите программу на выполнение.

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

5.Запустите отладчик td.exe и загрузите в него исполняемый модуль z1_pr1.exe. Отладчик позволяет выполнять программу по шагам или с точками останова, выводить на экран содержимое регистров и областей памяти, модифицировать (в известных пределах) загруженную в память программу, изменять содержимое регистров и выполнять другие действия, позволяющие в наглядной и удобной форме отлаживать программы.

Освойте основные правила работы с отладчиком: наблюдение текста программы и содержания регистров, выполнение текста программы целиком, по шагам и по частям с точками останова.





Дата публикования: 2014-12-10; Прочитано: 425 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...