Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lekz._5.doc
Скачиваний:
1
Добавлен:
11.08.2019
Размер:
223.74 Кб
Скачать

Системне програмування, доц. І.І. Мітасов, 2010р. Лекція 5, 9 сторінок

Тема 1. Архітектура процесора і мова асемблера: Апаратне і програмне забезпечення соі

ЛЕКЦІЯ 5. Трансляція, компоновка і виконання програм (продовження)

Питання лекції:

  • Спрощені директиви сегментів;

  • Діагностика помилок;

  • Ініціалізація в захищеному режимі;

  • Написання програм .СОМ;

1. Спрощені директиви сегментів

А

.MODEL модель памяті

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

Модель пам'яті може бути однією з наступних: Tiny, Small, Medium, Compact, Large, Huge, Flat. У МАSМ 6,0 і ТАSМ 4,0 модель Tiny призначена для використання в програмах типу .СОМ, котрі розміщують свої дані, стек і виконуваний код в одному сегменті розміром до 64 Кбайт. Модель Flat нас цікавити не буде, оскільки визначає одну область для коду та даних розміром до 4 Гбайт, використовує 32-розрядні адреси і працює під управлінням Windows в захищеному режимі. Характеристики інших моделей наведені нижче.

Модель

Кількість сегментів коду і їх розмір

Кількість сегментів даних та їх розмір

Small

Medium

Compact

Large

Huge

1 <= 64 К

Будь-яка кількість, будь-який розмір

1 <= 64 К

Будь-яка кількість, будь-який розмір

Будь-яка кількість, будь-який розмір

1 <= 64 К

1 <= 64 К

Будь-яка кількість, будь-який розмір

Будь-яка кількість, будь-який розмір

Будь-яка кількість, будь-який розмір

Кожну з цих моделей можна використовувати для самостійної (не пов'язаної з іншими) програми. Модель Small підходить для більшості прикладів в цьому курсі; асемблер вважає, що всі адреси - ближні (near), тобто в межах 64 Кбайт, і генерує 16-розрядні адреси зміщення. У моделі Large асемблер, навпаки, генерує 32-розрядні адреси зміщення, а результуючий код потребує більше часу для виконання. Модель Huge відрізняється від Large тим, що може містити змінні, наприклад, масиви, розміром більше 64 К.

Директива .MODEL автоматично генерує відповідне речення ASSUME для всіх моделей. Формат директив (включаючи крапку на початку), що визначають сегменти коду, даних і стека, наступний:

.STACK [розмір]

.DATA

.CODE [імя сегменту]

Кожна з цих директив викликає генерацію відповідного речення SEGMENT і пов'язаного з ним ENDS. Імена сегментів за замовчуванням (їх не потрібно визначати) - STACK, _DATA, і _ТЕХТ (сегмент коду для моделей Tiny, Small, Compact і Flat). Знак підкреслення на початку _DATA і _TEXT поставлений навмисно. Розмір стека за замовчуванням дорівнює 1024 байтам, але ви можете його змінити. Як зазначено вище, можна також змінити ім'я сегменту коду. Ці директиви використовуються для визначення того, де в програмі мають розташовуватися ці сегменти. Зауважте, що інструкції, котрі використовуються тепер для ініціалізації адреси сегменту даних в регістрі DS, такі:

MOV AX,@data ;Ініціалізуємо DS

MOV DS,AX ;адресою сегменту даних

На рис. 4.1 (лекц. 4) наведено приклад програми, що використовує стандартні директиви для визначення сегментів. Рис. 5.1 демонструє той же приклад, але використовує директиву .MODEL для визначення моделі пам'яті і визначення сегментів директивами .STACK, .DATA, і .CODE. Як бачите, в четвертому рядку обрана модель пам'яті .SMALL. Розмір стека визначений у 32 слова (64 байти). Зауважте, що асемблер не генерує речення SEGMENT і ENDS, і вам не потрібно використовувати речення ASSUME.

Page 60, 132

TITLE A05ASM2 (EXE) Операції переміщення і додавання

; ------------------------------------------------------------------------------------------------------------------------------

.MODEL SMALL

.STACK 64 ;Визначення стека

.DATA ;Визначення сегмента даних

FLDD DW 215

FLDE DW 125

FLDF DW ?

; ------------------------------------------------------------------------------------------------------------------------------

.CODE ;Визначення сегмента коду

MAIN PROC FAR

MOV AX, @data ;Помістити адресу

MOV DS, AX ;сегменту даних в DS

MOV AX,FLDD ;Помістити 0215 в АХ

ADD AX,FLDE ;Додати 0125 в АХ 1

MOV FLDF,AX ;Зберегти суму в FLDF

MOV AX,4C00H ;Завершити роботу

INT 21H

MAIN ENDP ;Кінець процедури

END MAIN ;Кінець програми

Рис. 5.1 – ЕХЕ-програма зі спрощеними сегментними директивами


Як ви побачите надалі, обробка асемблером програм, що використовують стандартне оголошення сегментів, трохи відрізняється від оброблення програм, що використовують спрощені директиви і моделі пам'яті.

Директиви .STARTUP и .EXIT. В MASM 6.0 з'явилися директиви .STARTUP і .EXIT, що спрощують ініціалізацію і завершення програми. Директива .STARTUP генерує інструкції для ініціалізації сегментного регістра, a .EXIT - викликає обробник переривання INT 21H з кодом функції 4СН для завершення програми. Ці директиви вимагають використання директиви .MODEL і працюють з усіма моделями пам'яті, крім Flat. З метою кращого вивчення мови асемблера, ми будемо використовувати не ці директиви, а відповідний їм набір інструкцій.

Використання спрощених директив сегментів. На рис. 5.2 наведено асембльований листинг програми зі спрощеними сегментними директивами. Ініціалізація DS виконується таким чином:

MOV AX,@data

MOV DS,AX

Перша частина таблиці сегментів під заголовком "Segments and groups" показує три сегменти, перейменовані асемблером і перераховані в алфавітному порядку:

• _DATA - сегмент даних довжиною 6 байт;

• STACK - сегмент стека довжиною 40Н (64) байти;

• _ТЕХТ - сегмент коду довжиною 14Н (20) байт.

A05ASM2 (EXE) Операції переміщения і додавання Page 1-1

1 Page 60, 132

2 TITLE A05ASM2 (EXE) Операції переміщения і додавання

3 ; ----------------------------------------------------------------------------------------------

4 .MODEL SMALL

5 .STACK 64 ;Визначення стека

6 .DATA ;Визначення сегменту даних

7 0000 00D7 FLDD DW 215 1

8 0002 007D FLDE DW 125 \

9 0004 0000 FLDF DW ?

10 ; ----------------------------------------------------------------------------------------------

11 .CODE ;Визначення сегменту кода

12 0000 MAIN PROC FAR

13 0000 B8 ---- R MOV AX, @data ;Помістити адресу

14 0003 8ED8 MOV DS, AX ;сегменту даних в DS

15

16 0005 A1 0000 R MOV AX,FLDD ;Помістити 0215 в АХ

17 0008 03 06 0002 R ADD AX,FLDE ;Додати 0125 в АХ

18 000C A3 0004 R MOV FLDF,AX ;Зберегти суму в FLDF

19

20 000F B8 4C00 MOV AX,4C00H ;Завершити роботу 1

21 0012 CD 21 INT 21H

22 0014 MAIN ENDP ;Кінець процедури ;Конец процедуры

23 END MAIN ;Кінець програми

---------------------------------------------------------------------------------------------------------------------------------------

Segments and Groups:

Name Length Align Combine Class

DGROUP …………………………….. GROUP

_DATA …………………………… 0006 PUBLIC WORD 'DATA'

STACK …………………………… 0040 PARA STACK 'STACK'

_ТЕХТ ……………………………… 0014 WORD PUBLIC 'CODE'

Symbols:

Name Type Value Attr

MAIN …………………………….. F PROC 0000 _TEXT Length = 0014

FLDD …………………………….. L WORD 0000 _DATA

FLDE …………………………….. L WORD 0002 _DATA

FLDF …………………………….. L WORD 0004 _DATA

@CODE ……………………………… TEXT _TEXT

@FILENAME ………………………….. TEXT a05asm2

0 Warning Errors

0 Severe Errors

Рис. 5.2 – Відтрансльована програма зі спрощеними сегментними директивами

Перераховані під заголовком "Symbols" імена визначені в програмі або є іменами за умовчанням. Спрощені директиви сегментів задають кілька визначених імен, що починаються з символу @, на які ви можете вільно посилатися в програмі. Крім @data, передбачені наступні імена:

@CODE Прирівнюється до імені сегменту коду _ТЕХТ

@FILENAME Назва програми

Можна використовувати @code і @data в ASSUME і виконуваних реченнях, наприклад, MOV AX,@data.

Карта зв`язків програми A05ASM2. Рис. 4.4 в лекції 4 показав нам карту зв'язків для першої програми A04ASM1. Карта зв'язків для другої програми A05ASM2, що використовує спрощені сегментні директиви, демонструє дещо іншу структуру виконуваного модуля. По-перше, асемблер фізично переставив сегменти в алфавітному порядку; по-друге, наступні один за одним сегменти вирівнюються по межах слів, а не параграфів, як видно на карті:

START

STOP

LENGTH

NAME

CLASS

00000H

00013H

0014H

_TEXT

CODE

00014H

00019H

0006H

_DATA

DATA

00020H

0005FH

0040H

STACK

STACK

Program entry point at 0000:0000

• Тепер перший сегмент - сегмент коду, що починається зі зміщення 0 байт від початку програми.

• Сегмент даних починається з першої доступної межі слова зі зсувом 00014Н.

• Стек починається з наступної доступної межі слова зі зсувом 00020Н.

• Адреса точки входу програми - 0000:0000 Це означає, що відносне розміщення сегменту коду починається з сегмента 0 і без зміщення 0.

2. Діагностика помилок

Асемблер виводить діагностичну інформацію про будь-які помилки, які порушують його правила. Програма на рис. 5.3 аналогічна програмі, наведеній на рис. 5.2, за винятком декількох навмисних помилок, внесених до програми з ілюстративними цілями.

1 Page 60, 132

2 TITLE A05ASM3 (EXE) Помилки програмування

3 ; ----------------------------------------------------------------------------------------------

4 .MODEL SMALL

5 .STACK 64 ;Визначення стека

6 .DATA ;Визначення сегменту даних

7 0000 00AF FLDD DW 175 1

8 0002 0096 FLDE DW 150 \

9 0004 FLDF DW

a05asm3. ASM(9): error A2027: Operand expected

10 ; ----------------------------------------------------------------------------------------------

11 .CODE ;Визначення сегменту кода

12 0000 MAIN PROC FAR

13 0000 B8 ---- R MOV AX, @data ;Помістити адресу

14 0003 8B D0 MOV DХ, AX ;сегмента даних в DS

15

16 MOV AS,FLDD ;Помістити 0175 в АХ

a05asm3. ASM(16): error A2009: Symbol not defined: AS

17 0005 03 06 0002 R ADD AX,FLDE ;Додати 0150 в АХ

18 0009 A3 0000 U MOV FLDQ,AX ;Зберегти суму в FLDF

a05asm3. ASM(18): error A2009: Symbol not defined: FLDQ

19 000C A2 0000 R MOV FLDD,AL ;Зберегти значення байта

a05asm3. ASM(19): error A4031: Operand types must match

20 000F B8 4C00 MOV AX,4C00H ;Завершити роботу 1

21 0012 CD 21 INT 21H

22 0014 MAIN ENDP ;Кінець процедури

a05asm3. ASM(22): error A2006: Phase error between passes

23 END MIAN ;Кінець програми

a05asm3. ASM(23): error A2009: Symbol not defined: MIAN

1 Warning Errors

5 Severe Errors

Рис. 5.3 – Діагностичні повідомлення асемблера при винайденні помилок



Д

Діагностична інформація буде змінюватися в залежності від версії асемблера. Ось пояснення помилок:

Строка

Пояснення помилки

9

14

16

18

19

22

23

Визначення FLDF вимагає ще одного операнду

Замість DX має бути вказано DS, хоча ця помилка асемблером не розпізнається

Замість AS має бути вказано АХ

FLDQ має бути записано як FLDF

Розміри елементів даних (байт і слово) мають бути узгоджені (попередження)

Виправлення інших помилок приведе до зникнення цієї помилки

MIAN має бути введено как MAIN

Повідомлення про помилку 22, "Phase error between passes", видається, якщо адреси, згенеровані при першому проході асемблера по тексту програми, відрізняються від згенерованих при другому проході. Для визначення джерела цієї важкої в локалізації помилки в MASM 5.1 використовуйте ключ /D для виводу файлів і першого, і другого проходів, і порівняйте вказані в цих файлах адреси зміщень.

3. Ініціалізація в захищенному режимі

Під управлінням Windows всі програми працюють в захищеному режимі і використовують модель пам'яті Flat. Адресуючи сегменти 32-розрядними регістрами, можна використовувати до 4 Гбайт пам'яті. Загальна структура програми такого типу має такий вигляд:

.386 або .486 ;Спочатку - директива процесора

.MODEL FLAT, STDCALL

.STACK

.DATA ;Bcі дані оголошуються після цієї директиви

.CODE ;Далі слідує виконуваний код

END

Використання директиви процесора перед реченням .MODEL змушує асемблер застосувати 32-розрядну адресацію. Запис STDCALL вказує асемблеру застосовувати стандартні угоди про імена і виклики процедур. Процесор працює ефективніше, оскільки не потрібно перетворення адрес з формату сегмент:зміщення в дійсні. У той час як у реальному режимі зміщення для даних та інструкцій 16-розрядні, у захищеному режимі вони 32-розрядні.

Використання DWORD для вирівнювання сегментів по 32-розрядних (відповідних подвійному слову) адресах прискорює доступ до пам'яті по 32-розрядній шині даних. Тип USE32 вказує асемблеру генерувати код, що відповідає 32-розрядному захищеному режиму:

ім’я_сегменту SEGMENT DWORD USE32

Оскільки в цих процесорах регістр DS все ще 16-розрядний, його ініціалізація може виглядати так:

MOV EAX, DATASEG ;Отримати адресу сегменту даних

MOV DS, AX ;Завантажити 16-розрядну частину

Інструкції STI, CLI, IN, OUT, дозволені в реальному режимі, заборонені в захищеному.

4. Написання програм .СОМ

Для програми типу .ЕХЕ компонувальник автоматично генерує певний формат і при збереженні її на диску передує код програми спеціальним блоком заголовка розміром 512 байт або більше. Буває доцільно писати і виконувати програми типу .СОМ. Переваги цих програм - менший розмір у порівнянні з програмами типу .ЕХЕ і більш легка адаптація до застосування в якості резидентних програм. Формат програм .СОМ виник на ранньому етапі розвитку мікрокомп'ютерів, коли розмір програми був обмежений 64 кілобайтами.

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