Анимация
JavaScript
|
Главная Библионтека На экране после запуска отладчика и зафузки профаммы появится строка главного меню (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.
Процедурой или подпрофаммой называется код, к которому можно перейти и из которого можно возвратиться так, как будто код вводится в ту точку, из которой осуществляется переход. Переход к процедуре называется вызовом, а соответствующий обратный переход -возвратом. Процедуры суть основное средство разделения кода профаммы на модули. Основные требования к процедурам: при вызове процедур необходимо запоминать адрес возврата - это действие осуществляется автоматически при выполнении команды 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:
ENDM ;==== Delay - программная задержка. ========== .==== Формальный аргумент - величина задержки.
==== 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 |