Запис програм на мові асемблера

Поля зручно розділяти табуляцією.

Імена даних, процедур, сегментів або мітки команд можуть складатися не більше ніж з 255 латинських букви або цифр, причому першим символом повинна бути обов'язково буква. За замовчуванням в імені значущими є перші 32 символу. Великі і малі літери можуть ассемблером відрізнятися або Не будете звертати уваги (ключі: / ML, / MU і / MX). Мітки машинних команд повинні закінчуватися символом двокрапки.

При трансляції кожному імені ставиться у відповідність ряд атрибутів.

Поле операції містить мнемокод машинної команди, дирек-тиви або макрокоманди. Великі і малі літери в мнемо-коді операції ассемблером не розрізняються.

Поле операндів служить для запису операндів, якщо вони требу-ються.

Якщо операндів кілька вони, як правило, поділяються за-п'ятими.

У програмах на мові асемблер допустимі кілька типів констант:

· Десяткові - послідовність цифр від 0 до 9;

· Шістнадцятиричні - послідовність шістнадцятирічних цифр від 0 до 9 і від A або a до F або f, що завершується літерою H або h, першою повинна бути десяткова цифра;

· Восьмеричні - послідовність цифр від 0 до 7, що завершується літерами Q, q, O або o;

· Виконавчі - послідовність цифр 0 або 1, що завершується літерою B або b.

Нижче приведена типова структура простої програми на асемблері.

QUIT: exitcode 0

Директиви stack, dataseg і codeseg служать для виділення сегментів.

Макрокоманда startupcode містить не започатковано код, який забезпечує завантаження сегментних регістрів DS і SS.

Макрокоманда exitcode <код возврата> здійснює завершення виконання програми і передачу управління ОС. Необов'язковий-ний параметр <код возврата> служить для повернення значення, яке можна перевірити в командних файлах ОС.

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

<имя> DW <выражение>,<выражение>. і

<имя> DB <выражение>,<выражение>.

служать для визначення даних, слів або байтів, відповідно.

<выражение> може бути константою або, якщо значення НЕ оп-рідшали, можна використовувати символ питального знак.

конструкція <число> dup (<выражение>,<выражение>. ) Викорис-зуется для повторення послідовності виразів в дужках заданий <число> раз.

Обробка програм в DOS

Обробка програм на мові асемблера в DOS складається з не-скількох етапів:

· Трансляція програми за допомогою асемблера TASM;

· Запуск і налагодження програми.

Для трансляції вихідного файлу необхідно ввести командний рядок наступного виду:

tasm [, [] [, [] [, []]]] [<ключи>]

Зауваження. Файл NUL означає, що відповідний файл не формується.

Для вхідних і вихідних файлів TASM використовує такі умовчання:

· Вихідний файл: розширення - ASM;

· Об'єктний файл: ім'я збігається з ім'ям вихідного файлу, розширення - OBJ;

· Файл лістингу: ім'я - NUL, якщо заданий ключ / L або / LA - ім'я файлу лістингу збігається з ім'ям вихідного файлу, якщо ім'я вказано або заданий ключ / L або / LA, то розширення за замовчуванням - LST;

· Файл перехресних посилань: ім'я - NUL, якщо заданий ключ / C - ім'я файлу перехресних посилань збігається з ім'ям вихідного файлу, якщо ім'я вказано або заданий ключ / C, то розширення за замовчуванням - CRF.

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

· / L і / LA - формувати файл лістингу або розширеного лістингу;

· / C - формувати файл з таблицею перехресних посилань: спи-сок ідентифікаторів вихідного модуля з зазначенням номерів рядків програми, в яких згадується даний ідентифік-тор;

· / ZI - помістити в об'єктний модуль повну інформацію для відладчика: ідентифікатори даних і міток, номери рядків, і т.п.

tasm primer / L / ZI

Транслюється файл PRIMER.ASM, створюються файл лістингу PRIMER.LST і, якщо немає помилок, об'єктний файл PRIMER.OBJ. У об'єктний файл включається повна інформація для відладчика.

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

tlink [, [] [, [] [, [<библиотеки>]]]] [<ключи>]

Для вхідних і вихідних файлів TLINK використовує такі умовчання:

· Об'єктний файл: розширення - OBJ;

· Виконуваний файл: ім'я збігається з ім'ям об'єктного файлу, розширення - EXE;

· Файл плану модуля: ім'я - NUL, якщо заданий ключ / M - ім'я файлу плану модуля збігається з ім'ям об'єктного файлу, якщо ім'я вказано або заданий ключ / M, то розширення за замовчуванням - MAP.

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

· / V - помістити в виконуваний модуль повну інформацію для відладчика: ідентифікатори даних і міток, номери рядків, і т.п.

tlink primer / M / V

Виконати компоновку об'єктного файлу PRIMER.OBJ. Испол-няемое файл буде мати ім'я - PRIMER.EXE, в нього буде включена інформація для відладчика. Цією командою створюється файл плану модуля з ім'ям PRIMER.MAP.

Запуск програми на виконання можна здійснити, набравши в командному рядку ім'я файлу програми (розширення EXE вка-зувати необов'язково):

Для запуску під отладчиком необхідно запустити відладчик із зазначенням імені файлу вашої програми:

Використання відладчика TD

Не претендуючи на повноту опису, наведемо опис основ-них функцій і можливостей відладчика TD.

Як запустити програму під отладчиком

Запуск програми під відладчиком виконується шляхом набору командного рядка

Що вміє і чого не вміє відладчик TD

· Трасування (послідовне виконання) - можна виконувати про- граму по одному оператору, пропускаючи (або не пропускаючи) при цьому виклики процедур і функцій;

· Точки зупину - виконати програму до зазначеної в про-грамі точці;

· Зміна - можна змінити вміст змінних;

· Простежування - можна виділити деякі змінні і відслідковувати зміну їх значень в процесі роботи програми.

· Не може перекомпіліровать вашу програму. Для цього вам потрібен компілятор або асемблер (наприклад, TASM);

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

У вікні Module (Модуль) на екран виводиться текст налагоджувати-мій програми. Ви можете переміщатися по тексту, виконувати рядки програми і переглядати дані і код.

Вікно CPU (ЦП) показує поточний стан центрального процесора (ЦП). Це вікно містить п'ять панелей (областей), в яких показані:

· Дамп пам'яті (як правило, сегмент даних);

· Вміст регістрів ЦП;

· Вміст прапорів ЦП.

Локальне меню вікна Watch (Alt + F10 або Ctrl + F10) містить пункти:

· Edit (Редагування) дозволяє редагувати вираз у вікні Watches. Ви можете змінювати те, що там знаходиться або вводити нове значення;

· Remove (Видалення) видаляє з вікна Watches поточну обрану запис;

· Delete All (Видалити все) видаляє з вікна Watches все записи;

· Inspect (Перевірка) відкриває вікно перевірки (вікно Inspector), в якому виводиться вміст підсвічується в даний момент у вікні Watches записи;

· Change (Зміна) змінює значення підсвічується в даний момент записи в вікні Watches на значення, яке ви вводите у відповідь на підказку.

У вікні Dump (Дамп) виводиться в безпосередньому вигляді содер-жімое області пам'яті. (Це вікно еквівалентно області дампа вікна CPU.) Ви можете виводити дані у вигляді символів, шістнадцятковим-дцатерічних байтів, слів, подвійних слів, або в будь-якому форматі з плаваючою точкою. Дане вікно можна використовувати для про-огляду в безпосередньому вигляді деяких даних, коли вам не потрібні інші частини вікна CPU. У локальному меню цього вікна є команди, що дозволяють вам модифікувати виводи-дімие дані, змінювати формат їх виведення, а також маніпулює-вати блоками даних.

Локальне меню вікна Dump (Alt + F10 або Ctrl + F10) містить пункти:

· Display As (Режим виведення) - задає режим виведення дампа: байтами, словами і т.п.

Екран користувача - це екран виведення вашої програми. Цей екран буде мати точно такий же вигляд, який він мав би при ви-полнении вашої програми без відладчика (безпосередньо під DOS).

Ви можете використовувати даний екран для того, щоб прове-рить, що виводить ваша програма, і чи відповідає це тому, що має бути на екрані. Для перемикання в екран користування земельними діл-теля виберіть пункт меню Window + User Screen (або натисніть Alt + F5).

Команда Run (Виконання, F9) запускає вашу програму на виконання. При настанні одного з наступних подій управління передається отладчику:

· Ваша програма завершила виконання;

· Виявлено точка зупинки з дією переривання;

· Ви перервали виконання за допомогою клавіш Ctrl + Break.

Команда Go to Cursor

Команда Go to Cursor (Перейти до курсора, F4) виконує про-граму до того рядка, де знаходиться курсор (в поточному вікні Module або області Code вікна CPU).

Команда Trace Into

Команда Trace Into (Трасування вглиб, F7) виконує один рядок вихідного коду або машинну інструкцію. Якщо поточна рядок містить виклик процедури або функції, то відладчик ви-полняет трасування цієї процедури. Однак якщо поточним ок-ном є вікно CPU, то виконується одна машинна інструкція.

Команда Step Over (Крок з пропуском, F8) виконує один рядок вихідного коду або машинну інструкцію, минаючи трас-сіровку викликається процедури або функції. При цьому зазвичай виконується один рядок вихідного тексту програми. Однак якщо поточним вікном є вікно CPU, то виконується тільки одна машинна інструкція.

Коли ця команда виконується для однієї машинної інструкції, Турбоотладчік інтерпретує деякі інструкції, як одну, навіть якщо вони призводять до виконання неяк-ких інструкцій:

· Call - виклик підпрограми;

· Int - виклик переривання;

· Loop, loopz, loopnz - управління циклом;

· Rep, repnz або repz, за якими слідують інструкції cmps, lods, movs, scas, stos.

Команда Instruction Trace

Команда Instruction Trace (Трасування інструкцій, Alt + F7) ви-полняет одну інструкцію. Її можна використовувати, коли ви хочете трассіровать переривання, або коли ви перебуваєте у вікні Module і хочете виконувати трасування процедури або функції, яка знаходиться в модулі без налагоджувальної інформації (наприклад, в бібліотечній подпрограмме).

Команда Program Reset

Команда Program Reset (Скидання програми, Ctrl + F2) перезагру-жает отлаживаемую вами програму з диска.

ПРИКЛАД ВИКОНАННЯ РОБОТИ

Дан масив з десяти слів, що містять цілі числа. Требу-ется знайти максимальне значення.

MASS dw 10h, 20h, 30h, 5h, 40h, 15h, 20h, 70h, 35h, 34h

ÖÈÊËÈ×ÅÑÊÈÅ È ÐÀÇÂÅÒÂËßÞÙÈÅÑß ÏÐÎÃÐÀÌÌÛ

Мета цієї роботи - вироблення навичок розробки простих циклічних програм на мові асемблера.

Для вироблення коду умови можна скористатися коман-дами cmp, test. Крім того, коди умови виробляються ари-метичних і логічними командами.

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

ПРИКЛАД ВИКОНАННЯ РОБОТИ

Дан масив з десяти слів, що містять цілі числа. Требу-ется знайти максимальне значення.

MASS dw 10h, 20h, 30h, 5h, 40h, 15h, 20h, 70h, 35h, 34h

Приклади використання логічних команд

Встановити 3 і 0 біти в регістрі AL, інші біти не зраджувати

or AL, 00001001b.

Скинути 4 і 6 біти в регістрі AL, інші біти не зраджувати

and AL, 10101111b.

Проинвертировать 4 і 2 біти в регістрі AL, інші біти не зраджувати

xor AL, 00010100b.

Перейти на мітку LAB, якщо встановлено 4 біт регістра AL, в іншому випадку продовжити виконання програми

test AL, 00010000b
jnz LAB
; продовжуємо
.
LAB:

Порахувати кількість одиниць в байті - регістрі AL

mov CX, 8
xor BX, BX
LL: shl AL, 1
jnc NO
inc BX
NO: loop LL

ПРИКЛАД ВИКОНАННЯ РОБОТИ

Дан масив з 10 байтів. Всі байти мають нульові старші біти. Необхідно кожен байт, що містить 1 в 0-м бите, доповнити до парного числа одиниць установкою 7-го біта байта, кожен байт, що містить 0 в 0-м бите, доповнити до непарного числа одиниць установкою 7-го біта байта.

MB db 04h, 07h, 11h, 23h, 04h, 38h, 3Fh, 2Ah, 0Dh, 34h

mov CX, 10; CX - лічильник числа ітерацій

mov AL, [BX]; вважати черговий байт масиву

test AL, 00000001b; встановлений-ли біт 0?

jz BIT0CLR; немає, біт 0 скинутий

; біт 0 встановлений

test AL, 0FFh; парне число одиниць?

jp OK; да, більше нічого робити не треба

or AL, 80h; непарне, доповнити до парного

BIT0CLR:; біт 0 скинутий

test AL, 0FFh; парне число одиниць?

jnp OK; немає, більше нічого робити не потрібно

or AL, 80h; парне, доповнити до непарного

mov [BX], AL; записати змінений байт масиву

QUIT: exitcode 0

1. Дан масив з 10 байтів. Порахувати кількість байтів, в яких скинуті 6 і 4 біти.

2. Дан масив з 8 байтів. Розглядаючи його як масив з 64 біт, порахувати кількість одиниць.

3. Дан масив з 8 байтів. Розглядаючи його як масив з 64 біт, порахувати довжину найдовшої послідовності одиниць.

4. Дан масив з 8 байтів. Розглядаючи його як масив геологіч-ських значень x0 x1 x2 x3 x4 x5 x6 x7 (true - є ненульові біти в байті, false - все біти нульові), обчислити логічний фор-мулові f = (x7

x6x3x1) V (x6x4x2x1

5. Дан масив з 5 байтів. Розглядаючи його як масив з 10 зошити, знайти «виключає або» всіх 10 зошити.

6. Дан масив з 10 байтів. Порахувати кількість байтів, в кото-яких скинуті 5 або 1 біти.

7. Розглядаючи байт як набір логічних значень x7 x6 x5 x4 x3 x2 x1 x0 (true - 1, false - 0), обчислити геологіч-ську формулу f = (x7

x6x3x1) V (x6x4x2x1

8. Дан масив з 10 байтів. Порахувати кількість байтів, в кото-яких встановлені 3 і 7 біти.

1. У чому відмінність команд test DST, SRC і and DST, SRC?

2. Як скинути 5-й біт змінної - байта ВВ?

3. Як встановити 5-й біт змінної - байта ВВ?

4. Як проинвертировать 5-й біт змінної - байта ВВ?

5. Як перевірити, чи встановлений 5-й біт змінної - байта ВВ?

6. Як перевірити, парних або непарних є кількість встановлених біт в змінної-байте ВВ?

7. Які прапори умов модифікуються після виконання команд and, or, xor?

8. У чому основна відмінність команд логічних і арифметичних зрушень?

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

10. У двох рядках
mov CL, 8
"Зрушення" BL, CL
які команди можна підставити замість "зрушення", щоб вміст BL не змінилося?

11. У двох рядках
"Зрушення вліво" BL, 1
"Зрушення вправо" BL, 1
які команди можна підставити замість "зрушення вліво" і "зрушення вправо", щоб вміст BL не змінилося?

Схожі статті