Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

гос / sp-lect (1)

.pdf
Скачиваний:
18
Добавлен:
16.02.2016
Размер:
2.59 Mб
Скачать

зв'язний список зручніше в компактному виді, відокремивши код машинних команд від даних, розміщуючи при завантаженні програми на виконання в память команди й дані за різними адресами. Таким чином, ми й приходимо до поняття сегмента або секції.

Сегмент (секція) – це ділянка (діапазон адрес) пам'яті, що підтримується на програмно-апаратному рівні (кодом операційної системи й апаратурою мікропроцесора) і використовується для розміщення в пам'яті різних за своїм функціональним призначенням частин програми.

Та ділянка пам'яті, у якій розташовуються коди машинних команд, називається сегментом (секцією) коду, а та, у якій розташовуються дані програми, називається сегментом (секцією) даних. Завжди в пам'яті під час роботи програми присутній й ще один сегмент (секція) – стек. Такий спосіб організації пам'яті забезпечує існування декількох незалежних адресних просторів, як у межах однієї програми, так й у системі в цілому для захисту програм від взаємного впливу.

Для логічного розподілу тексту програми на окремі фрагменти згідно з їх функціональним призначенням і для позначення початку кожної секції використовуються директиви .stack, .const, .data, .data?, .code. Початок нової секції автоматично означає кінець попередньої. Послідовність секцій не має значення і їх кількість обирається автором програми згідно з власними потребами транслятор і компанувальник забезпечують обєднання однакових секцій при збиранні програмного модуля.

Все, що розташовується після директиви .code і до директиви end <точка входу> асемблер буде намагатися транслювати у машинний код. Для позначення того місця в коді, з якого починається виконання програми використовується мітка <точка входу>. Після завантаження програми в память її виконання почнеться з місця позначеного міткою точки входу і завершиться машинною командою ret, яка поверне керування операційній системі.

Після директиви .code, але до мітки <точка входу>, а також після машинної команди ret, але до директиви end <точка входу> розміщуються

підпрограми, які використовує програма в процесі своєї роботи. Таке розміщення забезпечує трансляцію вихідного тексту підпрограм в машинний код і не припускає несанкціонованого (якщо програма сама не ініціює виклик підпрограм) виконання коду підпрограм.

Секція .code, узагалі кажучи, може містити не тільки код, а і дані програми, які можна, наприклад, розміщувати в тому самому місці, що і підпрограми. Розміщення даних в секції коду без особливої на те потреби є недоцільним і має обмеження, тому що за замовченням для секції коду не передбачена можливість запису.

Розміщенням та підтримкою структури стека займається сама операційна система, і програмі немає потреби приділяти цьому увагу. Хоча програмі і надається можливість визначити за допомогою директиви .stack розмір стеку, однак на практиці, як правило, ця можливість не використовується.

В секції .data розміщуються дані, які програма буде використовувати в процесі своєї роботи. Ці дані визначаються в секції .data розробником програми і доступні як для читання, так і для запису. Усе, що визначено в секції

.data розміщується в програмному файлі і завантажується в память при завантаженні програми на виконання. Спроби резервувати місце в секції .data для ще неіснуючих (невідомих) даних, які зявляться лише в процесі роботи програми (є результатом її роботи) призводять до збільшення розміру програми на диску і щоб цьому запобігти в структурі програми передбачено наявність спеціальної секції не ініціалізованих даних, початок якої позначається за допомогою директиви .data?.

Память для секції не ініціалізованих даних .data? програма отримає лише на етапі її завантаження на виконання, ці дані не займають місця у програмному файлі. В усьому іншому секція не ініціалізованих даних нічим не відрізняється від секції ініціалізованих даних, для неї також припустимо використання операцій як запису, так і читання. Дійсно, дивно було б виділення памяті, в якій нічого немає, в яку неможливо було б нічого записати, а потім прочитати.

Секція, що визначається директивою .const, як неважко здогадатися з назви, слугує для розміщення констант, тобто незмінних (сталих) даних, які використовує програма у процесі своєї роботи. Усі дані секції констант

розміщуються у програмному файлі, і завантажується в память при завантаженні програми на виконання.

Секція .const може використовуватися для розміщення важливих програмних даних з метою їх захисту від помилкової модифікації. За замовченням для секції .const так само як і секції .code не передбачена можливість запису, що і повинно забезпечувати їх незмінність.

Альтернативним, щодо використання секції .const, методом розміщення сталих даних можна вважати їх розміщення в секції коду .code, що також гарантує їх «недоторканість».

2.5.2 Вихідний текст 64-розрядного додатку ОС Windows NT

Вихідний текст 64-розрядного додатку ОС Windows NT для Microsoft Macro Assembler (ml64.exe) має наступний вигляд:

[option опція]

………………

[include [<шлях>\]імя.inc]

……………………………………….

[includelib [<шлях>\]імя.lib]

……………………………………….

[<макровизначення>]

[.const]

[<директиви визначення та ініціалізації даних (констант)>]

[.data]

[<директиви визначення та ініціалізації даних>]

[.data?]

[<директиви визначення даних і резервування памяті>]

.code

[<визначення підпрограм>]

main proc frame push rbp

.pushreg rbp mov rbp,rsp

.setframe rbp,0

.endprolog

[<код>]

mov rsp,rbp pop rbp

ret main endp

[<визначення підпрограм>]

end

Директиви визначення набору команд не використовуються за замовчанням вважаються доступними всі апаратні можливості, які тільки здатна підтримувати поточна версія транслятору асемблера. Справа в тому, що мікропроцесор нижче ніж .686 не здатний працювати в 64-розрядному режимі, а всі .686 мають вбудований співпроцесор (.387) і забезпечують підтримку розширень MMX (.mmx|.k3d) і XMM (.xmm).

Всі існуючи сьогодні 64-розрядні версії ОС Windows NT для мікропроцесорів з архітектурою Intel64 використовують єдину модель памяті і єдину конвенцію виклику, які маються на увазі асемблером за замовчуванням, і тому директива .model не потрібна.

Призначення усіх інших директив те саме, що і у вихідному тексті 32-

розрядного додатку ОС Windows NT для Microsoft Macro Assembler, а єдина відмінність полягає у способі визначення точки входу в програму. З

призначенням директив proc, frame, .pushreg, .setframe, .endprolog і машинних команд, які використовуються для визначення точки входу в програму ми познайомимося детальніше в розділі «Модульне програмування».

2.6 Трансляція і компонування проекту

Якщо позбутися всіх не обовязкових елементів, взятих в квадратні дужки у вихідних текстах програм, наведених в попередніх розділах, то ми отримаємо мінімальний вихідний код найпростіших, але повністю працездатних консольних додатків 32- і 64-розрядних ОС Windows NT.

Для отримання файлу з іменем ProjectName.asm, що містить вихідний код додатку можна скористатися будь яким текстовим редактором, наприклад, Блокнот (notepad.exe), який є стандартним додатком усіх версій Windows.

;Вихідний код 32-розрядного додатку ОС Windows NT

;Вміст файлу ProjectName.asm

.386

.model flat, stdcall

.code

start:

ret end start

;Вихідний код 64-розрядного додатку ОС Windows NT

;Вміст файлу ProjectName.asm

.code

main proc frame push rbp

.pushreg rbp mov rbp,rsp

.setframe rbp,0

.endprolog mov rsp,rbp pop rbp

ret main endp end

Для отримання програмних файлів додатків достатньо asm-файлів, однак в подальшому в усіх наших проектах ми також будемо використовувати ще і

файл ресурсів, розташовуючи його поряд із іншими вихідними файлами проекту. Файл ресурсів інваріантний відносно розрядності додатків, тобто може використовуватися при компонуванні як 32- так і 64-розрядних додатків.

; Вміст файлу ресурсів ProjectName.rc

#include "verrsrc.rc" #define VS_VERSION_INFO 1

#define VER_PRODUCTMAJORVERSION 1 #define VER_PRODUCTMINORVERSION 0

#define VER_PRODUCTBUILD

1

#define VER_PRODUCTBUILD_QFE

0

#define BETA

 

#define VER_FILETYPE

VFT_APP

#define VER_PRODUCTNAME_STR

"ProjectName"

#define VER_INTERNALNAME_STR

"ProjectName.exe"

#define VER_COMPANYNAME_STR

"КІС ФЕКІ КрНУ"

#define VER_LEGALCOPYRIGHT_YEARS_STR "2011-2012"

#define VER_LEGALCOPYRIGHT_STR

"Copyright © " \

VER_COMPANYNAME_STR " " VER_LEGALCOPYRIGHT_YEARS_STR

#define VER_FILEDESCRIPTION_STR

"ProjectName"

#define VER_PRIVATEBUILD_STR

"Лабораторна робота" \

 

VER_COMPANYNAME_STR

#define VER_VERSION_UNICODE_LANG

"042204B0"

#define VER_VERSION_TRANSLATION

0x0422, 0x04B0

#include "VerInfo.Ver"

 

Транслятори ml.exe і ml64.exe, компанувальник link.exe і компілятор ресурсів rc.exe, які потрібні нам для отримання програмного файлу додатку, розташовані в підкаталозі BIN каталогу встановлення асемблеру (C:\MASM). Всі вище перераховані засоби являють собою консольні додатки з інтерфейсом командного рядка і для більш зручного їх використання, краще додати повний шлях до підкаталогу їх розташування (C:\MASM\BIN) в змінну оточення %PATH%. Після цього потрібно перейти в каталог з вихідними файлами проекту і виконати наступні кроки (див. Рисунок 2.1):

1.Компіляція ресурсів (ProjectName.rc ProjectName.res):

RC.EXE /I"C:\masm\Inc" "ProjectName.rc"

2.Трансляція (ProjectName.asm ProjectName.obj):

а) 32-розрядного додатку

ML.EXE /c /Cp /nologo /I"C:\masm\Inc" "ProjectName.asm"

б) 64-розрядного додатку

ML64.EXE /c /Cp /nologo /I"C:\masm\Inc" "ProjectName.asm"

3. Компонування (ProjectName.obj+ProjectName.res ProjectName.exe):

а) 32-розрядного додатку

LINK.EXE /LIBPATH:"C:\masm\Lib\x86" /SUBSYSTEM:CONSOLE /RELEASE "ProjectName.obj" "ProjectName.res"

б) 64-розрядного додатку

LINK.EXE /ENTRY:main /LIBPATH:"C:\masm\Lib\x64" /MACHINE:X64

/SUBSYSTEM:CONSOLE /RELEASE "ProjectName.obj" "ProjectName.res"

Таким чином, можна зазначити наступне:

1.Для компіляції ресурсів 32- і 64-розрядних додатків використовується одна і та сама програма і однакові опції командного рядка.

2.Опції трансляції для 32- і 64-розрядних додатків однакові, але для цього використовуються різні транслятори.

3.Для компонування 32- і 64-розрядних додатків використовується одна і та

сама програма, але з різними опціями командного рядка.

Інтерфейс командного рядка не завжди виявляється зручним, і в подальшому при розробці проектів ми будемо використовувати інтегроване середовище розробки RadAsm, яке крім графічного інтерфейсу забезпечує цілу низку зручностей, як то довідкова система, готові шаблони різних типів проектів, інтегрований налагоджувач, додаткові утиліти.

2.7 Основи використання засобів розробки

RadAsm IDE (C:\RadAsm\RadASM.exe) дозволяє виконувати всі етапи розробки проекту (Рисунок 2.1) в єдиному інтегрованому середовищі. Розробка

починається із створення нового проекту (Рисунок 2.2), яке відбувається в покровомому режимі під управлінням Майстра створення проекту.

Рисунок 2.2 Роботу з Майстром продемонструємо на прикладі створення 32-х

розрядного консольного додатку (Console User Interface, CUI) ОС Windows NT з використанням Microsoft (R) Macro Assembler (x86).

На першому етапі (Рисунок 2.3) потрібно обрати асемблер (masm32) і тип додатку (CUI), а також зазначити імя (ProjectName) і місце розташування файлів проекту (за замовченням – C:\RadAsm\Masm32\Projects).

Рисунок 2.3

В каталозі C:\RadAsm\Masm32\Projects буде створено підкаталог з іменем проекту (C:\RadAsm\Masm32\Projects\ProjectName), а в ньому файл проекту

ProjectName.rap.

На другому етапі (Рисунок 2.4) Майстер надасть перелік всіх доступних шаблонів для обраного на попередньому етапі типу проекту, і запропонує узяти будь який з них за основу для створюваного проекту.

Наші перші проекти ми будемо створювати на основі шаблону SimpleWin32.tpl, який відповідає мінімальному вихідному коду найпростішого додатку, розглянутому в розділі 2.6.

Рисунок 2.4 На третьому етапі (Рисунок 2.5) Майстер запропонує визначитися зі

складом файлів і каталогів проекту. В каталозі проекту

(C:\RadAsm\Masm32\Projects\ProjectName) будуть створені підкаталоги з іменами обраними в розділі «Створення каталогів» та інші файли проекту з іменами ProjectName і розширеннями, обраними в розділі «Створення файлів».

При створенні проекту на основі шаблона рекомендується прийняти запропонований за замовчуванням перелік. За необхідності додати або видалити файли з проекту можна буде уже після його створення.

Рисунок 2.5 На четвертому етапі (Рисунок 2.6) пропонується визначити дії, які будуть

доступні при збиранні проекту, а також опції компілятора ресурсів, транслятора і компанувальника, які будуть для цього використовуватися (див. розділ 2.6).

При створенні проекту на основі шаблона рекомендується прийняти запропоновані за замовчуванням дії і опції. За необхідності їх можна буде змінити уже після створення проекту.

Рисунок 2.6

Натискання кнопки «Finish» завершує роботу з Майстром створення проекту. Робота з файлами проекту виконується за допомогою Браузеру

Соседние файлы в папке гос