Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Materialy_Arhitektura.doc
Скачиваний:
22
Добавлен:
18.09.2019
Размер:
1.84 Mб
Скачать

108. Макроозначення та функції в Асемблері. Макроозначення Invoke.

Директива INVOKE

Для более удобного вызова процедур с параметрами, передающимися через стек, MASM предоставляет специальное средство в виде директивы INVOKE: INVOKE имя_процедуры [.аргументы]

Основная ее задача - сформировать код, который, во-первых, размещает аргу¬менты в стеке, во-вторых, вызывает процедуру и, в третьих, чистит стек после за¬вершения работы процедуры. Например, традиционный способ вызова процеду¬ры выглядит так:

push параметру

'" push параметр 2 push параметре call имя_проце~дуры

С использованием INVOKE тот же самый вызов будет выглядеть следующим об¬разом: INVOKE имя_процедуры, параметр_1, параметр_2 . . . лараметр_п

Для INVOKE аргумент имя.процедуры не должен быть опережающей ссылкой на адрес. Чтобы исключить подобные ситуации, существует «парная» для INVOKE ди¬ректива PROTO:имя^процедуры PROTO [расстояние] [язык] [, [параметр] :тип] ...

Эта директива информирует ассемблер о количестве и типах аргументов, кото¬рые принимает процедура. Использование данной директивы позволяет ассемб¬леру выполнять проверку типов. Обычно все директивы PROTO для процедур соби¬раются в начале исходного текста программы либо в отдельном включаемом файле. Директива PROTO принимает три типа аргументов - расстояние, язык, параметры процедуры с указанием их типов

109. Змінні в Асемблері. Їх розміщення.

Структуры.

Структура это набор переменных (данных). Структура задаётся с помощью директивы struct и ends.

SOMESTRUCTURE STRUCT

dword1 dd ?

dword2 dd ?

some_word dw ?

abyte db ?

anotherbyte db ?

SOMESTRUCTURE ENDS

(имя структуры не должно содержать прописных букв).

Вы также можете объявить ваши переменные как в секции с инициализированными дан-ными, так и в секции с неинициализированными данными, со знаком вопроса.

MYSTRUCT struc

dword1 dd ?

dword2 dd ?

some_word dw ?

abyte db ?

anotherbyte db ?

MYSTRUCT ends

.data

msg MYSTRUCT >

или

MYSTRUCT struc

dword1 dd ?

dword2 dd ?

some_word dw ?

abyte db ?

anotherbyte db ?

MYSTRUCT ends

.data?

msg MYSTRUCT >

одинаковый результат, но во втором случае размер файла будет меньше.

110. Особливості Асемблера в Windows. Створення вікон.

о программировании для Windows изложение, как

правило, ведется на базе языка C/C++, реже — на базе Pascal. А что же

ассемблер — в стороне? Конечно, нет! Мы не раз обращали ваше внимание на

правильное понимание места ассемблера в архитектуре компьютера. Любая

программа на языке самого высокого уровня в своем внутреннем виде

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

остается теоретическая возможность написать ту же программу, но уже на языке

ассемблера: Непонимание или недооценка такой возможности приводит к тому,

что достаточно часто приходится слышать фразу, подобную следующей: «Ах, опять

этот ассемблер, но ведь это что-то несерьезное!» Также трудно согласиться с

тезисом, который чаще всего следует вслед за этой фразой. Суть его сводится к

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

рассматривать проблему эффективности функционирования программы в качестве

первоочередной. Гораздо легче решить ее за счет увеличения объема памяти,

быстродействия центрального процессора и качества компьютерной периферии.

Чем обосновать необходимость разработки Windows-приложений на языке

ассемблера? Приведем следующие аргументы:

Ø языке ассемблера позволяет программисту полностью

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

усмотрению;

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

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

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

меньший размер;

Ø при программировании на ассемблере сохраняется полный доступ к

аппаратным ресурсам компьютера;

Ø приложение, написанное на языке ассемблера, как правило,

быстрее загружается в оперативную память компьютера;

Ø приложение, написанное на языке ассемблера, обладает, как

правило, более высокой скоростью работы и реактивностью ответа на действия

пользователя. Разумеется, эти аргументы не следует воспринимать, как

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

и о том, что существует бесконечное множество прикладных задач, ждущих своей

очереди на компьютерную реализацию. Далеко не все из этих задач требуют

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

являются столь же тяжеловесные исполняемые файлы. Многие прикладные задачи

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

1. Оконные приложения Windows.

Windows поддерживает два типа приложений:

Ø оконное приложение — строится на базе специального

набора функций (API), составляющих графический интерфейс пользователя (GUI,

Graphic User Interface). Оконное приложение представляет собой программу,

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

работы оконного приложения является отображение на экране специального объекта

— окна. После того как окно отображено на экране, вся работа приложения

направлена на то, чтобы поддерживать его в актуальном состоянии;

Основной тип приложений в Windows — оконные, поэтому с них мы и начнем

знакомство с процессом разработки программ для этой операционной системы.

Любое оконное Windows-приложение имеет типовую структуру, основу которой

составляет так называемое каркасное приложение. Это приложение содержит

минимально необходимый программный код для обеспечения функционирования

полноценного Windows-приложения. Не случайно во всех источниках в качестве

первого Windows-приложения рекомендуется изучать и исследовать работу

некоторого каркасного приложения, так как именно оно отражает основные

особенности взаимодействия программы с операционной системой Windows. Более

того, написав и отладив один раз каркасное приложение, вы будете использовать

его в необходимую терминологию и сможем больше внимания уделить логике работы

Windows-приложения, а не деталям его реализации.

Минимальное приложение Windows состоит из трех частей:

Ø главной функции;

Ø цикла обработки сообщений;

Ø оконной функции.

Выполнение любого оконного Windows-приложения начинается с главной функции.

Она содержит код, осуществляющий настройку (инициализацию) приложе­ния в среде

операционной системы Windows. Видимым для пользователя резуль­татом работы

главной функции является появление на экране графического объекта в виде окна.

Последним действием кода главной функции является создание цикла обработки

сообщений. После его создания приложение становится пассивным и начинает

взаимодействовать с внешним миром посредством специальным образом оформленных

данных — сообщений. Обработка поступающих приложению сообщений

осуществляется специальной функцией, называемой оконной. Оконная

функция уникальна тем, что может быть вызвана только из операционной системы, а

не из приложения, которое ее содержит. Таким образом, Windows-приложение, как

минимум, должно состоять из трех перечисленных элементов.

Каркасное Windows-приложение на ассемблере содержит один сегмент данных .data

и один сегмент кода . code. Сегмент стека в исходных текстах Windows-

приложений непосредственно описывать не нужно. Windows выделяет для стега

объем памяти, размер которого задан программистом в файле с расширением .

def. Текст листинга 2 достаточно большой. Поэтому для обсуждения разобьем erо

комментариями на характерные фрагменты, каждый из которых затем поясним

необходимой степенью детализации.

Создание диалогового окна

Диалоговое окно, как и меню, может быть создано несколькими способами: во-первых, с помощью описания его в файле ресурсов и, во-вторых, во время выполнения программы. Наиболее часто используется описание диалога в файле ресурсов. Лучше всего при создании диалого воспользоваться редактором ресурсов, с помощью которого может быть создан текстовый файл, содержащий описание диалогового окна. Ресурсы диалога в этом текстовом файле задаются оператором DIALOG, который имеет следующий формат:

DialogName DIALOG [DISCARDABLE] X,Y,Width,Height

CAPTION "Заголовок окна"

STYLE <Стили диалогового окна>

FONT n, <имя шрифта>

{

Описание элементов диалога

}

В данном случае DialogName - это имя диалогового окна. Опция DISCARDABLE станет совершенно ясной при рассмотрении вопроса об организации памяти в Windows. Параметры X и Y - это координаты верхнего левого угла диалового окна, Width и Height - ширина и высота диалога. STYLE описывает стили окна. Здесь могут использоваться как стили, применяемые для описания обычных окон, так и стили, применяемые только в диалоговых окнах. Эти новые стили приведены в таблице:

Стили диалоговых окон Стиль Значение Эффект

DS_ABSALIGN 0x0001L Положение диалогового окна исчисляется в экранных координатах

DS_SYSMODAL 0x0002L Создается системное модальное диалоговое окно

DS_3DLOOK 0x0004L Создается диалоговое окно, имеющее зрительную иллюзию трехмерности

DS_FIXEDSYS 0x0008L Вместо SYSTEM_FONT используется SYSTEM_FIXED_FONT

DS_NOFAILCREATE 0x0010L Диалоговое окно создается, несмотря на то, что при его создании произошли ошибки

DS_LOCALEDIT 0x0020L В 32-битных приложениях не используется

DS_SETFONT 0x0040L Определяет шрифт, который будет применятся в диалоговом окне

DS_MODALFRAME 0x0080L Создается модальное диалоговое окно

DS_NOIDLEMSG 0x0100L

DS_SETFOREGROUND 0x0200L Поместить диалоговое окно на передний план

DS_CONTROL 0x0400L

DS_CENTER 0x0800L Диалоговое окно помещается в центр рабочей области

DS_CENTERMOUSE 0x1000L

DS_CONTEXTHELP 0x2000L

Приведенных выше сведений вполне достаточно, чтобы написать заготовку диалогового окна в файле ресурсов. Но какой смысл описывать диалоговое окно, если в нем нет ни одного из элементов управления? Ведь даже закрыть такое диалоговое окно (если в нем, конечно, нет системного меню) невозможно! Значит, нам необходимо срочно научиться описывать эти элементы!

Я уже упоминал о том, что в "недрах" Win32 есть масса предопределенных объектов. В частности, там находятся и некоторые предопределенные классы окон. К таким классам относятся кнопки (класс "button"), списки (класс "listbox"), комбинированные списки (класс "combobox"), окна редактирования (класс "edit"), полосы прокрутки (класс "scrollbar"), статистические элементы (класс "static"). У каждого класса есть свой определенный набор стилей, которые определяют внешний вид и поведение элементов управления, относящихся к данному классу.

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

111. Операції на рядками в Асемблері. Мінімальна одиниця тексту програми на мові асемблера – це рядок. Асемблер проглядає програму порядкові зверху в низ, кожний рядок закінчується символом переведення рядка Vпйого довжина в більшості випадків не може перевищувати 255 символів, однак зручно обмежувати довжину рядка широкою екрану (80 символів). При необхідності вводити в програмі довгі рядки їх можна об’єднувати, в кінець рядка при цьому потрібно включати символ \. Рядок 1 \ Рядок 2 Рядок 1 Рядок 2. В текст програми можна вставляти порожні рядки, які складаються тільки із розділювачів. В мові асемблера розділювачами служать символи пропуску та горизонтальна табуляція. При допомозі пустих рядків зручно розділяти логічні частини програми. Рядок може складатись тільки із коментарів, в такому випадку перший символ рядка обов’язково ;. В кожному рядку може розміщуватись або команда мікропроцесора, яка записана у мнемонічному (словом) вигляді, або директива, директиви інакше називають псевдооператорами. Команда мікропроцесора – це інструкція яку мікропроцесор буде виконувати в процесі виконання програми. Асемблер переводить рядки з мнемоніками (буквеними записами команд) у послідовності байт, які безпосередньо може виконувати процесор. Директиви служать для визначення даних, які використовуються в програмі і для управління процесом асемблювання. Рядок у програмі на мові асемблера може складатися з 4 полів: Поле мітки (поле імені); Поле оператора (або псевдооператора); Поле операндів; Поле коментарів. Обов’язковим є тільки поле оператора або псевдооператора, всі решту полів можуть бути відсутні. Мітка є спрощеною мнемонічною формою запису адреси команди в сегменті коду. Так саме ім’я є спрощеною формою запису вмісту деякої переважно в сегменті даних. Отже рядки в програмі записуються в такому загальному вигляді: [< мітка >]: < команда > < операнди >; коментарі < ім’я > <директива < операнди >; коментарі Потрібно звернути увагу на відсутність “:” після імені. Поля в рядках мови асемблера розділяються між собою на крайній мірі одним пропуском. Розглянемо поля детальніше. Поле мітки. При визначенні в програмі мітки або імені змінної можна використовувати букви латинського алфавіту великі або малі, а також символи :? _ @ $. Максимальна к-сть символів з яких може складатись мітка або ім’я 255, але відрізняються мітки та імена по перших 32символах. Доцільно в програмі використовувати осмислені імена. Зручно і програмі для швидкого розпізнавання міток від імені починати всі мітки з букви L і записувати їх тільки великими буквами. При записі імен змінних зручно використовувати префікс, який означає тип змінної, наприклад : skp_byte. При програмуванні з використанням асемблера masm, або tasm можна використовувати будь-яке число локальних міток @@. Для переходу до таких міток треба використовувати зарезервовані слова: @F – forward; @B – backward. Перш0п@F – це перехід до наступної мітки, @B – це перехід до попередньої мітки. Мітка або ім’я змінної не повиннVпбути зарезервованим словом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]