Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Даже беглый взгляд на фрагмент дизассемблированного кода для цикла for позволяет сделать некоторые выводы. Как видите, компилятор генерирует избыточный код (даже если опция оптимизации включена!). Это мало сказывается на быстродействии программы, если мы обрабатываем несколько символов в строке. Однако чаще всего приходится обрабатывать большие массивы данных или строк, и замедление работы программы станет более существенным.

Еще одно замечание каьается использования команд переходов. Архитектура современных процессоров основана на алгоритмах упреждающей выборки (prefetch) и прогнозирования (prediction) очереди команд. Команды переходов, генерируемые компилятором, часто не учитывают эту особенность и замедляют работу программы. Подобные нюансы оптимизации работы на уровне процессора частично реализованы в компиляторе С + + фирмы Intel. Как видим, использование ассемблера даже в такой небольшой программе может дать выигрыш в быстродействии.

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

Глава 4
Программирование приложений в Windows на языке ассемблера: первые шаги
Эта глава целиком посвящена вопросам разработки Windows-приложений на языке ассемблера. Мы рассмотрим программы, полностью написанные на ассемблере. Потребность в написании таких программ возникает, когда нужно спроектировать максимально быстрое приложение, например для мобильных систем, или же необходимо максимально увеличить производительность какого-либо устройства.
Вначале вспомним немного теории. 32-разрядные Windows-приложения, как известно, выполняются в защищенном режиме и имеют в своем распоряжении 4-гигабайтное пространство адресов. Однако это совсем не означает, что программа будет использовать его полностью. .
В отличие от 16-разрядных приложений, где все программы могли "видеть" друг друга, для 32-разрядных приложений все по-другому. Каждое такое приложение выполняется в своем собственном пространстве адресов, принадлежащих только ему. Это исключает риск потери данных или сбоя программы, что возможно в случае 16-разрядных приложений, где другая программа могла нарушить ход выполнения приложения.
И еще одно отличие. В 16-разрядных приложениях применялась адресация с использованием сегментных регистров cs, DS И ES. Это влекло за собой определенные неудобства. Во-первых, сегменты кода программы и данных не могли превышать 64 Кбайт, и для компоновки больших приложений приходилось применять различные ухищрения. В 32-разрядных приложениях не существует разделения на сегменты, и программисту не нужно заботиться об адресации сегментных регистров. Во-вторых, вычисление исполнительных адресов в 16-разрядных приложениях (сегмент + смещение) замедляло работу программы.
Графические приложения Windows основаны на архитектуре, управляемой событиями. Я не буду подробно останавливаться на особенностях работы приложений в операционных системах Windows, т. к. имеется много литературы, достаточно хорошо описывающей ключевые аспекты данного вопроса.
Следует упомянуть лишь основные функциональные составляющие графических Windows-приложений.
Программный код такого приложения должен включать в себя оконную процедуру. Оконная процедура регистрируется в системе и вызывается всякий раз, когда выполняется какая-либо операция над окном приложения. Приложение обязательно должно включать в себя и цикл обработки сообщений.
В этом цикле программа выбирает из очереди сообщения, предназначенные для окна приложения, и направляет их в Windows. Операционная система передает сообщения оконной процедуре, которая и выполняет соответствующие действия. Кроме того, в программе обычно присутствуют и операторы, выполняющие инициализацию приложения.
Программный код стандартного графического Windows-приложения обычно размещается в функции winMain, выполняющей следующие операции:
• инициализация приложения;
• регистрация класса окна приложения;
• инициализация цикла обработки сообщений;
• завершение выполнения приложения.

Теперь можно перейти к программной реализации оконного Windows- приложения. Прежде всего проанализируем программный код такого приложения на одном из языков высокого уровня. Такой подход позволяет лучше понять структуру приложения Windows. Можно воспользоваться, например, Мастером приложений Visual С++ .NET и сгенерировать Win32 Project. Даже если читатель не знаком с языком С++, он все равно легко поймет исходный текст такого приложения.
Наша базовая программа на С + + выводит пустое окно на экран. Изменим программу так, чтобы она выводила в рабочую область окна приложения текст, например "HELLO FROM VISUAL С++ . N E T ! " . ДЛЯ начала упростим исходный текст приложения, сгенерированного для нас Мастером приложений С + + .NET, исключив обработчик меню из программы.
Работу с графикой и текстом мы будем рассматривать подробно в главе 5, а сейчас нам понадобятся некоторые основные понятия. В системе Windows можно выводить информацию только в рабочую область окна приложения. Чтобы вывести текст, воспользуемся следующей особенностью системы: при любых изменениях размеров окна, при восстановлении рабочей области, а также при инициализации окна операционная система Windows посылает приложению сообщение WMPAINT. Оконная процедура программы может (хотя и не обязательно) использовать это сообщение, чтобы перерисовать рабочую область окна. Такая перерисовка также восстанавливает или рисует текст в рабочей области.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru