Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






If PrinterSetupDialog1.Execute then





Print;

end;

{Обработчик событий для кнопки «Выход»}

procedure TForm1.Button3Click(Sender: TObject);

Begin

Close;

end;

В обработчике событий для кнопки «Выполнить» определяется массив Data. Это необходимо для того, чтобы у программы, написанной на языке ассемблера, была область памяти для свободного доступа и использования. Дело в том, что Windows, работая в защищенном режиме, контролирует использование памяти, запрещая доступ в области, куда загружены системные программы. В общем случае, контролируется доступ в программные области других запущенных программ. В связи с этим нужно позаботиться о том, чтобы Windows выделил программе область памяти, которую можно использовать спокойно, не боясь запрета доступа. Самым протым способом является объявление массива необходимой длины, каким и является массив Data.

После того, как все обработчики событий созданы, проект надо откомпилировать, последовательно выбрав в главном меню «ProjectBuild Project 1» или нажать < Shift >+< F9>. Если есть ошибки, то исправить их.

Если ошибок нет, то заготовка проекта для всех лабораторных работ готова и теперь ее надо сохранить в репозиторий. Для этого последовательно выбираем пункты меню «ProjectAdd to Repository …», после чего появляется окно, изображенное на рисунке 3.

Рисунок 3. Окно добавления проекта в репозиторий.

 

Сделав активной папку «Delphi Projects» нажимаем кнопку «New Category …» и создаем категорию «For Assembler», далее, в поле «Title:» набираем «Для ассемблера», в поле «Description:» набираем «Заготовка для изучения языка ассемблера», в поле «Author:» набираем свою фамилию. После заполнения всех полей нажимаем кнопку «OK». Теперь при открытии нового проекта для выполнения очередной лабораторной работы надо будет выбрать «FileNewOther …», в появившемся окне, изображенном на рисунке 4, в левой части окна «Item Categories» выбираем папку «For Assembler», а в правой части выбираем значок с подписью «Для ассемблера». Далее открывается окно для выбора папки, где будут располагаться файлы нового проекта. В этом окне надо создать в личном каталоге новую папку с именем, содержащим номер лабораторной работы, например, «Лаб1» и выбрать ее, нажав кнопку «ОК». Будет создан новый проект на основе созданного ранее шаблона, который будет автоматические содержать нужные объекты на форме и запрограммированные обработчики событий.

Работа с новым проектом проходит в следующем порядке.

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

[метка:] мнемоника команды [1ый операнд[,2ой операнд[,3ий операнд]]]

Фрагменты, записанные в квадратных скобках, могут отсутствовать. В качестве меток могут использоваться стандартные метки Pascal объявленные в разделе описания меток lable. Кроме того, без объявления могут использоваться специфические метки вида @@X, где X – любое целочисленное число.

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

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

Рисунок 4. Окно выбора типа нового проекта из репозитория.

 

Рисунок 5. Установка точки останова.

 

Затем, запустить проект, последовательно выбрав в главном меню «RunRun» или нажать <F9>. В окне запустившейся программы нажать на кнопку «Выполнить». После остановки программы в точке останова вызвать окно отладчика, для чего последовательно выбрать пункты меню «ViewDebug WindowsCPU Windows► Entire CPU» или нажать < Ctrl>+<Alt>+<C >. После этого откроется окно отладчика, изображенное на рисунке 6.

 

 
 
 
 
 
Рисунок 6. Окно отладчика. Поле 1 – текст программы в машинном коде и мнемоникой команд; Поле 2 – дамп памяти, соответствующий сегменту данных; Поле 3 – регистры общего и специального назначения; Поле 4 – флаги процессора; Поле 5 – дамп памяти, соответствующий сегменту стека


 

Окно отладчика состоит из пяти полей. В первом поле отображается текст программы. Первая колонка – адреса расположения каждой ассемблерной команды в сегменте кода, вторая колонка – машинный код, соответствующий ассемблерной команде. Можно заметить, что каждой ассемблерной команде соответствует машинный код разной длины, что характерно для CISC процессоров. Третья колонка – текст на языке ассемблера, который получился при компиляции программы на языке Delphi. Выделенные жирным шрифтом строчки – строчки программы на Delphi, а строчки, отображаемые обычным шрифтом, расположенные под ней – соответствующий ей ассемблерный код. Красная точка слева от первого столбца – точка останова. Еще левее отображается синяя стрелка – указатель на команду, которая сейчас должна будет выполниться. Если текущей командой является команда обращения к памяти, то сверху отображается эффективный адрес ячейки памяти, к которой будет происходить обращение и ее значение.

Поле номер 2 служит для отображения содержимого памяти в сегменте данных в виде, так называемого, дампа памяти. В первой колонке выводиться адрес первой ячейки памяти, отображаемой в строке. Во втором столбце отображается информация о значениях восьми последовательных ячеек памяти. В третьем столбце отображается ASCII представление каждого байта в строке. Отображение информации в поле номер 2 можно менять с помощью контекстного меню, представленного на рис. 7, которое вызывается нажатием правой кнопки «мыши», когда она расположена в поле номер 2.

 

 

Рисунок 7. Контекстное меню поля номер 2.

 

Меню «Goto Address …» служит для изменения начального адреса памяти для отображения. На рисунке 8 изображено состояние программы после выполнения одной команды ассемблерной вставки. Текущая команда теперь – загрузка эффективного адреса начала массива Data в РОН EBX. Сверху первого поля видно, что этот адрес равен $0012F2D4 (символ “$” означает, что далее идет шестнадцатеричное представление информации). Это означает, что для отображения информации о значениях ячеек памяти массива Data, в поле номер 2 надо изменить текущий адрес отображения. Для этого надо вызвать контекстное меню, выбрать «Goto Address …», в появившемся окне набрать $0012F2D4 или $12F2D4 и нажать «ОК» (см. рис. 8). После этого начнется отображение информации по этому адресу, как это показано на рисунке 9. Как видно, адреса в первой колонке поменялись и теперь начинаются с указанного нами значения, а значения ячеек памяти по этим адресам равны нулю, как и должно быть, так как первые строчки обработчика событий кнопки «Выполнить» обнуляют массив Data.

Меню «Display As» позволяет изменить формат отображения значений ячеек памяти в соответствии с выбранным (см. рис. 10) типом данных.

 

Рисунок 8. Выбор адреса дампа памяти в поле номер 2.

 

Рисунок 9. Результат изменения адреса дампа памяти в поле номер 2.

Рисунок 10. Изменение формата отображения значений ячеек памяти.

 

Меню «Search …» позволяет искать нужное значение или последовательности значений в памяти.

Меню «Change …» позволяет изменять значение или последовательности значений в памяти.


Поле 5 на рисунке 6 полностью аналогично полю 2, только в нем отображается сегмент стека. Синей стрелкой указывается вершина стека. В процессорах Intel P6 стек растет в сторону уменьшения адресов.

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

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

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

<F8> – выполнить одну инструкцию без захода в подпрограмму;

<F7> – выполнить одну инструкцию c заходом в подпрограмму;

< Shift >+<F8> – выполнить до следующей команды исходного текста на языке Pascal;

<F4> – выполнить до места положения текстового курсора.

Выполнение в пошаговом режиме вести до конца ассемблерной вставки, отмечая изменения регистров, флагов ЦПУ и данных в памяти на каждом шаге. После выполнения последней команды ассемблерной вставки, завершить выполнение программы нажатием клавиши <F9>.

Если получился ожидаемый результат, то распечатать окно формы с результатами выполнения программы с помощью кнопки «Печать», а затем завершить выполнение программы с помощью кнопки «Завершить». В завершении, распечатать часть программы, содержащую ассемблерную вставку. Для этого, выделить ассемблерную вставку и последовательно выбрать «FilePrint …». В появившемся окне отметить поле «Print selected block».








Date: 2015-10-19; view: 608; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.011 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию