Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 [ 5 ] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

На экране после запуска отладчика и зафузки профаммы появится строка главного меню (File, Edit, View, Run, Breakpoints, Data, Options, Window, Help) и строка подсказки, отражающая назначение функциональных клавиш. Для выхода из отладчика в любой момент можно воспользоваться комбинацией клавиш Alt-X. Нажав комбинацию клавиш Ctrl-F2, можно зафузить профамму заново и начать отладку сначала.

Чаще всего для отладки используется окно VIEW - CPU, в котором одновременно отображаются пять подокон с содержимым сегментов кода, данных и стека, содержимым регистров процессора. Для перехода между подокнами используется клавиша Tab. В окне сегмента кода можно выполнять просмотр программы (машинных кодов и ассемблерных команд), перемещаясь по ее тексту с помощью клавиш управления курсором, указывать команды, в которых требуется остановить выполнение программы, следить за порядком выполнения команд и т. п. Окно сегмента данных можно настроить на отображение (в шестнадцатеричном и символьном виде) нужного участка памяти, в этом окне можно изменять содержимое требуемых ячеек памяти. Самый простой способ перехода к требуемому участку памяти - это, находясь в окне данных, нажать комбинацию клавиш Ctrl-G и набрать адрес в виде SSSS: 0000 или имя области памяти, если при трансляции и компоновке программы были указаны соответствующие ключи. В окне регистров и в окне флагов можно изменить содержимое соответственно регистров и флагов, подведя курсор к нужному регистру или флагу и затем набрав значение, которое в них необходимо поместить.

Существуют следующие основные возможности управления процессом выполнения

профаммы:

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

F8 - вызовы процедур без входа в них;

F4 - выполнение профаммы до курсора;

F9 - выполнение профаммы с нормальной скоростью.

В последнем случае управление возвращается к отладчику при выполнении одного из условий:

работа профаммы завершена;

Ш встретилась точка останова (breakpoint);

нажата комбинация клавиш Ctrl-Break.

Самый простой способ установить точку останова - переместить курсор в строку, где требуется остановить выполнение профаммы, и нажать клавишу F2.

При отладке профамм, в которых имеется вывод данных на экран или ввод данных с клавиатуры, используется также окно экрана пользователя (User Screen), отображающее информацию, которую профамма выдает на экран. Переключение между окнами CPU и User Screen осуществляется комбинацией клавиш Ait-F5.

Глава 1.

Основы программирования на Ассемблере IBM PC

1.2.4.

Процедуры

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

Основные требования к процедурам:

при вызове процедур необходимо запоминать адрес возврата - это действие осуществляется автоматически при выполнении команды CALL, при этом адрес (одно слове в случае ближней и два слова в случае дальней процедуры) сохраняется в стеке;

при выходе из процедур возврат всегда производится к команде, находящейся сраз) после вызова, независимо от того, где находился вызов, - это действие осушествляется автоматически при выполнении команды RET, при этом адрес возврата (одно слово в случае ближней и два слова в случае дальней процедуры) извлекается из стека;

содержимое используемых процедурой регистров необходимо запоминать до их из менения, а перед возвратом из процедуры восстанавливать - эти действия (обычнс осуществляемые командами PUSH и POP) обязан выполнять профэммист;

процедура должна иметь средства взаимодействия с вызвавшей ее профаммой.

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

Офаничение тела подпрофаммы директивами PROC и ENDP позволяет создавать локаль ные метки, что является полезным при использовании в разных подпрофаммах одинаковы меток. Все локальные метки должны начинаться с символов "@@". Все такие метки буду локализованы в подпрофамме, если перед ее командами будет указана директива LOCAL S.

1.2.5. Макросы

Макросы суть подпрофаммы генерации. Повторяющиеся участки текста профамм! можно оформить как макроопределение (описание макроса). Если в тексте профамм! встречается вызов макроса (макрокоманда), происходит генерация всех его операторе! Отличие макроса от обычной подпрофаммы заключается в том, что, если в исходно! тексте будет несколько вызовов макроса в объектном модуле, его тело будет повторен



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

Макрос должен быть описан до вызова. Описание макроса начинается строкой с именем макроопределения и директивой MACRO со списком формальных аргументов. Заканчивается макроопределение директивой ENDM.

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

Описание макроса имеет вид: Имя MACRO

Список формальньж аргумен1юв Директивы м коианды

ENDM

Макрокоманда имеет вид: Имя Список фактмческих аргумен1гов

Тексты макроопределений можно включать непосредственно в текст программы или помещать в макробиблиотеку. Макроопределения записываются в файл макробиблиотеки в таком же виде, как и в текст программы. Содержимое макробиблиотеки можно включить в программу с помощью директивы INCLUDE, имеющей следующий формат: INCLUDE иия файла.

Пример

==== mymacro.inc - макробиблиотека.

WrMem - запись в каждую 8-разрядную ячейку таблицы Table === размером MSize < 257 ее собственного адреса.

==== Формальные аргументы - относительный адрес и размер таблицы. =

WrMem

NextByte:

MACRO

Table, MSize

LOCAL

NextByte

pushf

push

cx di es

cx, MSize

di, Table

ax, ax

stosb

loop

NextByte

es di cx

popf

ENDM

;==== Delay - программная задержка. ==========

.==== Формальный аргумент - величина задержки.

Delay

MACRO

Time

LOCAL

Ext, Inn

push

cx, Time

Ext:

push

cx, cx

Inn:

loop

loop

ENDM

==== myprog.asm - основная программа. ===============

. MODEL small INCLUDE mymacro.inc . DATA

Buf DB, 100 dup (?)

BSize = $ - Buf

. CODE

Begin:

WrMem Buf, BSize Delay 200h Delay WORD PTR [bx] END Begin

1.2.6. Многомодульные программы

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

Для того чтобы процедуры объектной библиотеки были доступны из других модуле их имена должны быть объявлены как глобальные. Для этого в модуле, где они опред Лены, применяют директиву PUBLIC, имеющую следующий формат: 1С имя 1, имя 2, ... .




myprog.asm - файл ойновной программы.

. MODEL small . STACK lOOh . DATA

. CODE

EXTRN myproc: PROC

Begin:

call END

NEAR PTR myproc Begin

==== myproc.asm - файл с подпрограммой.

. MODEL small . CODE

PUBLIC myproc myproc PROC NEAR

myproc ENDP END

Примечания.

1) Предполагается, что модули после слияния образуют один кодовый сегмент. Поэтому процедура MYPROC объявлена как ближняя,

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

2) Модуль с процедурой заканчивается директивой END без параметров, так как точка входа указывается только в главном модуле.

Вместо директив PUBLIC и EXTRN можно воспользоваться эквивалентной им директивой GLOBAL, имеющей следующий формат: GLOBAL имя 1: PROC, имя 2: PROC, ....

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

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

tasm /zi myprog, myprog, myprog tasm /zi myproc, myproc, myproc tlink /v myprog + myproc, myprog

В результате трансляции будут получены файлы MYPROG.OBJ, MYPROG.LST, MYPROC.OBJ, MYPROC.LST. Компоновщик объединит модули MYPROG.OBJ и MYPROC.OBJ и образует загрузочный модуль MYPROG .ЕХЕ.

Возможен и другой вариант разработки многомодульной программы, заключающийся в создании при помощи программы-библиотекаря TLIB.EXE библиотеки объектных модулей MYOBJ.LIB с последующим извлечением из нее нужного модуля компоновщиком. Включение объектного файла MYPROC.OBJ во вновь создаваемую объектную библиотеку MYOBJ.LIB и получение файла MYOBJ.LST с каталогом библиотеки можно выполнить следующим образом: tlib myobj.lib +myproc.obj, myobj.lst

Знак + перед именем модуля означает, что этот модуль надо добавить в библиотеку, знак - означает, что модуль надо удалить. Два первых расширения имен файлов, предполагаемых по умолчанию, можно опустить: tlib myobj +myproc, myobj.lst

Включение вновь созданного объектного модуля NEWPROC.OBJ в уже существующую объектную библиотеку MYOBJ.LIB можно произвести следующим образом: tlib myobj -fnewproc, myobj.lst, myobj;

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

Команда вызова компоновщика в рассматриваемой ситуации должна содержать имя объектного файла с основной программой, имя результирующего файла и имя библиотеки: tlink myprog, myprog, , myobj.lib

1.2.7. Использование вызовов системных функций в прикладных программах

Ассемблер допускает программирование на высоком, среднем и низких уровнях В первом случае суть программирования заключается в подготовке данных, необходи мых для работы системных функций DOS, с последующим вызовом этих функций. Осо бенностью такого метода программирования является простота написания и наглядност исходного текста. Для повышения скорости работы программы в операциях ввода вывода можно использовать прямое обращение к функциям BIOS (средний уровень Низкий уровень программирования подразумевает прямое обращение к портам ввода вывода и прямой доступ в память. Такой стиль программирования требует хорошег знания принципов работы устройств персонального компьютера и оправдан либо пр

Для объявления тех же имен как глобальных в вызывающих модулях используется директива EXTRN, имеющая следующий формат: EXTRN имя 1: PRCX;, имя 2: PROC, ... .

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



0 1 2 3 4 [ 5 ] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88