Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичні вказівки до лабораторних робіт.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
464 Кб
Скачать
☆

2.2. Адресні змінні

Тепер уточнимо, як асемблер обробляє опис змінних, як початкові значення яких зазначені адресні вираження. Такі змінні описуються за допомогою директив DW і DD. У нашому прикладі як початкове значення змінних В1 і В2 зазначене ім'я змінної А2, тобто адреса цієї змінної. Але яка адреса - абсолютна або відносна тут мається на увазі? Правила тут такі: якщо або змінної або мітки (або адресне вираження, що містить таке ім'я або мітку) зазначено як операнд директиви DW, те асемблер заміняє ім'я на його зсув, але якщо ім'я зазначене в директиві DD, тоді асемблер заміняє його на адресну пару, що складається з номера сегмента, де описане це ім'я, і зі зсуву імені усередині даного сегмента (ця адресна пара визначає абсолютну адресу імені):

Bl dw а2 еквівалентно Bl dw offset а2 в2 dd а2 еквівалентно в2 dd вод а2 : offset a2

Таким чином, хоча в директиві DD ми вказуємо тільки ім'я й не вказуємо ніякого сегмента, асемблер сам визначає цей сегмент і приєднує його до зсуву. При цьому, у силу "переверненого" подання подвійних слів у пам'яті ПК, частина seg цієї пари виявляється в другому слові даного подвійного слова, а частина offset - у першому слові (В2: offset, B2+2: seg).

Відзначимо також, що в директиві DD як операнд можна вказати адресну пару наступного виду:

<ім'я сегмента>:<адресне вираження> Наприклад:

DD А:В2

У цьому випадку асемблер заміняє ім'я сегмента на його номер, а от ім'я змінної заміняє на його зсув, але відлічене не від початку того сегмента, де воно описано, а від початку зазначеного сегмента. Наприклад, у нашій директиві ім'я А буде замінене на l000h, а ім'я В2 - на 412h, тому що абсолютна адреса змінної В дорівнює 10412h, а абсолютна адреса початку сегмента А дорівнює l0000h: 10412h-10000h=412h. І хоча подібні операнди припустимі, ними треба користуватися обережно, тому що відстань від початку сегмента А до змінної В2 з іншого сегмента може бути занадто більшим і перевершити максимально припустиму величину (64 Кб) для зсувів. Крім того при трансляції програми можлива перестановка її сегментів, і може трапитися так, що сегмент А виявиться розташованим у пам'яті після сегмента В, де описана змінна В2, і тоді зсув вийде негативним, що, звичайно, неприпустимо.

Індивідуальні завдання:

Скласти повну програму на мові Асемблера.

1 f=(2x +3y)/4z+5x;

2 f=(8x +9y)/(3z+1);

3 f=(18x+9y-5)/3z+2;

4 f=(4y+2)/(7-4z)+x;

5 f=z/(7y-x)(3-6x);

6 f=x+y+3z/5-4;

7 f=(5z-4x)/(y-8);

8 f=(x+7)/(zy-1);

9 f=(y-7x-2z)/(6y+1);

10 f=(5-z)/(x-3y);

11 f=(77y-8)/(x+6);

12 f=(6z-4y)/(3x-8);

13 f=(12z-5y)/(3x+2)-5z;

14 f=(4x+5y-12z)/(2z-5);

15 f=(3x-2y+1)/(10z-1);

16 f=(5z-4x)/(y+2x);

17 f=(5x+7)/(zy+1);

18 f=(y+7x-2z)/(y+1);

19 f=(5+3z)/(x+3y-1);

20 f=(2x+3y-z)/(4z+5x);

21 f=(8x+2y+z)/(3z+2);

22 f=(18x+9y)/(3z+x+2);

23 f=(4y+2)/(7-4z)+x;

24 f=z(7y-x)/(3-6x)-1;