WWW.REFERATCENTRAL.ORG.UA - Я ТУТ НАВЧАЮСЬ

... відкритий, безкоштовний архів рефератів, курсових, дипломних робіт

ГоловнаІнформатика, Компютерні науки → Програмування на мові асемблера. - Курсова робота

Програмування на мові асемблера. - Курсова робота

рівня. В них можна задати таку модель пам'яті, з'являється можливість роботи з даними що займають більше 64 Кб. В програмі на асемблері таку модель використовувати недоцільно. Модель Flat відповідає моделі Small, різниця в тому, що використовуються 32 розрядні регістри. Таку модель можна організувати використовуючи процесор вище і80386. Переважно її використовують для роботи в захащеному режимі. В цьому випадку доступ до всієї області пам'яті здійснюються за допомогою одного сегменту.
При програмуванні на асемблері краще використовувати перші 2 моделі пам'яті. Можна використовувати інші моделі, але в цих випадках програма ускладнюється, адже доводиться слідкувати за розміщенням кожного сегменту. Для визначення моделі пам'яті використовується директива model, що має такий формат запису:
Model [ ] .
В цій директиві може бути вказано ще ряд параметрів. Єдиним необхідним параметром є параметр . Тип можна додатково модифікувати. Для цього необхідно вказати один із 4 модифікаторів:аnearstack; farstack; use16; use32. При першому стек і дані розташинані в межах одного сегменту; farstack вказує, що сегмент даних буде розташинаний за межами стеку. Nearstack використовується по замовчуванню у всіх стандартних моделях пам'яті. Він дозволяє організувати інтерфейс з мовами високого рівня. Тут глобальні дані розміщені в сегменті даних, а локальні - в сегменті стеку. Два останні модифікатори використовуються тільки для МП 80386 і старше, вони вказують які сегменти використовуються в програмі, 16-розрядні (64 Кб сегмент) і 32-розрядні (4Гб сегмент). Доцільно використовувати ці модифікатори при розробці програм при використанні 32-розрядних компіляторів.
Псевдооператори (директиви).
Псевдооператори керують роботою асемблера, а не МП. Вони дозволяють визначати сегменти і процедури (надавати імена програмам і елементам даних, резервувати області пом'яті та виконувати багато інших задач). Псевдооператори мають таку загальну форму запиту:а
[] псевдооператор [][; коментар].
Обов'язковим є тільки поле псевдооператори. Для одних псевдооператорів ідентифікатор обов'язковий, для інших заборонений, для третіх необов'язковий, це ж відноситься і до операнди, коментарі завжди необов'язкові. Псевдооператор може починатися в будь-якому місці рядка, він повинен бути віддаленим від попереднього поля хоча б одним пропуском. Ми розглянемо найбільш розповсюджені псевдооператори, їх можна поділити на дві групи: псевдооператори даних і псевдооператори керування лістингом. Псевдооператори даних можна розділити на 5 груп:а
1. Псевдооператори визначення ідентифікаторів. Вони дозволяють виразу присвоїти символічне ім'я, тобто ідентифікатор. В якості виразу може бути константа, адреса, інше символічне ім'я. Після такої директиви цей ідентифікатор можна використовувати в будь-якому місці де необхідно вказати вираз. Два оператори:аEQU і =, ці псевдооператори подібні, але між ними є істотна різниця:а
Позначені знаком "=" ідентифікатори можна перевизначати, а визначені псевдооператором EQU неможна. Псевдооператор EQU можна використовувати як з числовими такі з текстовими виразами, а псевдооператор "=" тільки з числовими. Приклади:
К1аEQU 1024 - присвоєння імені константі; T_1аEQU DS:[BP][SI]. Комбінації адрес DS:[BP][SI] присвоюється символічне ім'я, всюди в програмі замість комбінації цих адрес можна використовувати T_1. В_Т EQU B_T1, визначення синоніму, тобто ім'я В_Т буде мати те ж значення як і зміна В_Т1. REG1аEQU CX - присвоєння імені регістру. При використанні псевдооператора "=" в якості виразу можуть виступати математичні перетворення. В директиві EQU також можуть бути прості математичні перетворення, вони будуть виконані асемблером під час трансляції. Наприклад: CON1аEQU CON2*2 CONS1=24 CONS1=29 CONS1=CONS1+1.
2. Псевдооператори визначення даних. В асемблері можна використовувати комірки пам'яті для збереження поіменованих даних, тобто змінних. Найбільш використовуються такі псевдооператори для резервування пам'яті:1) DB - Define Byte; 2) DW - Define Word; 3) DD - Define Double Word; 4) DQ; 5) DF; 6) DT. В основному вони розрізняються по об'єму пам'яті, який резервується. Псевдооператори визначення даних мають такий формат запису: ім'я псевдооператор вираз [,……]. В якості виразу найчастіше може бути константа. Псевдооператор DB резервує пам'ять об'ємом 1 байт. DW - об'ємом одне слово. DD - подвійне слово. DQ - 2пподвійні слова. DF - 6 байт. DT - 10 байт. Наприклад змінна xyz DW 2S - резервує для змінної ( ). Треба пам'ятати про макс. Vпмін. значення даних, які можуть бути розміщені у відведеній пам'яті в кожному з цих випадків, так наприклад: макс. значення байта без знака не може перевищувати 255, макс. значення байта зі знаком 127, а мін. - 128. Псевдооператори можна використовувати для створення в пам'яті таблиць, наприклад: А_ТАВ DB 3, 2, 4, 6, 8, 0, 0, 0
DB 5, 4, 2, 1
Такий псевдооператор DB резервує в пам'яті місце для 12 значень елементів таблиці А_ТАВ кожний розміром в байт. Можна вказувати довільну кількість елементів таблиці рядку, важливо, щоб вони помістились в 132 позиції рядка. В асемблері є операція DUP, яка дозволяє скорочувати задання таблиць у випадку однакових елементів. Даний псевдооператор можна записати так:
А_ТАВ DB 3, 2, 4, 6, 8, 3 DUP (0),
DB 5, 4, 2, 1
В пам'яті можна резервувати пам'ять для змінної, але конкретного значення їй не надавати. Для цього в полі виразу треба вказати знак питання. Приклад: X_1аDB ? X_2 DW ?. Такі псевдооператори резервують в пам'яті місце байту і слова, але початкового значення їм не надають. X_1аi X_2 при цьому не будуть містити ніяких специфічних значень, навіть (0). Можна зарезервувати в пам'яті місце для таблиці. Наприклад: А_ТАВ DB 12 DUP (3) резервує місце для таблиці з 12 елементів. Можна в якості значення змінної задавати рядок символів, для цього текст заключається в апострофи.
3. Псевдооператори визначення сегменту і процедури. Для визначення сегменту використовуються псевдооператори: SEGMENTаi ENDS. Це псевдооператори ділять вихідну програму на сегменти. Вони відповідно відмічають початок і кінець сегменту, але вини не повідомляють асемблер якого роду сегмент повинен бути визначений. Для цього використовується псевдооператор ASSUME, він має таку форму запису: ASSUME регістр сегмента: ім'я сегмента [,…….]. це регістр сегмента - це ім'я одного із сегментних регістрів CS, DS, SS, ES. Якщо П 80386 і вище то там ще буде FS, GS. Ім'я сегмента це ім'я яке вказується впсевдооператорі SEGMENT. Цей псевдооператор допомагає асемблеру перетворювати мітки в адреси, він повідомляє, яким регістром хочете скористяватися при адресації міток. Наприклад: ASSUME DS: DSEG - означає, якщо при трансляції програми буде згадана мітка із сегмента DSEG, тобто регістр DS буде завжди вказувати на початок сегмента DSEG. Майже завжди його поміщають після псевдооператора SEGMENT. Зауважимо, що адресу початку сегменту потрібно явно завантажити в DS. Псевдооператори PROG і ENDP визначають початок і кінець процедури. Кожна процедура повинн0ппочинатись
Loading...

 
 

Цікаве