Рефераты
 

Мова програмування Assembler

p align="left">Обробка.

Для програм у EXE і COM форматах виконується асемблювання для одержання OBJ-файлу, і компоновка для одержання EXE-файлу. Якщо програма створюється для виконання як EXE-файл, то її вже можна виконати. Якщо ж програма створюється для виконання як COM-файл, то компоновщиком буде видане повідомлення:

Warning: No STACK Segment

(Попередження: Сегмент стека не визначено)

Це повідомлення можна ігнорувати, тому що визначення стека у програмі не передбачалося. Для перетворення EXE-файлу у COM-файл використовується програма EXE2BIN. Припустимо, що EXE2BIN мається на дисководі A, а скомпонований файл по імені CALC.EXE - на дисководі B. Уведіть EXE2BIN B:CALC,B:CALC.COM. Оскільки перший операнд завжди припускає EXE файл, то можна не кодувати тип EXE. Другий операнд може мати інше ім'я (CALC.COM). Якщо не вказувати тип COM, то EXE2BIN прийме за замовчуванням тип BIN, який згодом можна перейменувати в COM. Після того як перетворення буде виконано, можна видалити OBJ і EXE-файли. Якщо вихідна програма написана для EXE-формату, то можна, використовуючи редактор, замінити команди у вихідному тексті для COM файлу.

ОСНОВНІ ПОЛОЖЕННЯ НА ПАМ'ЯТЬ

- Обсяг COM-файлу обмежений 64ДО.

- COM-файл менший, ніж відповідний EXE-файл.

- Програма, написана для виконання в COM-форматі не містить стека і сегмента даних і не вимагає ініціалізації регістра DS.

- Програма, написана для виконання в COM-форматі, використовує директиву ORG 100H після директиви SEGMENT для виконання з адреси після префікса програмного сегмента.

- Програма EXE2BIN перетворить EXE-файл у COM-файл, обумовлений указівкою типу COM у другому операнді.

- Операційна система DOS визначає стек для COM-програми або наприкінці програми, якщо дозволяє розмір, або ж наприкінці пам'яті.

3. Поняття "компонування"

Об'єктний лінкер призначений для створення виконавчих файлів з об'єктних файлів, сформованих MASM чи компіляторами C або PASCAL. LINK формує пересувний виконавчий код, позначений інформацією переміщення, використовуючи яку, MS-DOS зможе завантажити в пам'ять і виконати відповідну програму. LINK може формувати програми, що містять понад 1М коду і даних. Сприймаючи на вхід 2 файли, LINK може формувати 2 вихідних файли, як показано на рис.3.1.

Рис. 3.1. Робота LINK.

Розширення імен файлів, показані на малюнку, приймаються за замовчуванням. Об'єктний файл містить об'єктні модулі програмних сегментів, сформовані MASM чи компілятором мови високого рівня. Бібліотеки містять набори модулів, на яких можуть посилатися програмні сегменти в об'єктному файлі. Бібліотечні файли формуються за допомо- гою утиліти LIB. Основним результатом роботи LINK є виконавчий файл, що містить програму у виді, придатному для завантаження в пам'ять і виконання. Деякі особливості формування виконавчого файлу описані в п.3.4. Файл плану є необов'язковим і містить, якщо він формується, деяку діагностичну і службову інформацію, яка потім за допомогою утиліти MAPSYM може бути використана в процесі налагодження програми. Файл плану містить імена, завантажувальні адреси і довжини усіх сегментів програми. Крім того, сюди входять імена і завантажувальні адреси груп у програмі, адреса крапки входу, а також повідомлення про можливі помилки.

Якщо задана опція /MAP, у файл включаються імена загальних символів і їхні завантажувальні адреси. Якщо задані опції /HIGH чи /DSALLOCATE і обсяг програми та даних у сукупності не перевищує 64ДО, план може містити символи з незвичайно великими адресами сегментів. Ці адреси відбивають змінні, розташовані нижче дійсного початку сегмента.

Приклад:

FFF0:0A20 TEMP

Адреса TEMP - 00:920h.

Необхідно мати те, через що, крім двох вихідних файлів, LINK може формувати тимчасовий файл з ім'ям VM.TMP. Це відбувається в тому випадку, коли лінкеру не вистачає оперативної пам'яті. Створення файлу VM.TMP супроводжується повідомленням на консолі і завжди здійснюється у поточному підзаголовку. У цьому випадку не можна використовувати опцію /PAUSE і знімати дискету, якщо вона знаходиться на активному драйві, до того, як LINK не знищить файл VM.TMP. Не реко- мендується створювати в поточному підзаголовку файл із таким ім'ям, що у цьому випадку може бути зіпсований.

3. Запуск LINK

Запуск LINK може бути здійснений трьома способами:

1. З використанням підказок.

2. За допомогою командного рядка DOS.

3. З використанням файлу відповіді.

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

1. Ім'я об'єктного файлу. Якщо при відповіді не зазначене розширення, передбачається OBJ. Якщо потрібно визначити кілька файлів, їхні імена розділяються символом + . Якщо усі імена не містяться на одному рядку, введення імен можна продовжити, поставивши символ + в останню позицію поточного рядка. У цьому випадку LINK повторить запит для введення додаткових імен.

2. Ім'я виконавчого файлу. Якщо при відповіді не зазначено розширення, передбачається EXE. Базове ім'я виконавчого файлу за замовчуванням збігається з базовим ім'ям об'єктного файлу.

3. Ім'я файлу плану модуля. Якщо при відповіді не зазначене розширення, передбачається MAP. Базове ім'я по умовчанню NUL.

4. Ім'я бібліотеки. Якщо при відповіді не зазначене розширення, передбачається LIB. Можна задавати кілька імен бібліотек за аналогією з OBJ-файлами.Якщо, не вводячи імені, відразу натиснути ENTER,бібліотеки використовуватися не будуть.У кожній відповіді після символу / можуть бути задані опції LINK, що описані в п.3.3. Якщо в якій-небудь відповіді специфікований символ ";", LINK вийде з діалогового режиму й встановить, що залишилися імена за замовчуванням з наступного списку:

<ім'я об'єктного файлу>.EXE

NUL.MAP

Бібліотеки не використовуються.

У будь-якій відповіді також можуть бути задані відповіді на кілька наступних підказок. У цьому випадку одна відповідь від іншої відокремлюється комами. Для запуску LINK за допомогою командного рядка, необхідно ввести командну стрічку наступного виду:

LINK <ім'я об'єктного файлу>[,[<ім'я виконавчого файлу>]

[,[<ім'я файлу плану>][,[<ім'я бібліотеки>]]]][<опції>][;]

Символ ; може бути специфікований у будь-якому місці командного рядка до того, як були визначені усі файли. У цьому випадку імена невизначених файлів, що залишилися, приймаються за замовчуванням із приведеного вище списку. З цього ж списку приймаються за замовчуванням імена файлів, специфікація яких у командному рядку опущена (за допомогою зайвої коми). Якщо в командному рядку виявлена помилка, про це повідомляється через консоль, і LINK переходить у діалоговий режим. Якщо специфікована хоча б одна з опцій /MAP чи /LINENUMBERS, файл плану створюється незалежно від того, чи зазначене його ім'я в командному рядку. У цьому випадку, якщо його ім'я не специфіковане, воно приймається за замовчуванням - <ім'я об'єктного файлу>.MAP. При вказівці декількох об'єктних файлів бібліотек їхні імена розділяються символами + . Якщо визначені не усі файли (але не опущені за допомогою зайвої коми, і не специфікована установка імен, що залишилися, за замовчуванням указівкою символу ";"), LINK входить у діалоговий режим і запитує які залишилися невизначеними імена через підказки.

Специфікації імен файлів і опції можуть бути заздалегідь занесені в спеціальний файл відповіді. Ім'я цього файлу з попереднім символом @ і вказівкою шляху пошуку, якщо він потрібен, може бути поміщене в будь-якому місці відповіді на підказку чи командного рядка і трактується так, аби вміст файлу відповіді був безпосередньо вставлений в це місце. Важливо, однак, пам'ятати, що комбінація символів CARRIAGE-RETURN / LINE-FEED у файлі відповіді інтерпретується як ENTER у підказці чи кома в командному файлі. Загальний вид файлу відповіді:

<ім'я об'єктного файлу>

[<ім'я виконавчого файлу>]

[<ім'я файлу плану>]

[<ім'я бібліотеки>]

Кожна група файлів повинна задаватися на окремому рядку, а файли в групі, якщо їх небагато, повинні розділятися символом +. Якщо група не міститься на одному рядку, в останній позиції рядка повинна стояти ознака продовження - символ +. У будь-якому рядку файла відповіді після символу / можуть бути задані опції LINK. У файлі відповіді можуть бути опущені компоненти, уже визначені відповідями на підказки командним рядком. При виявленні у файлі відповіді символа ; залишок файлу ігноруєть- ся, і невизначені імена, що залишилися установлюються за замовчу- ванням із приведеного вище списку. При використанні файлу відповіді, його вміст видається на консоль у формі підказок. Якщо визначені не усі імена, LINK переходить у діалоговий режим. Якщо файл відповіді не містить комбінації символів CARRIAGE-RETURN / LINE-FEED чи символу ; , LINK видає на консоль останній рядок файлу й очікує натискання ENTER. Ім'я кожного файлу може супроводжуватися інформацією про підрозділ, що містить цей файл, інакше пошук вихідного або файлу створення вихідного файлу, буде здійснюватися в поточному підрозділі. Робота LINK може бути в будь-який момент припинена натисканням клавіш CONTROL-C.

Опції LINK.

Всі опції LINK позначаються попереднім символом /, і можуть бути скорочені довільним чином, але так, щоб код залишався унікальним серед опцій. Нижче приведені описи всіх опцій LINK (у дужках зазначені мінімальні скорочення):

/HELP (HE) - Видати список діючих опцій. Цю опцію не можна використовувати разом з ім'ям файлу.

/PAUSE (P) - Пауза перед записом модуля в EXE-файл (і після запису в MAP-файл, якщо це передбачено). Під час цієї паузи можна при необхідності переставити дискети. Якщо використовується файл VM.TMP, він повинен знаходитися на тій же дискеті, що і EXE-файл.

/EXEPACK (E) - Установити компактний запис послідовностей однакових біт. Такий EXE-файл має менший обсяг і швидше завантажується в пам'ять, але його не можна налагоджувати за допомогою SYMDEB. Опція дає ефект, якщо програма містить довгі потоки ідентичних бітів і вимагає великого числа (більше 500) переміщень при завантаженні.

/MAP (M) - Формувати MAP-файл. Файл формується, навіть якщо він не специфікований при запуску LINK, і має в цьому випадку ім'я, що умовчується, (п.3.2).

/LINENUMBERS (LI) - Зафіксувати в MAP-файлі номера рядків вихідного файлу. Ця інформація може надалі використовуватися MAPSYM і SYMDEB. Запис номерів рядків буде вироблятися, якщо створюється MAP-файл і об'єктний модуль містить дані про рядки вихідного тексту. Компілятори FORTRAN і PASCAL (версії 3.0 і вище), і C (версії 2.0 і вище) такі дані автоматично формують; у MASM це не передбачено. Якщо MAP-файл не специфіковано, його можна створити примусово, вказавши описувану опцію в підказці на цей файл.

/NOIGNORECASE (NOI) - Установити розходження між рядковими і заголовними буквами. Розходження може бути встановлене також опціями /ML і /MX MASM.

/NODEFAULTLIBRARYSEARCH (NOD) - Ігнорувати, що умовчуються бібліотеки, посилання на яких містяться в об'єктному модулі (їх туди поміщають компілятори мов високого рівня). Використовуються тільки бібліотеки, специфіковані при запуску LINK.

/STACK:<число> (ST) - Установити розмір стека (у байтах). Інформація про розмір стека, що міститься в об'єктному модулі, ігнорується. Розмір стека може бути заданий у виді десяткового, 8-ричного (з попереднім 0) чи 16-ричного (с попередніми 0 і x на малому регістрі) числа в межах від 1 до 65535. Розмір стека може бути змінений утилітою EXEMOD.

/CPARMAXALLOC:<число> - Установити максимальне (C) число 16-байтних параграфів, необхідних при завантаженні програми в пам'ять. Звичайно LINK установлює максимальне число параграфів - 65535. Указівка цієї опції дозволяє більш ефективно використовувати пам'ять. Число параграфів може бути задане у виді десяткового, 8-ричного (з попереднім 0) чи 16-ричного (з попередніми 0 і x на малому регістрі) числа в межах від 1 до 65535. Якщо число параграфів недостатнє для розміщення програми, LINK нарощує його до мінімально придатного. Число параграфів може бути змінене утилітою EXEMOD. Крім розміщення програми, опція може знадобитися для команди ! SYMDEB.

/HIGH (H) - Встановити адреса початку програми на найвищий можливий адрес вільної пам'яті. Без цієї опції установка здійснюється на мінімальну можливу адресу.

/DSALLOCATE (D) - Обробити групу з ім'ям DGROUP. Звичайно LINK привласнює молодшому байту групи зсув 0000h. При завданні цієї опції старшому байту групи з ім'ям DGROUP привласнюється зсув FFFFh. У результаті, дані будуть розміщуватися в областях програми з максимально великими адресами. Опція /D звичайно застосовується разом з опцією /H для більш ефективного використання незайнятої пам'яті до старту програми. LINK припускає, що усі вільні байти в DGROUP займають пам'ять безпосередньо перед програмою. Для використання групи необхідно завантажити в регістр сегмента адреса початку DGROUP.

/NOGROUPASSOCIATION - Ігнорувати групи при (NOG) присвоєнні адрес елементам даних і коду. Опція введена для сумісності з ранніми версіями компіляторів FORTRAN і PASCAL (версії MICROSOFT 3.13 і раніше і IBM до 2.0). Не рекомендується використовувати цю опцію в інших цілях.

/OVERLAYINTERRUPT:<число> - Установити номер переривання при (O) завантаженні оверлейного модуля. Зазначене число заміщає номер стандартного оверлейного переривання (03Fh). Номер може бути заданий у виді десяткового, 8-ричного (з попереднім 0) чи 16-ричного (з попередніми 0 і x на малому регістрі) числа в межах від 0 до 255. MASM не сприяє створенню оверлейних програм. Тому тільки за допомогою опції /O асемблерні модулі можуть бути включені в оверлейні програми на мовах високого рівня, компілятори яких піддержують оверлей. Не рекомендується встановлювати номер, що збігається з яким-небудь іншим перериванням.

/SEGMENTS:<число> (SE) - Установити максимальне число сегментів, що може обробити LINK. Число може бути задане в десяткової, 8-ричній (з попереднім 0) чи 16-ричній (з попередніми 0 і x на малому регістрі) формі в межах від 1 до 1024. При відсутності специфікації опції покладається 128. Пам'ять виділяється з обліком цього максимального числа сегментів.

/DOSSEG (DO) - Упорядкувати сегменти в EXE-файлі. При специфікації цієї опції сегменти розташовуються в наступній послідовності: - сегменти з класом CODE; - інші сегменти, що не входять у групу DGROUP; - сегменти, що входять у DGROUP. Звичайна послідовність сегментів при відсутності /DO описана в п.3.4.3.

Особливості роботи LINK.

LINK створює виконавчий файл шляхом конкатенації коду програми і сегментів даних, відповідно коректним інструкціям вихідного тексту. Ця зчеплена форма сегментів і є тим "виконавчим представленням", що безпосередньо копіюється в пам'ять при завантаженні програми. Частково керувати редагуванням програмних сегментів можна завданням атрибутів у директиві SEGMENT, або використанням директиви DGROUP для формування групи сегментів. Ці директиви визначають цілу групу асоціацій, класів і типів вирівнювання, а також визначають порядок і відносні початкові адреси сегментів програми. Ця інформація є додатко- вою до тієї, котра задається опціями LINK.

Вирівнювання сегментів.

Для установки початкової адреси сегмента LINK використовує тип, що задається директивою SEGMENT, вирівнювання: BYTE, WORD, PARA чи PAGE. Ці ключові слова забезпечують вирівнювання початку сегмента відповідно до границі байта, слова (2 байти), параграфа (16 байтів) чи сторінки (256 байтів). За замовчуванням використовується тип PARA. Байти, що пропускаються через вирівнювання, заповнюються війковими нулями.

Номер кадру.

Якщо обчислюється LINK початкова адреса сегмента залежить від типу вирівнювання сегмента і розмірів уже скопійованих у виконавчий файл сегментів. Ця адреса складається із зсуву і канонічного номера кадру. Канонічна адреса кадру визначає адреса першого параграфа в пам'яті, що містить один чи більш байтів сегмента. Номер кадру завжди кратний 16. Зсувом є відстань у байтах від початку параграфа до першого байта сегмента. Для типів PAGE і PARA зсув завжди нульовий, а для типів BYTE і WORD може бути ненульовим. Номер кадру може бути отриманий з MAP-файлу. Його містять перші 5 16-ричних цифр start-адреси сегмента.

Послідовність сегментів.

LINK копіює сегменти у виконавчий файл в такій же послідовності, у якій він їх зчитує з об'єктних файлів. Сегменти, що мають ідентичні імена класів, вважаються приналежними до одного типу класів і копіюються в виконавчий файл як безупинний блок. Порядок завантаження сегментів і способи керування цим порядком шляхом присвоювання типів класів обговорюються в п.3.4.3 MICROSOFT MACRO ASSEMBLER REFERENCE MANUAL.

Комбіновані сегменти.

Для визначення того, чи будуть два або більше сегментів, які мають те саме ім'я, з'єднані в один великий сегмент, LINK використовує комбінації типів сегментів. У мові асемблера маються наступні типи комбінацій: PUBLIC, STACK, COMMON, MEMORY, AT і PRIVATE (п.3.4.2 MICROSOFT MACRO ASSEMBLER REFERENCE MANUAL). Якщо сегмент має тип комбінації PUBLIC, LINK автоматично з'єднує його з іншими сегментами, що мають те ж ім'я і приналежні до того ж класу. При з'єднанні сегментів передбачається, що сегменти безупинні і всі адреси в сегментах доступні через зсув відносно адреси кадру. Результат виходить таким же, як якби отриманий великий сегмент був визначений у вихідному файлі суцільним шматком. LINK зберігає тип вирівнювання кожного сегмента. Це означає, що, хоча сегменти і включені в один великий сегмент, код і дані сегментів зберігають свої типи вирів- нювання. Якщо розміри сегментів, що з'єднуються, перевищують 64ДО, видається повідомлення про помилку. Якщо сегмент має тип комбінації STACK, LINK виконує ту ж операцію, що й у випадку PUBLIC. Розходження полягає в тому, що для STACK-сегментів у виконавчий файл записується початкове значення покажчика стека, яке являє собою зсув від кінця першого по порядку сегмента або стека комбінованого сегмента.

У цьому випадку при використанні типу STACK для сегментів стека програмісту немає необхідності передбачати в програмі завантаження регістра SS. Якщо сегмент має тип комбінації COMMON, LINK автоматично з'єднує його з іншими сегментами, що мають те ж ім'я і приналежними до того ж класу. Однак, коли LINK з'єднує загальні сегменти, початок кожного сегмента встановлюється на одну адресу, у результаті чого утворяться серії сегментів, що перекриваються. У підсумку виходить один сегмент, що по довжині не перевищує самий довгий з комбінуючих сегментів. Сегменти з типом комбінації MEMORY трактуються LINK у точності так само, як і PUBLIC-сегменти. MASM забезпечує MEMORY для сумісності з лінкерами тип, що виділяє MEMORY як особливий тип комбінації. Сегмент має тип комбінації PRIVATE у тому випадку, коли у вихідному файлі немає точних указівок відносно його типу комбінації. LINK не поєднує PRIVATE-сегменти.

Групи.

Об'єднання декількох сегментів у групу дозволяє адресувати їх щодо однієї адреси кадру. При цьому неважливо, чи належать ці сегменти до одного класу. Коли LINK виявляє групу, він відповідним чином перебудовує всі адресні посилання в ній. Сегменти в групі не є суміжними, не належать до одного класу і мають різні типи комбінацій. Але сумарний обсяг усіх сегментів у групі не повинний перевищувати 64ДО. Групи не впливають на порядок завантаження сегментів у пам'ять. Навіть якщо використовуються імена класів і об'єктні файли вводяться у відповідній послідовності, немає гарантії, що сегменти будуть суміжними. На практиці LINK може помістити не приналежній групі сегмент у ті ж 64ДО пам'яті. Хоча в LINK і немає строгої перевірки того, чи містяться усі сегменти групи в 64ДО пам'яті, але при виявленні порушення цієї умови буде видане повідомлення про переповнення узгодження.

Узгодження.

Коли в процесі роботи, LINK уже відомі адреси всіх сегментів програми й організовані всі комбінації сегментів і групи, лінкер має можливість "погодити" деякі недозволені посилання до міток і змінним. Для цього LINK обчислює відповідні адресу сегмента і зсув, і заміщає тимчасові значення, згенеровані асемблером, на нові значення. Відповідно до типів посилань LINK реалізує наступні типи погоджень:

1. Короткі.

2. Внутрішні щодо себе.

3. Внутрішні щодо сегмента.

4. Довгі.

Розмір значення, що обчислюється, залежить від типу посилання. Якщо LINK виявляє помилку в передвіщеному розмірі посилання, видається повідомлення про переповнення узгодження. Це може відбутися, наприклад, коли програма намагається використовувати 16-бітовий зсув для доступу до інструкції в сегменті, що має інша адреса кадру. Це ж повідомлення може бути видано, якщо всі сегменти в групі не містяться усередині блоку пам'яті в 64ДО. Коротке посилання має місце в інструкції JMP, воно передає керування на позначену інструкцію в тому ж сегменті групи, що відстає від JMP не більш, ніж на 128 байтів. Для такого посилання LINK виробляє 8-бітове число зі знаком. Якщо інструкція, на яку передається керування, знаходиться в іншому сегменті чи групі, тобто має іншу адресу кадру, або відстає більш, ніж на 128 байтів у будь-якому напрямку, формується повідомлення про помилку.

Внутрішнє щодо себе посилання має місце в інструкціях, що адресують дані до того ж сегмента чи групи. Для такого посилання LINK формує 16-бітовий зсув. Якщо дані не належать тому ж сегменту чи групі, видається повідомлення про помилку. Внутрішнє щодо сегмента посилання має місце в інструкціях, що адресує дані у визначеному сегменті чи групі щодо зазначеного регістра сегмента. Для цього посилання LINK виробляє 16-бітовий зсув. Якщо цей зсув усередині специфікованого кадру виявляється більшим 64ДО і менше 0, чи якщо початок канонічного кадру, утримуючого необхідні дані - без адресації: видається повідомлення про помилку. Довге посилання має місце в інструкціях CALL, передавальних керування в інший сегмент чи групу. LINK у цьому випадку виробляє 16-бітову адресу кадру і 16-бітовий зсув. Якщо обчислений зсув більше 64ДО і менше 0, чи якщо початок канонічного кадру, у який передається керування - без адреси, формується повідомлення про помилку.

Пошук бібліотек.

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

1. У поточному підоголошенні.

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

3. На шляхах, визначених змінної LIB команди DOS SET. За допомогою команди SET можуть бути задані кілька шляхів пошуку, які діляться крапкою з комою. Вид команди SET: SET LIB=<список шляхів>.

Лекція 5 Основні поняття мови асемблера Х86

1. Будова програми на мові Assembler

2. Поняття "сегмент", "регістр", "підпрограмма"

3. Граматичні конструкції, які відповідають цим поняттям

4. Тип даних в асемблері. Поняття "байт", "півбайт", "слово", та інші

1. Будова програми на мові Assembler

ФОРМАТ КОДУВАННЯ

Основний формат кодування команд асемблера має наступний вигляд:

[мітка] команда [операнд(и)]

Мітка (якщо мається), команда й операнд (якщо мається) pозділяються принаймні одним пробілом або символом табуляції. Максимальна довжина рядка - 132 символи, однак, більшість бажають працювати з рядками в 80 символів (відповідно ширині екрана). Приклади кодування:

Мітка Команда Операнд

COUNT DB 1; Ім'я, команда, один операнд

MOV AX 0; Команда, два операнда

Мітки

Мітка в мові асемблера може містити наступні символи:

Букви: від A до Z і від a до z.

Цифри: від 0 до 9.

Спецсимволи: знак питання (?) крапка (.) (тільки перший символ) знак "комерційне эт" (@) підкреслення (-) долар ($).

Першим символом у мітці повинна бути буква спецсимвол. Асемблер не робить розходження між заголовними і рядковими буквами. Максимальна довжина - 31 символ. Приклади міток: COUNT, PAGE25, $E10. Рекомендується використовувати описові і значеневі мітки. Імена регістрів, наприклад, AX, DI чи AL є зарезервованими і використовуються тільки для вказівки відповідних регістрів. Наприклад, у команді ADD AX, BX асемблер "знає", що AX і BX відноситься до регістрів. Однак, у команді MOV REGSAVE,AX асемблер сприйме ім'я REGSAVE тільки в тому випадку, якщо воно буде визначено в сегменті даних. У додатку 3 приведений cписок усіх зарезервованих слів асемблера.

Команда

Мнемонічна команда вказує асемблеру яку дію повинен виконати даний оператор. У сегменті даних команда (чи директива) визначає поле, робочу oбласть чи константу. У сегменті коду команда визначає дію, наприклад, пересилання (MOV) чи додавання (ADD).

Операнд

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

Мітка Команда Операнд

COUNTER DB 0;

Визначити байт (DB); з нульовим значенням.

Команда може мати один чи два операнда, або взагалі бути без операндів. Розглянемо наступні три приклади:

Команда Операнд Коментар

Немає операндів RET; Повернутися

Один операнд INC CX ;Збільшити CX

Два операнда ADD AX,12 ;Додати 12 до AX

Мітка, команда й операнд не обов'язково повинні починатися з якої-небудь визначеної позиції в рядку. Однак, рекомендується записувати їх у стовпчик для більш зручного читання програми. Для цього, наприклад, редактор DOS EDLIN забезпечує табуляцію через кожні вісім позицій.

2. Поняття "сегмент", "регістр", "підпрограмма"

Сегментом називається область, що починається на границі параграфа, тобто по будь-якій адресі, що поділяється на 16 без залишку. Хоча сегмент може розташовуватися в будь-якому місці пам'яті і мати розмір до 64 Кбайт, він вимагає стільки пам'яті, cкільки необхідно для виконання програми. Існує три головних сегменти:

1. Сегмент кодів. Сегмент кодів містить машинні команди, які будуть виконуватися. Звичайно перша виконувана команда знаходиться на початку цього сегмента і операційна система передає керування за адресою даного сегмента для виконання програми. Регістр сегмента кодів (CS) адресує даний сегмент.

2. Сегмент даних. Сегмент даних містить визначені дані, константи і робочі області, необхідні програмі. Регістр сегмента даних (DS) адресує даний сегмент.

3. Сегмент стека. Стік містить адреси повернення як для програми для повернення в операційну систему, так і для викликів підпрограм для повернення в головну програму.

Регістр сегмента стека (SS) адресує даний сегмент.

Ще один сегментний регістр - регістр додаткового сегмента (ES), призначений для спеціального використання. На pис.1.2 графічно представ- лені регістри SS, DS і CS.

Послідовність регістрів і сегментів на практиці може бути інша. Три сегментних регістри містять початкові адреси відповідних сегментів і кожен сегмент починається на границі параграфа. Усередині програми всі адреси пам'яті відносні до початку cегмента. Такі адреси називаються зсувом від початку сегмента. Двобайтовий зсув (16-бітний) може бути в межах від значення 0000 до значення FFFF або від 0 до 65535. Для звертання до будь-якої адреси в програмі, комп'ютер складає адреса в регістрі сегмента і зсуву. Наприклад, перший байт у сегменті кодів має зсув 0, другий байт - 01 і так далі до зсуву 65535. Як приклад адресації, допустимо, що регістр сегмента даних містить значення 045F і деяка команда звертається до комірки пам'яті усередині сегмента даних з зсувом 0032. Недивлячись на те, що регістр сегмента даних містить 045F, він вказує на адресу 045F0, тобто на границі параграфа. Дійсний aдрес пам'яті тому буде наступний:

Адреса в DS: 045F0

Зсув: 0032

Реальна адреса: 04622

Яким чином процесори 8086/8088 адресують пам'ять в один мільйон байт? У регістрі міститься 16 біт. Оскільки адреса сегмента завжди на границі параграфа, молодші чотири біти адреси pівні нулю. Тичина. FFF0 дозволяє адресувати до 65520 (плюс зсув) байт. Але фахівці вирішили, що нема рації мати місце для бітів, що завжди дорівнюють нулю. Тому адреса зберігаються в cегментному регістрі як шіст. nnnn, а комп'ютер думає, що існує ще чотири нульових молодших біта (одна шіст. цифра), тобто шіст. nnnn0. Таким чином, тичина. FFFF0 дозволяє адресувати до 1048560 байт. Якщо ви сумніваєтесь, то декодуйте кожне тичина. F як двійкове 1111, врахуйте нульові біти і складете значення для одиничних біт. Процесор 80286 використовує 24 біта для адресації так, що FFFFF0 дозволяє адресувати до 16 мільйонів байт, а процесор 80386 може адресувати до чотирьох мільярдів байт.

3. Граматичні конструкції, які відповідають цим поняттям

РЕГІСТРИ

Процесори 8086/8088 мають 14 регістрів, використовуваних для yправления програмою, що виконується, для адресації пам'яті і для забезпечення арифметичних обчислень. Кожен регістр має довжину в одне слово (16 біт) і адресується по імені. Біти регістра прийняті нумерувати ліворуч праворуч:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Процесори 80286 і 80386 мають ряд додаткових регістрів, деякі з них 16-бітові. Ці регістри тут не розглядаються. Сегментні регістри CS, DS, SS і ES.

Кожен сегментний регістр забезпечує адресацію 64ДО пам'яті, що називається поточним сегментом. Як показано раніше, cегмент вирівняний на границю параграфа і його адреса в сегментному pегістрі припускає наявність праворуч чотирьох нульових бітів.

1. Регістр CS.

Регістр сегмента коду містить початковий адреса сегмента коду. Ця адреса плюс величина зсуву в командному покажчику (IP) визначає адреса команди, яка повинна бути обрана для виконання. Для звичайних програм немає необхідності робити посилання на регістр CS.

2. Регістр DS.

Регістр сегмента даних містить початковий адрес сегмента даних. Ця адреса плюс величина зсуву, визначена в команді, вказують на конкретний осередок у сегменті даних.

3. Регістр SS.

Регістр сегмента стека містить початковий адрес в сегменті стека.

4. Регістр ES. Деякі операції над рядками використовують додатковий сегментний регістр для керування адреси цієї пам'яті. У даному контексті регістр ES зв'язаний з індексним регістром DI. Якщо необхідно використовувати регістр ES, асемблерна програма повинна його інніціалізувати.

Регістри загального призначення: AX, BX, CX і DX

При програмуванні на асемблере регістри загального призначення є "робочими конячками". Особливість цих регістрів полягає в тому, що можлива адресація їх як одного цілого чи слова як oднобайтової частини. Лівий байт є старшою частиною (high), a правий - молодшою частиною (low). Наприклад, двобайтовий регістр CX складається з двох однобайтових: CH і CL, і посилання на регістр можливі по кожному з цих трьох імен. Наступні три асемблерні команди засилають нулі в регістри CX, CH і CL, відповідно:

MOV CX,00

MOV CH,00

MOV CL,00

1. Регістр AX. Регістр AX є основним суматором і застосовується для всіх операцій уведення-висновку, деяких операцій над рядками і деяких арифметичних операцій. Наприклад, команди множення, розподілу і зрушення припускають використання регістра AX. Деякі команди генерують більш ефективний код, якщо вони мають посилання на регістр AX.

AX: ¦ AH ¦ AL ¦

2. Регістр BX. Регістр BX є базовим регістром. Це єдиний регістр загального призначення, що може використовуватися в якості "індексу" для розширеної адресаціі. Інше загальне застосування його - обчислення.

BX: ¦ BH ¦ BL ¦

3. Регістр CX. Регістр CX є лічильником. Він необхідний для керування числом повторень циклів і для операцій зрушення уліво або вправо. Регістр CX використовується також для обчислень.

CX: ¦ CH ¦ CL ¦

4. Регістр DX. Регістр DX є регістром даних. Він застосовується для деяких операцій уведення/висновку і тих операцій множення і розподілу над великими числами, які використовують реєстрову пару DX і AX.

DX: ¦ DH ¦ DL ¦

Будь-які регістри загального призначення можуть використовуватися для додаваня і вирахування як 8-ми, так і 16-ти бітових значень.

Реєстрові покажчики: SP і BP

Реєстрові покажчики SP і BP забезпечують системі доступ до даних у сегменті стека. Рідше вони використовуються для операцій додавання і вирахування.

1. Регістр SP. Покажчик стека забезпечує використання стека в пам'яті, дозволяє тимчасово зберігати адреса і інколи дані. Цей регістр зв'язаний з регістром SS для адреси цього стека.

2. Регістр BP. Покажчик бази полегшує доступ до параметрів: даним і адресам переданим через стек.

Індексні регістри: SI і DI

Обоє індексні регістри можливі для розширеної адресації і для використа- ння в операціях додавання і вирахування.

1. Регістр SI. Цей регістр є індексом джерела і застосовується для деяких операцій над рядками. У даному контексті регістр SI зв'язаний з регістром DS.

2. Регістр DI. Цей регістр є індексом призначення і застосовується також для строкових операцій. У даному контексті регістр DI зв'язаний з регістром ES.

Регістр командного покажчика: IP

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

Флаговий регістр

Дев'ять з 16 бітів флагового регістра є активними і визначають поточний стан машини і результати виконання. Багато арифметичних команд і команди порівняння змінюють стан прапорів. Призначення флагових бітів:

Прапор Призначення

O (Переповнення) Вказує на переповнення старшого біта при арифметичних командах.

D (Напрямок) Позначає ліве чи праве направлення чи пересилання порівняння строкових даних (даних у пам'яті перевищуючих довжину одного слова).

I (Переривання) - Вказує на можливість зовнішніх переривань.

T (Покроковий режим) - Забезпечує можливість роботи процесора в покроковому режимі.

Наприклад, програма DOS DEBUG впливає на даний прапор так, що ймовірне покрокове виконання кожної команди для перевірки зміни вмісту регістрів і пам'яті.

S (Знак) Містить результуючий знак після арифметичних операцій (0 - плюс, 1 - мінус).

Z (Нуль) Показує результат арифметичних операцій і операцій порівняння (0 - ненульовий, 1 - нульовий результат).

A (Зовнішній перенос) Містить перенос з 3-го біта для 8-бітних даних, використовується для спеціальних арифметичних операцій.

P (Контроль парності) Показує парність молодших 8-бітних даних (1 - парне і 0 - непарне число).

C (Перенос) Містить перенос зі старшого біта, після арифметичних операцій, а також останній біт при зрушеннях або циклічних зрушеннях.

Під час програмування на асемблері, частіше всього використовуються прапори O, S, Z, і C для арифметичних операцій і операцій порівняння, а прапор D для позначення напрямку в операціях над рядками. У наступних розділах міститься більш докладна інформація про флаговий pегістр.

4. Тип даних в асемблері. Поняття "байт", "півбайт", "слово", та інші

ДИРЕКТИВИ ВИЗНАЧЕННЯ ДАНИХ

Асемблер забезпечує два способи визначення даних : по-перше, через указівку довжини даних і, по-друге, по їх змісту. Розглянемо основний формат визначення даних:

[ім'я] Dn вираження - Ім'я елемента даних не обов'язково (це вказується квадратними дужками), але якщо в програмі існують посилання на деякий елемент, то це робиться за допомогою імені. Правила написання імен приведені в розділі "Формат кодування" у розділі 3.

- Для визначення елементів даних існують наступні директиви: DB (байт), DW (слово), DD (подвійне слово), DQ (учетверенное слово) і DT (десять байт).

- Вираження може містити константу, наприклад: FLD1 DB 25 чи знак питання для невизначеного значення, наприклад: FLDB DB ?

Страницы: 1, 2, 3, 4, 5, 6


© 2010 BANKS OF РЕФЕРАТ