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

M_Asm2009LS

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

%BIN < розмір > – встановлює довжину поля об’єктного коду;

%LINENUM < розмір > – задає розмір поля для номерів рядків;

%TRUNC – усікання довгих полів лістингу;

%TITLE "текст" – задає заголовок файла лістингу.

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

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

Командний рядок для виклику програми tlink має таку структуру:

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

де список_обєктних_файлів − задає список об’єктних файлів. Файли повинні мати розширення *.obj та розділені пробілами або знаком +;

імя_завантажувального_модуля – визначає ім’я

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

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

імя_файла_бібліотеки − задає бібліотеку, яка створюється і обслуговується спеціальною утилітою tlib.exe. Бібліотека – це набір об’єктних модулів, які розповсюджуються з пакетом Turbo Assembler або розроблені користувачем. Файли бібліотеки мають розширення *.lib. Користувач може створити власну бібліотеку з найчастіше використовуваних підпрограм у вигляді об’єктних модулів за допомогою вказаної утиліти. Параметр необов’язковий.

Програма редагування зв’язків tlink.exe має такі опції:

/x – не створювати файла карти .map;

/m – створити файл карти .map ;

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

11

/3 – підтримка 32-бітового коду;

/t – створити файл типу .com ( за замовчуванням .exe). Наведемо приклад створення завантажувального модуля:

C:\Tasm> tlink.exe begin1.obj.

В результаті отримуємо завантажувальним модуль Begin1.exe.

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

Розроблена програма не завжди виконуватиме бажані дії, оскільки при програмуванні можуть бути допущенні різноманітні помилки. Для пошуку помилок у програмі використовують програми налагодження. В пакет Turbo Assembler входить програма налагодження Turbo Debugger.

Turbo Debugger − це програма налагодження, яка дозволяє налагоджувати програми на рівні початкового тексту. Ця програма призначена для програмістів, які розробляють програми мовами асемблер, С, С++ та іншими мовами програмування.

Turbo Debugger дозволяє знайти в програмі:

місце логічної помилки;

причину логічної помилки.

Програма налагодження Turbo Debugger має такі функції:

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

покрокове виконання програми в прямому напрямку, при якому за один крок виконується одна машинна команда або підпрограма (функція);

виконання до вказаної точки в прямому напрямку;

виконання трасування програми в зворотному напрямку, коли програма виконується в зворотному напрямку по одній машинній команді;

перегляд значень змінних, значень регістрів загального призначення, регістра прапорців та апаратних ресурсів процесора під час покомандного виконання програми;

зміна значень змінних, регістрів загального призначення та

прапорців регістра прапорців під час покомандного виконання програми.

Але Turbo Debugger не дозволяє змінити код програми, тому для програми, в яку внесено зміни, необхідно знову виконати трансляцію і редагування зв’язків.

Налагодження програми за допомогою Turbo Debugger можна здійснити за таких умов:

12

у початковій програмі повинна бути обов’язково визначена мітка точки входу, з якої починається виконання програми. Ім’я цієї мітки необхідно вказати як операнд директиви END;

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

tasm /zi ім'я_початкового_модуля;

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

завантаження програми налагодження виконати за допомогою командного рядка:

td ім'я _завантажувального_модуля.

Після завантаження Turbo Debugger відкривається вікно Module, в якому можна бачити початковий текст програми. З’явиться курсор виконання у вигляді трикутника, що вказує на команду, яка виконуватиметься. Спочатку − це точка входу в програму (тобто це команда, мітка якої вказана в директиві END). Основну частину екрана займають кілька вікон, причому активним може бути тільки одне з них. Керування роботою вікон Turbo Debugger здійснює за допомогою системи меню або гарячих клавіш. Є два типи таких меню:

глобальне меню − знаходиться у верхній частині екрана і доступне постійно; виклик цього меню здійснюється за допомогою клавіші F10. В подальшому вибирається потрібний пункт або підпункт меню;

локальне меню − для кожного вікна налагоджувача можна викликати його власне меню, що враховує особливості цього

вікна. Викликати дане меню можна, клацнувши у відповідному вікні правою кнопкою миші.

Налагодження програми здійснюється в таких режимах:

режим безумовного виконання всієї програми;

трасування та покрокове виконання;

виконання до поточного положення курсора або до

встановленої точки переривання.

Опишемо можливості та доцільність застосування цих режимів.

13

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

2.Трасування та покрокове виконання служить для детального вивчення поводження програми для вивчення дії кожної команди. Трасування (за один крок виконується одна машинна команда) здійснюється за допомогою клавіші F7. Покрокове виконання (за один крок виконується одна машинна команда або підпрограма, яка викликається командою асемблера CALL) здійснюється за допомогою клавіші F8. Результати виконання кожної команди можна переглянути у вікні CPU (процесор), яке можна викликати з глобального меню (пункт View\CPU). Це вікно складається з п’яти підвікон:

підвікно з початковою програмою у вигляді набору машинних команд;

підвікно регістрів процесора з їхніми поточними станами;

підвікно регістра прапорців з поточними станами прапорців;

підвікно стека, що відображає вміст пам’яті стека. Адреса стека визначається вмістом регістрів SS і SP.

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

3.Режим виконання до поточного положення курсора дозволяє виконувати програми до вказаного місця програми. Цей режим доцільно використовувати у випадку, якщо інтересує правильність роботи деякої ділянки програми. Для завантаження цього режиму необхідно встановити курсор на потрібний рядок програми і натиснути клавішу F4. Програма почне виконання і зупиниться на позначеній команді, не виконавши її.

4.Виконання зі встановленням точок переривання дозволяє виконати програму з зупинкою у визначеній заздалегідь точці (breakpoint) або визначених точках. Для установки точки переривання в потрібному місці необхідно натиснути клавішу F2, після чого обраний рядок буде позначений іншим кольором. Для вилучення точки переривання в обраному рядку потрібно також натиснути F2. Завантаження на виконання програми з точками переривання здійснюється клавішею F9. Зупинка відбувається на першій точці. Переглянувши результати виконання програми для продовження обчислювального процесу потрібно натиснути клавішу F9. Можна перервати виконання програми в будь-якому місці, натиснувши одночасно дві клавіші – Ctrl та F2 (Ctrl+F2).

14

Приклад завантаження.

C:\Tasm> td.exe Begin1.exe.

Розвязування задач за тематикою заняття

Задача 1. Використовуючи директиву ASSUME, пов’язати сегментні регістри із сегментами так: регістр CS із сегментом Code, регістр DS із сегментом Data, регістр SS із сегментом Stk. Вказати, що регістр ES не використовується.

Розв’язування.

ASSUME CS:Сode, DS: Data, SS:Stk, ES:Nothing.

Задача 2. Написати фрагмент програми для ініціалізації сегментних регістрів DS та ES для використання із сегментами даних

Code та DataExt відповідно.

Розв’язування.

mov AX,Code mov DS,AX mov AX,DataExt mov DS,AX.

Задача 3. Визначити, який з наведених наборів символів не є ідентифікатором мови асемблера:

.abc $abc1 _abc3 abc.a @abc @abc@a ?abc@.

Розв’язування.

Не відповідає поняттю ідентифікатора мови асемблера набір символів .abc. Знак “крапка” (.) в записові ідентифікатора дозволяється використовувати тільки як перший символ набору символів.

Завдання для самостійної роботи

I. Розробити фрагмент програми для використання сегментних регістрів, застосовуючи директиву ASSUME:

1)CS, DS − Сode, SS − Stack, ES − не використовувати ;

2)CS, DS, SS − Сode, ES − не використовувати ;

3)CS, DS, SS, ES − Сode ;

4)CS − Сode, DS − Data, SS − Stack, ES − Data ;

5)CS − Сode, DS − Data, SS − Stack, ES − DataExt.

II. Розробити фрагмент програми для ініціалізації сегментних регістрів DS та ES для використання із сегментами даних відповідно

1)Data та DataExt;

15

2)Сode та Data;

3)Data та Сode;

4)MyData та DataExt;

5)Data та MyData.

III. Визначити, який з наведених наборів символів не є ідентифікатором мови асемблера:

1)

.abc

$abc1

3abc

abc@a

@ab12c;

2)

aAbc

$B1B1 aB%b

abc@a

@abc;

3)

a77ew $B2Ba aB..b

abc

@43ab;

4)

4Ah

___B

a__B

@64@ @64avc;

5)

aAbc

_B*B

a4B

aor

?ab5.

IV.

Використовуючи текстовий редактор, програму, наведену в

прикладі 1, зберегти у файлі begin1.asm.

V.

Виконати трансляцію програми (файл begin1.asm), створивши

об’єктний файл і файл

лістингу. З файла лістингу виписати

об’єктний код програми в шістнадцятковій системі числення.

VI.

Виконати редагування зв’язків для одержаного об’єктного

файла (створити завантажувальний модуль).

VII.

Виконати налагодження одержаної програми за допомогою

налагоджувача (td.exe).

 

 

16

Лабораторна робота № 2

Директиви визначення даних. Команди MOV, ADD, SUB,

ADC, SBB, INC, DEC, NEG, CMP.

Мета: вивчення засобів визначення даних та способів резервування полів пам’яті для них. Ознайомлення з командами обробки двійкових даних. Розробка програм обчислення простих арифметичних виразів.

План заняття.

1.Директиви опису і визначення даних.

2.Сталі. Директиви визначення сталих EQU та =.

3.Зображення цілих чисел в оперативній памяті компютера.

4.Команда пересилки даних MOV.

5.Команди додавання та віднімання.

6.Обчислення цілих арифметичних виразів.

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

1. Директиви опису і визначення даних

Загальна структура директив опису і визначення даних така:

[ імя ] Dn вираз [ ,вираз] …,

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

Dn – визначає розмір елементів даних у байтах: DB − байт, DW − слово, DD − подвійне слово, DP − 6 байтів, DF − 6 байтів, DQ − 8 байтів, DT − 10 байтів;

вираз задає початкове значення елементів; вираз − це: ? або стала, або ім’я, або конструкція: n DUP (вираз), де n − кількість повторення значення вираз.

Наведемо приклади.

mas dw 10 dup(10); Опис одновимірного масиву (вектора) розмірності 10, кожний елемент якого займає два байти і в кожне поле записується число 10.

vec dd 20 dup (15); Опис одновимірного масиву (вектора) розмірності 20, кожний елемент якого займає чотири байти і в кожне поле записується число 15.

matr

dw 10 dup ( 10 dup (?)); Опис двовимірного масиву

(матриці), кожний елемент якої невизначений і займає два байти.

tenzr

dw 5 dup( 5 dup (5 dup(?))); Опис тривимірного масиву.

 

17

2. Сталі. Директиви визначення сталих EQU та =

Числові сталі можуть записуватися в десятковій, двійковій, шістнадцядковій, вісімковій системах числення та у форматі з плаваючою крапкою.

Десяткові сталі – це набір цифр від 0 до 9, який необов’язково закінчується буквою D.

Шістнадцяткові сталі – це набір десяткових цифр від 0 до 9 та букв A, B, C, D, E, F або а, b, c, d, e, f, який закінчується символом h. Якщо цей набір починається малою або великою буквою, то перед набором обов’язково записується цифра 0.

Двійкові сталі – це набір двійкових цифр 0 і 1, який закінчується символом b.

Вісімкові сталі – це набір цифр 0, 1, 2, 3, 4, 5, 6, 7, який закінчується символом q.

Сталі з плаваючою крапкою – це набір десяткових цифр від 0 до 9, між якими може бути символ крапка, що відокремлює цілу та дробову частини. Цей набір може закінчуватися символом е або Е, за яким можуть бути символи + або – і десяткові цифри, які визначають порядок сталої.

Символьні сталі – це набір ASCII символів, який знаходиться між двома одинарними або подвійними апострофами.

Наприклад, ‘Комп’’ютерна графіка’, “Комп’ютер”. Тут бачимо, що символ апостроф у сталій між двома апострофами зображається двома апострофами, записаними поряд.

Наведемо приклади опису і визначення змінних

a

db 21

 

b

dw ?

 

c

db 21,21d,21o,21h,?,?,101100b

st

db ‘ I am string’,’$’

 

mas

db 10 dup (?), 15 dup ( 20, 20 dup(1))

v1 dt 1.672.

Директиви EQU і = використовуються для присвоєння деякому виразу ідентифікатора. Цей ідентифікатор після цього можна використовувати всюди, де це буде потрібно для підстановок у командах асемблера та директивах опису і визначення даних.

Приклад застосування директив EQU і =.

D10

equ

10

H10

=

10h

mas

db H10 dup ( ?, D10 ), D10 dup( H10)

18

3. Зображення цілих чисел в оперативній памяті компютера

Елемент даних у пам’яті, як правило, займає декілька байтів. При програмуванні мовою асемблера важливо знати, як елементи даних зображуються в пам’яті. Система машинних команд підтримує числа розміром у байт, слово, подвійне слово або почетверенне слово (8 байтів). Цілі числа можуть зображуватися як цілі числа без знака і цілі числа зі знаком. Числа зі знаком використовуються для зображення додатних та від’ємних чисел, а беззнакові – тільки додатних чисел. У зображенні беззнакового числа всі біти інформаційні (рис.1), а в зображенні знакового − старший біт відводиться для знака (рис. 2). Вважається, що біт 0 – молодший і є крайнім справа. Старший біт – 7, 15, 31 або 63, тобто це крайній зліва біт відповідно для елементів даних розміром байт, слово, подвійне слово або почетверенне слово. Для знакових чисел значення 0 старшого біта (біта знака) визначає додатне число, а значення 1 − визначає від’ємне число.

Інформаційне поле

31

30

29

28

4

3

2

1

0

Старший

 

 

 

Біти

 

 

 

Молодший

Рис. 1. Форма зображення 32-бітового беззнакового числа

Знак

 

 

 

Інформаційне поле

31

30

29

28

4

3

2

1

0

Старший

 

 

 

Біти

 

 

 

Молодший

Рис. 2. Форма зображення 32-бітового знакового числа

Без знакові цілі числа записуються в двійковій системі числення, займаючи всі розряди (біти) поля даних. Наприклад, десяткове число 91, яке в двійковій системі числення має зображення 1011011b, записується в байт (рис. 3), в слово (рис. 4), в подвійне слово (рис. 5).

Біти

7

6

 

5

4

3

2

 

1

0

Число

0

1

 

0

1

1

0

 

1

1

 

 

 

5

 

 

 

В

 

Рис. 3. Форма зображення восьмибітового беззнакового числа 91

Біти

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Число

0

0

0

0

0

0

0

0

0

1

0

1

1

0

1

1

Рис. 4. Форма зображення шістнадцятибітового беззнакового числа 91

19

Біти

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

Число

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

Біти

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Число

0

0

0

0

0

0

0

0

0

1

0

1

1

0

1

1

Рис. 5. Форма зображення тридцятидвобітового беззнакового числа 91

Знакові цілі числа зображуються в двійковій системі числення, займаючи молодші розряди поля даних, найстарший біт вважається знаковим і для додатних чисел дорівнює 0. Від’ємні цілі числа зображуються в доповняльному коді. Алгоритм перетворення від’ємного числа в доповняльний код такий:

1)знаходимо модуль від’ємного числа і переводимо його в двійкову систему;

2)здійснюємо двійкову порозрядну (побітову) інверсію (тобто замість нуля записуємо одиницю, а замість одиниці – нуль);

3)до одержаного числа в наймолодший розряд додаємо одиницю.

Приклад. Десяткове число -91 (мінус 91).

1)Модуль числа 91, яке в двійковій системі числення має зображення 1011011, записується в байт (див. рис. 3);

2)Здійснюємо інверсію. Для даних розміром байт рис. 7 (у шістнадцятковій формі – А4h), для даних розміром слово – рис. 8 (у шістнадцятковій формі – FFА4h), а для даних розміром подвійне слово – рис. 9 (у шістнадцятковій формі –

FFFFFFА4h).

 

 

 

 

 

Біти

 

 

 

7

 

6

5

4

3

2

1

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Число

 

 

1

 

0

1

0

0

1

0

 

0

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 7. Форма зображення 8-бітової інверсії числа 91

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Біти

 

15

14

13

12

11

10

9

8

7

 

6

 

 

5

 

4

3

2

1

0

 

Число

 

 

1

1

 

1

 

1

1

 

1

1

1

1

 

0

 

1

 

0

 

0

1

0

0

 

Рис. 8. Форма зображення 16-бітової інверсії числа 91

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Біти

 

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

Число

 

1

1

 

 

1

 

1

 

1

 

1

1

 

1

 

1

 

 

1

 

 

1

 

1

 

1

 

1

 

1

 

1

 

Біти

 

15

14

13

12

11

10

9

 

8

 

7

 

 

6

 

 

5

 

4

 

3

 

2

 

1

 

0

 

Число

 

1

1

 

 

1

 

1

 

1

 

1

1

 

1

 

1

 

 

0

 

 

1

 

 

0

 

0

 

1

 

0

 

0

 

Рис. 9. Форма зображення 32-бітової інверсії числа 91

 

 

 

20

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