Лабораторна робота №4.
Тема: Налагоджування програм з допомогою Turbo Debugger.
Мета роботи: Освоєння налагодження виконуваних .ЕХЕ-програм з допомогою Turbo Debugger.
Короткі теоретичні відомості
1.1 Режими адресації.
Асемблер забезпечує декілька різних способів адресації до стрічок символів чи масивів. Найпростіший спосіб:
...
DATASEG
CharString DB 'ABCDEFGHIJKL',0
...
CODESEG
...
MOV AX, @data
MOV DS, AX
MOV AL, [CharString+8]
...
Все, що знаходиться в квадратних дужках інтерпретується Асемблером як адрес, тому інструкція приймає вигляд:
MOV AL, [108]
Такий тип адресації, коли комірка пам'яті задається її ім'ям плюс деяка константа, називається прямою (безпосередньою) адресацією.
Нехай потрібно знайти останній символ вищезгаданої стрічки (перед нулем). Це неможливо зробити з допомогою прямої адресації, оскільки стрічка може мати довільну довжину. Використовується регістр BX:
MOV BX, OFFSET CharString
LastChar:
MOV AL, [BX]
CMP AL, 0
JE FoundEnd
INC BX
JMP LastChar
FoundEnd:
DEC BX
MOV AL, [bx]
BX - це не єдиний регістр, який можна використовувати для зноски на пам'ять. Дозволяється також використовувати регістри BP, SI та DI. Загальний вигляд операндів:
[базовий регістр+індексний регістр+зміщення], де
базовий регістр - це BX або BP,
індексний регістр - SI або DI,
зміщення - будь-яка 16-бітна константа, в тому числі мітки та вирази. Кожна з трьох частин є не обов'язковою.
Існує 16 способів задання адреси пам'яті:
[зміщення] [bp+зміщення]
[bx] [bx+зміщення]
[si] [si+зміщення]
[di] [di+зміщення]
[bx+si] [bx+si+зміщення]
[bx+di] [bx+di+зміщення]
[bp+si] [bp+si+зміщення]
[bp+di] [bp+di+зміщення]
Можна використовувати також таку форму адресації:
MOV AL, CharString[BX]
або навіть
MOV AL, CharString[BX][SI]+1
Останній оператор еквівалентний оператору
MOV AL, [CharString+BX+SI+1]
1.2 Команди переміщення даних.
Дані в процесорі 8086 переміщуються за допомогою інструкції MOV. Приклад:
MOV AX, 0
MOV BX, 9
MOV AX, BX
Як операнд-джерело можна використовувати константу, вираз, при обчисленні якого отримується константа, загальний регістр або комірку пам'яті. Як операнд-приймач може використовуватись загальний регістр або комірка пам'яті. Копіювати можна байти або значення розміром в слово. Як Асемблер визначає розмір даних? В інструкціях
MOV AL, 1
MOV DX, SI
розмір даних очевидний. Аналогічно змінні в пам'яті мають заданий розмір. Однак інколи розмір даних не визначено. Наприклад:
MOV [BX], 1
Асемблер надає спосіб вказання розміру даних з допомогою операцій WORD PTR і BYTE PTR. Якщо використати ці операції разом із регістровим операндом, то вони ігноруються.
Дані операції можна використовувати для тимчасового вибору розміру даних для змінної пам'яті. Приклад:
DATASEG
Source1 DD 12345h
Source2 DD 54321h
Sum DD ?
CODESEG
MOV AX, WORD PTR [Source1]
MOV DX, WORD PTR [Source1+2]
ADD AX, WORD PTR [Source2]
ADC DX, WORD PTR [Source2+2]
MOV WORD PTR [Sum], AX
MOV WORD PTR [Sum+2], DX
Всі змінні, що використовуються в даному прикладі є подвійними словами. Але процесор 8086 не може виконувати додавання подвійних слів безпосередньо, тому таке додавання доводиться ділити на ряд операцій із словами.
Якщо одним із операндів інструкції MOV є сегментний регістр, то другим операндом повинен бути регістр загального призначення або комірка пам'яті. Завантажити константу в сегментний регістр чи скопіювати значення одного сегментного регістра в інший безпосередньо неможливо.