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

M_Asm2009LS

.pdf
Скачиваний:
17
Добавлен:
23.02.2016
Размер:
2.34 Mб
Скачать

Міністерство освіти і науки україни Чернівецький національний університет імені Юрія Федьковича

Підлягає поверненню на кафедру

Програмування

(мова асемблера)

Методичні рекомендації до лабораторних робіт

Чернівці Чернівецький національний університет

2009

1

ББК 22.183.492 П 627 УДК 519.863

Друкується за ухвалою редакційно-видавничої ради Чернівецького національного університету імені Юрія Федьковича

П627 Програмування (мова асемблера) : методичні рекомендації до лабораторних робіт / укл.: Сопронюк Ф.О., Сопронюк Є.Ф., Лазорик В. В. – Чернівці: ЧНУ, 2009. – 99 с.

ББК 22.183.492 УДК 519.863

© ЧНУ, 2009

2

Вступ Мова асемблера найбільш близька до машинної мови

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

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

Метою даного видання є оволодіння основами мови програмування асемблера та закріплення знань про архітектури персональних комп’ютерів на базі сім’ї процесорів iAPX (Intel Advanced Processor Architecture) корпорації Intel та сумісних процесорів iAPX, мікросхеми яких випускають фірми AMD , Cyrix та IC. Дане видання містить методичні вказівки до виконання семи тематичних лабораторних робіт із дисципліни “програмування” (мова асемблера). До лабораторних робіт додається необхідний теоретичний матеріал, приклади розв’язання тематичних задач та індивідуальні завдання для студентів.

3

Лабораторна робота № 1 Структура програми мовою асемблера. Розробка та налагодження програм

Мета : вивчення структури програми мовою асемблера. Вимоги до програми мовою асемблера. Засоби створення і налагодження програм.

План заняття:

1.Структура простої програми мовою асемблера.

2.Директиви сегментації SEGMENT, ENDS. Директиви процедур

PROC, ENDP. Директива ASSUME. Директива END.

3.Вимоги до програми мовою асемблера. Приклади простих програм.

4.Трансляція програми. Опції транслятора та їх загальна характеристика.

5.Редактор звязків. Опції редактора звязків.

6.Застосування налагоджувача для пошуку помилок.

Теоретичні відомості

1. Структура простої програми мовою асемблера

Проста програма мовою асемблера – це набір сегментів: сегмент коду, сегмент даних, сегмент стека – три основні сегменти. Якщо потрібно, то можуть бути створені ще три додаткові сегменти даних.

Сегмент коду складається з набору команд та директив (псевдокоманд). Команда має вигляд

[мітка] [префікс] коп [операнд [, операнд ] ] [ ; коментар ]

Елементи команди в квадратних дужках не обов’язкові, їх може не бути. Операнд визначає елемент команди, над яким виконуються дії. Дії задаються елементом коп (код операції), який обов’язковий у команді. В загальному випадку операнд – це вираз, який будується за певними правилами за допомогою арифметичних, логічних, операцій зсуву та інших. У найпростішому випадку це: стала, ім’я регістра, ідентифікатор тощо.

Область коментарів визначається з позиції, яка знаходиться після крапки з комою (;) до кінця поточного рядка.

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

4

1.Малі і великі букви латинського алфавіту. Великі і малі букви за замовчуванням не розрізняються.

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

3.Знаки ?, @, $, _, &.

4.Розділювачі , . : ; ( ) [ ] < > − + / * % ! “ “ ? \ = # ^.

Ідентифікатор (ім’я) – це набір символів (букв алфавіту, цифр,

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

2. Директиви сегментації: SEGMENT, ENDS. Директиви процедур

PROC, ENDP. Директива ASSUME. Директива END

Директиви SEGMENT і ENDS описують сегменти коду, даних та стека.

Загальний вигляд опису сегмента:

імя SEGMENT [ атрибути сегмента]

........................ Тіло сегмента імя ENDS

Атрибути сегмента, якщо вони наявні, визначають :

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

комбінування та спосіб об’єднання з іншими сегментами;

клас сегмента;

розмір сегмента.

Атрибут розміру сегмента може набувати такі значення:

use16 − сегмент 16-бітовий, довжина операнда 16 бітів, довжина адреси 16 бітів, довжина сегмента до 64 Кбайтів;

use32 − сегмент 32-бітовий, довжина операнда 32 біти, довжина адреси 32 біти, довжина сегмента до 4 Гігабайтів.

Директиви PROC і ENDP визначають процедуру. Структура опису процедури (підпрограми) :

імя PROC [ параметри ]

............ Тіло процедури імя ENDP

Процедури повинні знаходитися в межах сегмента коду. Вихід з процедури здійснюється за допомогою команди RET, процедура може мати декілька виходів. Виклик процедури здійснюється за допомогою команди CALL, синтаксис якої

5

CALL імя _процедури.

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

Директива ASSUME вказує транслятору, з якими сегментами будуть пов’язані сегментні регістри. Синтаксис директиви:

ASSUME sreg: name_segment <, sreg_2:name_segment_2 …>,

де sreg – сегментний регістр, name_segment – ім’я сегмента. Щоб вказати, що сегментний регістр не використовується замість імені сегмента, записується ключове слово – Nothing.

Директива END використовується як ознака завершення програми (модуля) мовою асемблера. Синтаксис директиви:

END [Start_adress],

де Start_adress − необов’язковий параметр. Цей параметр може бути тільки в головному модулі програми і вказує на точку, з якої почнеться виконання програми (її називають точкою входу в програму). Будь-який текст, що знаходиться після директиви END, ігнорується компілятором.

3. Вимоги до програми мовою асемблера. Приклади простих програм

Завантажувальні програми мають тип EXE і зберігаються у файлах із розширенням .exe. При створенні EXE-програм необхідно, щоб виконувалися вимоги ініціалізації програми та виходу з програми. Для ініціалізації EXE-програми, написаної мовою асемблера, необхідно:

1)вказати транслятору, які сегментні регістри повинні відповідати сегментам програми;

2)зберегти в стеку адресу, яка знаходиться в регістрі DS, до початку виконання програми;

3)записати в стек значення нуль;

4)завантажити в регістр DS адресу сегмента даних.

Вихід із програми та повернення до операційної системи здійснюється із головної процедури або головного фрагмента коду за допомогою команди RETF. Головною процедурою вважаться процедура, ім’я якої вказано в директиві END. Головним фрагментом коду вважаться код, в якому знаходиться мітка, що вказана в директиві END. Вихід із програми з будь-якого її фрагмента можна здійснити за допомогою команд

mov AX,4C00H int 21h.

Розглянемо два приклади оформлення програми мовою асемблера.

6

Приклад 1. Програма без використання процедур.

title

Begin1.asm

Code

Segment para 'code' ; Опис початку сегмента.

Assume CS:Code,DS:Code ; Інформація для транслятора про використання

 

 

 

 

;

сегментних регістрів.

Begin:

push DS

 

; Запис DS в стек для повернення.

 

sub AX,AX

; Записати в AX нуль.

 

push AX

 

; Записати нуль у стек.

 

mov AX,Code

; Записати в регістр AX адресу сегмента Code.

 

mov DS,AX

; Ініціалізація сегментного регістра DS.

 

mov AX,a

; Код програми, в якій змінній b присвоюється.

 

mov b,AX

; значення змінної a.

 

retf

 

 

; Повернення в OS.

a

dw

5eh

 

 

b

dw

 

?

 

 

Code

Ends

 

; Кінець сегмента.

End Begin

; Завершення програми мовою асемблера та

 

 

 

 

; мітка точки входу в програму при її виконанні.

Приклад 2. Програма з використанням процедур.

title Begin2.asm

 

 

 

Data

Segment

para 'data'

a

db

 

6eh

 

 

b

db

 

30

 

 

c

db

 

?

 

 

Data

Ends

 

 

 

 

Code

Segment

para 'code'

 

Assume CS:Code,DS:Data, ES:Nothing

Begin

Proc

Far

 

;

Головна процедура.

 

push DS

 

 

 

 

sub AX,AX

 

 

 

push AX

 

 

 

 

mov AX,Data

 

 

 

mov DS,AX

 

 

 

mov AL,a

; Код програми

 

mov AH,b

; обчислення значення виразу

 

add

AL,5fh

;

с=а+5fh-(b+96).

 

add AH,96

 

 

 

sub AL,AH

 

 

 

mov c,AL

 

 

 

retf

 

 

;

Повернення з процедури.

Begin

 

 

Endp

 

; Директива завершення процедури.

Code

Ends

 

 

 

 

End Begin

 

 

7

4. Трансляція програми. Опції транслятора та їх загальна характеристика

Нехай розроблена програма мовою асемблера. Далі її необхідно ввести в комп’ютер, перевести її в машинне зображення і виконати. Спочатку програму потрібно записати в текстовий файл, для чого можна використати будь-який текстовий редактор, який підтримує ASCII формат кодування і не вставляє символів, які не входять до алфавіту мови асемблера. Цей текстовий файл потрібно зберегти на жорсткому або гнучкому диску у файлі з розширенням *.asm. Отриманий файл називають файлом початкового коду програми мовою асемблера.

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

Ми використовуватимемо пакет Turbo Assembler. У даному пакеті трансляція програми здійснюється за допомогою транслятора, який знаходиться у файлі tasm.exe (tasm32.exe). Командний рядок для запуску транслятора має таку структуру:

tasm [опції] ім'я_початкового_файла[,ім'я_обєктного_файла] [, ім'я_файла_лістингу][, ім'я_ файла_перехресних_посилань].

Квадратні дужки в командному рядку вказують, що параметри в них не є обов’язковими і, якщо їх немає, то дані файли не будуть створені. В результаті успішної роботи транслятора на диску можуть бути створені такі файли:

- з розширенням .obj - об’єктний файл;

-з розширенням .lst - файл лістингу;

-з розширенням .xrf - файл перехресних посилань.

Основний результат роботи транслятора записується в об’єктний файл, в якому знаходиться об’єктний (машинний) код програми. Як правило, ім’я цього файла задається в цьому рядку. Файли лістингу та перехресних посилань містять додаткову інформацію для розробника. Для створення цих файлів із тим самим іменем, що й початковий файл, потрібно в командному рядку поставити коми.

Файл лістингу містить інформацію про програму в такому вигляді:

<глибина_вкладеності><номер_рядка><зміщення_відносно_початку _сегмента><машинний_код><початковий_код>,

8

де :

<глибина_вкладеності>

рівень вкладеності файлів, що

 

включаються, або макрокоманд у

 

файлі

 

 

 

 

 

 

<номер_рядка>

номер рядка в файлі лістингу, але не в

 

програмі

 

(використовується

для

 

локалізації

помилок

і формування

 

таблиці перехресних посилань);

 

<зміщення>

зміщення в байтах поточної команди

 

відносно початку сегмента коду.

 

Зміщення

обчислює

транслятор

для

 

адресації об’єктів у сегменті

 

 

<машинний_код>

машинне зображення команди мови

 

асемблера,

яка

записана

в

полі

 

<початковий_код>

 

 

 

<початковий_код>

рядок

коду

програми

мовою

 

асемблера

 

 

 

 

 

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

Наведемо найбільш використовувані опції для транслятора tasm.exe:

/а, /s – порядок включення сегментів в об’єктний файл, /а – згідно з іменами латинського алфавіту, /s – згідно з описом в програмі;

/c – вказівка для включення у файл лістингу інформації про перехресні посилання;

/h,/? – виведення на екран довідкової інформації;

/і шлях - визначає шлях до файлів, які включаються за директивою

INCLUDE;

/j директива _TASM – визначає директиви, які транслюватимуться перед початком трансляції початкового файла;

9

/khn – задає максимальну кількість ідентифікаторів у початковому файлі;

/l – указує на необхідність видачі лістингу, навіть якщо це навіть не вимагалося в командному рядку;

/ml –розрізняти у початковому коді великі та малі букви;

/mx – розрізняти великі та малі букви в зовнішніх і спільних ідентифікаторах;

/mu – сприймати всі символи як великі;

/mvn – визначення максимальної довжини ідентифікаторів;

/mn – установка кількості проходів транслятора. За замовчуванням виконується один прохід, максимально 5.

/n – не видавати у файлі лістингу таблиці ідентифікаторів;

/p – перевіряти наявність коду з побічними ефектами при роботі в захищеному режимі;

/q – вилучати з об’єктного коду зайву інформацію (наприклад, інформацію про налагодження);

/t – заборонити виведення всіх повідомлень при умовній трансляції, крім повідомлень про помилки;

/w0-w2 – генерувати попереджувальні помилки різного ступеня повноти;

w0 – повідомлення не генерувати;

w1,w2 – повідомлення генерувати;

/x – включати в лістинг усі блоки умовної трансляції для директив;

/z – при виникненні помилок поряд із повідомленнями друкувати відповідні рядки тексту;

/zi – включати в об’єктний файл інформацію для налагодження;

/zd – розмістити в об’єктний файл інформацію про номери рядків, які необхідні для роботи налагоджувача на рівні початкового тексту програми;

/zn – заборонити розміщення в об’єктний файл інформацію налагодження.

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

%PAGESIZE [кількість рядків][, кількість стовпців] – задає висоту і ширину файла лістингу і починає його нову сторінку (кількість рядків – задає кількість рядків, виведених на одній сторінці лістингу, кількість стовпців – може знаходиться в діапазоні 59255 і задає кількість стовпців на сторінці);

10

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