Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Сохранение программы из отладчика



Можно использовать DEBUG для сохранения программ на диске в следующих случаях:

1. После загрузки программы в память машины и ее модификации необходимо сохранить измененный вариант. Для этого следует:

u загрузить программу по ее имени: DEBUG n: имя файла [Enter]

u просмотреть программу с помощью команды D и ввести изменения по команде E

u записать измененную программу: W [Enter]

2. Необходимо с помощью DEBUG написать небольшую по объему программу и сохранить ее на диске. Для этого следует:

u вызвать отладчик DEBUG

u с помощью команд A (assemble) и E (enter) написать программу

u присвоить программе имя: N имя файла.COM [Enter].

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

u запросить регистр CX командой: R CX [Enter] — отладчик выдаст на этот запрос CX 0000 (нулевое значение)

u указать длину программы — 6

u записать измененную программу: W [Enter]

В обоих случаях DEBUG выдает сообщение « Writing nnnn bytes » (Запись nnnn байтов). В случае, если nnnn равно 0, то произошла ошибка при вводе длины программы, и необходимо повторить запись cнова.

Важно: Отладчик DOS DEBUG это средство, полезное для отладки ассемблерных программ. Однако следует быть осторожным с ее использованием, особенно для команды E (ввод). Ввод данных в неправильные адреса памяти или ввод некорректных данных могут привести к непредсказуемым результатам.

На экране в этом случае могут появиться «странные» символы, клавиатура заблокирована или даже DOS прервет DEBUG и перезагрузит себя с диска. Какие-либо серьезные повреждения вряд ли произойдут, но возможны некоторые неожиданности, а также потеря данных, которые вводились при работе с отладчиком.

В случае, если данные, введенные в сегмент данных или сегмент кодов, оказались некорректными, следует, вновь используя команду E, исправить их. Однако, можно не заметить ошибки и начать трассиpовку программы. Но и здесь возможно еще использовать команду E для изменений. В случае, если необходимо начать выполнение с первой команды, то следует установить в регистре командного указателя (IP) значение 0100.

 

 

Введите команду R (register) и требуемый регистр в следующем виде:

R IP [Enter]

Отладчик выдаст на экран содержимое регистра IP и перейдет в ожидание ввода. Здесь следует ввести значение 0100 и нажать для проверки результата команду R (без IP). Отладчик выдаст содержимое регистров, флагов и первую выполняемую команду. Теперь можно, используя команду T, вновь выполнить трассировку программы.

В случае, если ваша программа выполняет какие-либо подсчеты, то возможно потребуется очистка некоторых областей памяти и регистров. Но yбедитесь в сохранении содержимого регистров CS, DS, SP и SS, которые имеют специфическое назначение.

 

 

Лекция 14.
Макросредства

Простое макроопределение

Для каждой закодированной команды Ассемблер генерирует одну команду на машинном языке. Но для каждого закодированного оператора компиляторного языка Pascal или C генерируется один или более (чаще много) команд машинного языка. В этом отношении можно считать, что компиляторный язык состоит из макрооператоров.

Ассемблер MASM также имеет макросредства, но макросы здесь определяются программистом. Для этого задается имя макроса, директива MACRO, различные ассемблерные команды, которые должен генерировать данный макрос и для завершения макроопределения — директива MEND. Затем в любом месте программы, где необходимо выполнение определенных в макрокоманде команд, достаточно закодировать имя макроса. В результате Ассемблер сгенерирует необходимые команды.

Использование макрокоманд позволяет:

u упростить и сократить исходный текст программы;

u сделать программу более понятной;

u уменьшить число возможных ошибок кодирования.

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

Макроопределение должно находиться до определения сегмента.

Директива MACRO указывает Ассемблеру, что следующие команды до директивы ENDM являются частью макроопределения.

Директива ENDM завершает макроопределение. Команды между директивами MACRO и ENDM составляют тело макроопределения.

Имена, на которые имеются ссылки в макроопределении должны быть определены где-нибудь в другом месте программы.

Макрокоманда INIT1 может использоваться в кодовом сегменте там, где необходимо инициализировать регистры. Когда Ассемблер анализирует команду INIT1, он сначала просматривает таблицу мнемокодов и, не обнаружив там соответствующего элемента, проверяет макрокоманды. Так как программа содержит определение макрокоманды INIT1 Ассемблер подставляет тело макроопределения, генерируя необходимые команды — макрорасширение.

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

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

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

Формальный параметр может иметь любое правильное ассемблерное имя (включая имя регистра, например, CX), которое в процессе ассемблирования будет заменено на параметр макрокоманды. Отсюда следует, что Ассемблер не распознает регистровые имена и имена, определенные в области данных, как таковые. В одной макрокоманде может быть определено любое число формальных параметров, разделенных запятыми, вплоть до 120 колонки в строке.

 

 

Комментарии

Для пояснений назначения макроопределения в нем могут находиться комментарии. Директива COMMENT или символ точка с запятой указывают на строку комментария, как это показано в следующем макроопределении PROMPT:

PROMPT MACRO MESSGE; Эта макрокоманда выводит сообщения на экран

MOV AH, 09H

LEA DX, MESSGE

INT 21H

ENDM

Так как по умолчанию в листинг попадают только команды генерирующие объектный код, то Ассемблер не будет автоматически выдавать и комментарии, имеющиеся в макроопределении.

В случае, если необходимо, чтобы в расширении появлялись комментарии, следует использовать перед макрокомандой директиву.LALL («list all» — выводить все), которая кодируется вместе с лидирующей точкой:

.LALL PROMPT MESSAG1

Макроопределение может содержать несколько комментариев, причем некоторые из них могут выдаваться в листинге, а другие — нет. В первом случае необходимо использовать директиву.LALL. Во втором — кодировать перед комментарием два символа точка с запятой (;; ) — признак подавления вывода комментария в листинг.

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

Для этого служит директива.SALL («suppress all» — подавить весь вывод), которая уменьшает размер выводимого листинга, но не оказывает никакого влияния на размер объектного модуля.

Директивы управления листингом.LALL, .XALL, .SALL сохраняют свое действие по всему тексту программы, пока другая директива листинга не изменит его. Эти директивы можно размещать в программе так, чтобы в одних макрокомандах распечатывались комментарии, в других — макрорасширения, а в третьих подавлялся вывод в листинг.

Использование макрокоманд в макроопределениях

Макроопределение может содержать ссылку на другое макроопределение.

Рассмотрим простое макроопределение DOS21, которое заносит в регистр AH номер функции DOS и выполняет INT 21H:

DOS21 MACRO DOSFUNC

MOV AH, DOSFUNC

INT 21H

ENDM

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

LEA DX, NAMEPAR DOS21 0AH

Предположим, что имеется другое макроопределение, использующее функцию 02 в регистре AH для вывода символа:

DISP MACRO CHAR

MOV AH, 02

MOV DL, CHAR

INT 21H

ENDM

Для вывода на экран, например, звездочки достаточно закодировать макрокоманду DISP '*'. Можно изменить макроопределение DISP, воспользовавшись макрокомандой DOC21:

DISP MACRO CHAR

MOV DL, CHAR

DOS21 02

ENDM

 

 

Теперь, если закодировать макрокоманду DISP в виде DISP '*', то Ассемблер сгенерирует следующие команды:

MOV DL, '*'

MOV AH, 02

INT 21H

Директива LOCAL

В некоторых макрокомандах требуется определять элементы данных или метки команд.

При использовании такой макрокоманды в программе более одного раза происходит также неоднократное определение одинаковых полей данных или меток. В результате Ассемблер выдаст сообщения об ошибке из-за дублирования имен.

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

LOCAL dummy-1, dummy-2,...; Формальные параметры


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-08; Просмотров: 1237; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.021 с.)
Главная | Случайная страница | Обратная связь