Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Режими адресації пам’яті




Ініціалізація рядків символів

Ініціалізація масивів

Ініціалізовані дані

Виділення даних

Тепер, коли відомо, як створювати сегменти, роздивимось, як можна заповнювати ці сегменти усвідомленими даними. Сегмент стеку проблему не являє: там знаходиться стек, а до стеку ви можете звертатися за допомогою інструкцій PUSH та POP та адресуватися через регістр ВР. Сегмент коду заповнюється інструкціями які генеруються згідно з мнемонікою інструкцій вашої програми, тому проблеми тут також немає. Залишається сегмент даних. У Турбо Асемблері передбачена множина способів визначення змінних у сегменті даних, як ініціалізуємих деяким значенням, так і неініціалізованих. Щоб зрозуміти які данні дозволяє вам визначити Турбо Асемблер, ми повинні спочатку трохи розповісти вам про головні типи даних Асемблеру.

Тепер ми готові до того, щоб роздивитися способи, за допомогою яких в Турбо Асемблері можна визначити змінні. Давайте спочатку роздивимось визначення ініціалізованих даних.

Директиви визначення даних DB, DW, DD, DF, DP, DQ та DT дозволяють нам визначити змінні у пам’яті різного розміру:

 

DB 1 байт

DW 2 байта=1 слово

DD 4 байта=1 подвійне слово

DF, DP 6 байт=1 показник дальнього типу (386)

DQ 8 байт=одне четвертне слово

DT 10 байт

 

Наприклад

 

ByteVar DB ‘Z’; 1 байт

WordVar DW 101b; 2 байта (1 слово)

DwordVar DD 2BFh; 4 байта (1 подвійне слово)

QwordVar DQ 307o;8 байт (одне четвертне слово)

TwordVar DT 100; 10 байт

В одній директиві визначення даних може вказуватися декілька значень. Наприклад директива:

 

SampleArray DW 0, 1, 2, 3, 4

DD 25, 36, 49, 64, 81

DD 100, 121, 144, 169, 196

 

створює масив з ім’ям SampleArray, елементи якого мають розмір в слово. В директивах визначення даних можна використовувати будь-яке число значень.

Турбо Асемблер дозволяє вам визначити блок пам’яті, ініціалізованої вказаним значенням, за допомогою операції DUP. Наприклад:

 

BlankArray DW 100h DUP (0)

 

Тут створюється масив BlankArray, який складається з 255 (десят.) слів, ініціалізованих значенням 0. Аналогічно директива:

 

ArrayofA DB 92 DUP (‘A’)

 

створює масив з 92 байт, кожний з яких ініціалізований символом А.

Роздивимось тепер створення рядків символів. Символи являють собою допустимі операнди директив визначення даних, тому рядок символів можна визначити наступним чином:

 

String DB ‘A’, ‘B’, ‘C’, ‘D’

 

В Турбо Асемблері в цьому випадку передбачена також зручна скорочена форма:

 

String DB ‘ABCD”

Як при використанні операнда у пам’яті задати ту чарунку пам’яті з якою ви бажаєте працювати? Очевидна відповідь полягає в тому, щоб привласнити потрібній змінній у пам’яті ім’я, як ми це робили у останньому розділі. За допомогою, наприклад, наступних операторів ви можете вирахувати змінну пам’яті Debts (борги) зі змінної пам’яті Assets (майно):

 

Assets DW?

Debts DW?

..

mov ax,[Debts]

sub [Assets],ax

 

В дійсності мова Асемблера забезпечує декілька різних способів адресації до рядків символів, масивів та буферів даних.

Найбільш простіший спосіб полягає в тому, щоб зчитати дев’ятий по рахунку символ строки CharString:

 

CharString DB ‘ABCDEFGHIJKLM’

.

.

mov ax,@Data

mov ds,ax

mov al,[CharString+8]

 

В даному випадку це теж саме, що:

 

mov al,[100+8]

 

так як CharString починається зі зміщенням 100. Все, що замкнено у квадратні дужки, інтерпретується Турбо Асемблером, як адреса, тому зміщення Charstring та 8 складаються та використовується в якості адреси пам’яті. Інструкція приймає вигляд:

 

mov al,[108]

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

Розглянемо наступний фрагмент програми, де у регістр AL також завантажується дев’ятий символ CharString:

 

mov bx, OFFSET CharString+8

mov al,[bx]

 

У даному прикладі для посилання на дев’ятий символ використовується регістр bx. Перша інструкція завантажує у регістр bx зміщення CharString (згадайте про те, що операція OFFSET повертає зміщення мітки у пам’яті), плюс 8. (Обчислення OFFSET та складання для цього виразу виконується Турбо Асемблером підчас асемблювання.) Друга інструкція визначає, що AL потрібно скласти зі змістом по зміщенню в пам’яті, на яке вказує регістр BX

 

mov AL,[108]

 

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

 

mov ax,[bx]; завантажити AX з чарунки пам’яті,

; на яку вказує BX

та

mov ax,bx; завантажити у AX зміст

; регістра BX

 

це дві цілком різні інструкції.

BX – це не єдиний регістр, котрий можна використовувати для посилання на пам’ять. Допускається також використовувати разом з необов’язковим значенням-константою або міткою регістри BP, SI та DI. Загальний вигляд операндів у пам’яті виглядає наступним чином:

[базовий регістр + індексний регістр + зміщення],

 

де базовий регістр – це BX, індексний регістр – це SI чи DI, а зміщення – будь-яка 16-бітова константа, включно мітки та вирази. Кожний раз, коли виконується інструкція, яка використовує операнд в пам’яті, процесором 8086 ці три компоненти складаються. Кожна з трьох частин операнда у пам’яті є необов’язковою, хоча (це очевидно) ви повинні використовувати один з трьох елементів, інакше ви не отримаєте адресу у пам’яті. Ось як елементи операнда у пам’яті виглядають у іншому форматі:

 

BX SI

чи+ чи +Зміщення

BP DI

(база) (індекс)

 

Існують 16 способів завдання адреси у пам’яті:

 

[зміщення] [bp+зміщення]

[bx] [bx+зміщення]

[si] [si+зміщення]

[di] [di+зміщення]

[bx+si] [bx+si+зміщення]

[bx+di] [bx+di+зміщення]

[bp+si] [bp+si+зміщення]

[bp+di] [bp+di+зміщення]

 

Де зміщення – це те що можна привести до 16-бітового постійного значення.

 

Може здаватися, що 16 режимів адресації – це дуже багато, але якщо ще раз подивитесь на цей список, то побачите, що усі режими адресації отримують всього з декількох елементів, які комбінуються різними шляхами. Ось ще декілька способів, за допомогою яких можна, використовуючи різні режими адресації, завантажити дев’ятий символ рядка CharString у регістр AL.

 

 

CharString DB ‘ABCDEFGHIJKLM’,0

mov ax,@Data

mov ds,ax

mov si,OFFSET CharString+8

mov al,[si]

 

mov bx,8

mov al,[CharString+bx]

 

mov bx,OFFSET CharString

mov al,[bx+8]

 

mov si,8

mov al,[CharString+si]

 

mov bx,OFFSET CharString

mov di,8

mov al,[bx+di]

 

mov si, OFFSET CharString

mov bx,8

mov al,[si+bx]

 

mov bx,OFFSET CharString

mov si,7

mov al,[bx+si+1]

 

mov bx,3

mov si,5

mov al,[bx+CharString+si]

 

Усі ці інструкції посилаються на одну й ту ж чарунку пам’яті [CharString]+8.

 

У даному прикладі можна знайти декілька цікавих моментів. По-перше, повинні розуміти, що знак плюс (+), який використовується всередині квадратних дужок, має спеціальне значення.




Поделиться с друзьями:


Дата добавления: 2015-04-25; Просмотров: 519; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.