Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR_4N.DOC
Скачиваний:
1
Добавлен:
27.08.2019
Размер:
64 Кб
Скачать

Лабораторна робота №4.

Тема: Налагоджування програм з допомогою Turbo Debugger.

Мета роботи: Освоєння налагодження виконуваних .ЕХЕ-програм з допомогою Turbo Debugger.

  1. Короткі теоретичні відомості

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 є сегментний регістр, то другим операндом повинен бути регістр загального призначення або комірка пам'яті. Завантажити константу в сегментний регістр чи скопіювати значення одного сегментного регістра в інший безпосередньо неможливо.

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