Анимация
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

Project Wizard-


File Cfealion

□ inc

□ Rc

□ Oef

Foldet Cfeatiori

□ Bak

□ Mod

□ Res

□ ixl GMak

< Назаш

Яалее >

Puc. 5.2.2. Мастер проектов - Файлы u директории

В секции File Creation пометьте, файлы каких типов Вам понадобятся: в проект будут добавлены новые файлы с именами Вашего проекта и соответствующими расширениями.

В секции Folder Creation, если Вы собираетесь использовать ресурсы, Вам понадобится папка RES, и чтобы ее создать, достаточно выбрать опцию Res. Ресурсы - "некодовая" секция, добавляемая в образ приложения в момент его сборки и доступная во время выполнения. Она позволяет включать фактически любые двоичные данные в исполняемый или DLL файл. Добавление ресурсов в проект происходит посредством редактирования сценария определения ресурсов, имеющего расширение .гс и компилируемого в .res файл компилятором ресурсов (обычно RC.EXE из пакета конкретного транслятора) и подключаемого редактором связей к результирующему модулю исполняемого файла проекта.

RadASM позволяет создавать ресурсы, управлять их компиляцией и связыванием так же, как и файлами исходного кода. Основной файл ресурсов отображается в браузере проекта и может быть отредактирован вручную. RadASM создает отдельные RC файлы для каждого типа ресурсов, эти файлы размещаются в папке /RES проекта. Перечислим ресурсы, поддерживаемые средой RadASM: изображения bmp, gif, jpg, курсоры, иконки-

Project Wizard -


ERun

□ Run w/debug

□ Go All

□ Assemble Modules

Make Menu □Compile RQ

□ Assemble

□ Link

□ Build

□ Go

Compile RC: 4.0.$B\Ri;.EXE Уу,1

Assemble: 3,0,$B\ML.EXE /с УсоН /Ср /nologo /"$1

Link: 5,0,$B\LINK.EXE /SUBSYSTEM:WINDO

Run: 0.0..5

Run w/debug; 0,0,\OlljiDbg\OllyDbg.5

Res To Obj: ,src obi,0.$B\CVTRES EXE,tsic.tes

Asm Module: -.obi.O.SBML EXE /с /coff /Cp /nologo A

< Назад

Puc. 5.2.3. Мастер проектов - Настройка меню Make

Оставляем все как есть и нажимаем на кнопку "Далее" (Next).

В результате работы мастера новых проектов мы получили настроенную для создани) и сборки нашего проекта среду RadASM и пустой файл исходного кода Hello World.asm Двойным щелчком мыши откройте его для редактирования и наберите следующий текс на языке ассемблер.

мультимедиа файлы AV1, MIDI, WAVE, таблицы строк, меню, диалоги, панели инструментов, информация о версии, «сырые данные».

Выбрав опцию Mod секции Folder Creation, Вы в директории проекта создадите папку fOD для подпроектов впоследствии, чтобы разбить большой проект на меньшие, для дучшей управляемости. Если Вы хотите создать ВАК папку резервных копий, выберите в окне Project Wizard опцию Bak.

Для создания приложения "Hello world" сделайте выбор, как показано на рис. 5.2.2 и нажмите кнопку "Далее" (Next).

Последний лист свойств (рис. 5.2.3) мастера новых проектов, возможно, самый важный. В нем настраиваются перечень, сами команды фансляции и сборки проекта, которые будут доступны в меню Маке среды RadASM (предлагаемые по умолчанию команды не требуют изменений для большинства возможных проектов). Однако, если предполагается использование ресурсов, удостоверьтесь, что строка команды Link заканчивается на ",4", иначе программа редактор связей не сможет работать с ва1пим ресурсным файлом. Главным образом это касается сборки динамически связываемых библиотек DLL, содержащих ресурсы.

С целью скорейшего получения работоспособной профаммы "Hello World" под Windows, выберем в окне "Project wizard - Type & Name" вид окружения Win32 Арр („ res). Для создания полноценного "диалогового" приложения следует выбирать Win32 Арр. После присвоения нашему проекту имени "Hello World", а его описанию строки "The Hello World application", нажимаем кнопку "Далее" (Next).

В следующем окне (рис. 5.2.2) можно задать перечень файлов и подиректорий, которые будут созданы в корневой директории нашего проекта.




318 Ассемблер в задачах защиты информац

53. Программа «Не11о World»

Текст профаммы "Hello World" на языке ассемблер: .386

.MODEL flat, stdcall option casemap:none

include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib kernel32.1ib include \masm32\include\user32.inc includelib user32.1ib

.const MsgCapiion MsgBoxText

db "The He-llo World applicatin" , 0 db "Hello World!",0


.code start:

invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, ME invoke ExitProcess,NULL end start

После правильного набора текста программы выберите пункт Run меню Маке для е( запуска на выполнение. В результате на экране появится окно (рис. 5.3.1), в случае не удачи следует проверить правильность ввода текста.

The Hello World applicatfrTg

Hello Woridi

Puc. 5.3.1. Результат работы программы Hello World

Wm32 профаммы выполняются в защищенном режиме, который "в полном объеме" ста доступен начиная с 80386. Каждую Win32 профамму Windows запускает в отдельно! виртуальном пространстве размером в 4 гигабайта, но это вовсе не означает, что 4 гигабайт физической памяти будут доступны, а всего лишь то, что Win32 профамма может обращаться по любому адресу в этих пределах (на самом деле и это не совсем так, но близко).

Windows делает все необходимое, чтобы память, к которой программа обращается, была "существующей". Конечно, профамма должна придерживаться oпpeдeлeнныN правил, установленных Windows, иначе может произойти сбой зашиты "General Protection Fault".

В рамках такой организации мы больше не должны беспокоиться о моделях памяти ил" сегментах. При профаммировании под Windows применяется только одна модель - пло-

лава 5. Программирование на ассемблере nog Windows

ская (FLAT - большое последовательное 4 гигабайтовое адресное пространство). Это та означает, что работа с сегментными регистрами максимально упростилась и мо: использовать любой из них для адресации ячеек памяти по всему пространству адресов.

При профаммировании под Win32 необходимо помнить следующее: Wind использует esi, edi, ebp и ebx для своих целей и ожидает корректной работы профам по сохранению их значений. Если же вы используете какой-либо из этих четы регистров между вызовами системных функций, то не забывайте сохранять и восстаь ливать их значения в процессе работы.

Обычно при разработке профамм на любом языке профаммирования всегда сущ« вуют правила, по которым оформляется файл исходного кода. Ассемблер для Wind( не является исключением. Ниже приводится шаблон, который можно всегда испол! вать при написании новой профаммы.

.386

.MODEL Flat, STDCALL . DATA

; <Инициализированные данные>

.DATA?

; <НеинициализироБанные данные>

.CONST

; <Константы>

.CODE <метка>: ; <Код>

end <метка>

.386 - это директива ассемблера, .указывающая на использование при трансляции м МОНИК операций из набора команд процессора 80386. Можно также использовать .486, .t и т. д, но наиболее общим является выбор именно .386. Доступны два набора инструкг лля каждого типа процессора: .386/.386р, .486/.486р и т. д. Версии с буквой "р" необходи в случае, если разрабатываемая профамма использует привелегированные инструкг защищенного режима. Они могут пофебоваться только в "защищенном" коде, напршу при разработке драйвера ядра или системной службы.

.MODEL FLAT, STDCALL

•MODEL - это ассемблерная директива, определяющая модель памяти Ваш профаммы. Как было уже сказано, в Win32 существует только одна модель - плос! (FLAT). Директива STDCALL устанавливает правила передачи параметров через ci при вызове подпрофамм (функций), а также код, ответственный за его очистку по



вершении вызова. Исторически, со времен Win 16 унаследованы два соглашения о передаче параметров: С и PASCAL.

По С-соглашению, параметры передаются справа налево, т. е. самый правый параметр кладется в стек первым. Вызываюший код должен очишать стек после вызова. Например, при вызове профаммой функции с именем foo (firstjaram, secondjaram, thirdjaram), используя соглашение С, результат фансляции будет выглядеть так:

push [third param] push [ second param] push [flrst param] call foo add sp, 12

Поместить в стек третий параметр затем второй параметр и, наконец, первый

Вызывающий код производит очистку стека

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

Win 16 использует такой порядок передачи с целью сокращения размера вызывающего кода (отпадает необходимость очистки стека после каждого вызова). С-соглашенис удобно в случае вызовов функций с переменным числом парамефОв.

STDCALL - это гибрид С и PASCAL. Согласно ему, данные передаются справа налево, но вызываемая фукнкция ответственна за очистку стека. Платформа Win32 использует исключительно STDCALL, за исключением wsprintf() (в данном случае необходимо следовать соглашению вызовов С).

.DATA .DATA? .CONST

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

.DATA - эта секция содержит инициализированные во время фансляции профаммы данные (переменные, строки, массивы).

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

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

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

Для размещения исполняемого кода профаммы возможно наличие, и только в ед ственном экземпляре, секции .CODE. Ее сфуктура описана ниже.

. CODE <метка>:

end <метка>

<метка> - любая произвольная метка, устанавливающая фаницы кода профам\ Обе метки должны быть идентичны. Весь код должен располагаться между этими rpai цами. Поле <метка> также является точкой запуска (стартовой функцией) профаммы.

А теперь обсудим, что представляет собой текст профаммы "Hello World" и что он дела

Целью нашей первой профаммы является вывод на экран сообщения. Поскольку ( Windows может осуществлять вывод информации только в соответствующие окна, i должны после запуска профаммы создать окно сообщений и по завершении рабо с ним пользователя осуществить правильный выход в систему.

ОС Windows обладает Офомным количеством профаммных ресурсов Windows А (Application Programming Interface) и предоставляет их профаммам в виде готовых j использования функций. Эти функции размещаются в нескольких системных модуля; динамически зафужаемых библиотеках kemeI32.dll, user32.dll и gdi32.dll. Kemel32. содержит функции взаимодействия с памятью и управления процессами. User32. кошролирует пользовательский интерфейс. Gdi32.dll ответственней за фафичесь операции. Кроме трех "основных", существуют также другие библиотеки, которые мс но использовать, при условии обладания достаточным количеством информации об вызовах.

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

Для правильной сборки исполняемого модуля Windows профаммы и удовлетворет всех внешних ссылок на вызовы ОС динамических библиотек транслятору и компо» Щику нужна информация о необходимых Windows профамме API и их месторасполо НИИ. Эта информация хранится в библиотеках импорта. Обязательно следует произ! Дить связывание профамм с "правильными" библиотеками импорта, в противном слу °ни не смогут корректно работать. Эту информацию мы сообщаем среде разработки с. щими строками:



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