Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекцii_ALL.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
3.55 Mб
Скачать

9.5. Непряма регістрова адресація

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

Щоб зрозуміти чому може бути корисним використання різних слів при кожнім виконанні команди уявимо собі цикл, який проходить по 1024 – елементному одномірному масиві цілих чисел для обрахунку суми елементів в регістрі R1. Поза цим циклом який-небуть інший регістр, наприклад R2, може вказувати перший елемент масиву, а ще один регістр, наприклад R3, може вказувати першу адресу після масиву. Масив містить 1024 цілих числа по 4 байта кожне. Якщо масив починається з А, то перша адреса після масиву буде А+4096. Типова програма асемблера, яка виконує цей обрахунок для двохадресної машини показана на лістингу 9.1.

Лістинг 9.1 - Програма на асемблері для обрахунку суми елементів масиву.

MOV R1,#0 ;накопичення суми в R1, на початку 0

MOV R2,#A ;R2= адреса масиву А

MOV R3,#A+4096 ;R3= адреса першого слова після А

LOOP: ADD R1,(R2) ;отримання операнда через регістр R2

ADD R2,#4 ; збільшення R2 на одне слово (4 байта)

CMP R2,R3 ; перевірка на завершення

BLT LOOP ; якщо R2<R3, продовжити цикл

В цій маленькій програмі ми використали декілька способів адресації. Перші три команди використовують регістрову адресацію для першого операнда (пункт призначення) і непряму адресацію для другого операнда (константа, позначена символом #). Друга команда поміщає в R2 не дані, що знаходяться в А, а адресу А. Саме це і повідомляє асемблеру знак #. Потім третя команда поміщає в R3 перше слово після масиву.

Цікаво зазначити, що саме тіло циклу не містить ніяких адресів пам’яті. В четвертій команді використовується регістрова і непряма адресації. В п’ятій команді використовується регістрова і непряма адресації, а в шостій – два рази регістрова. Команда BLT могла би використовувати адрес пам’яті, але більш привабливим є визначення адреси з допомогою 8-бітного зміщення, зв’язаного з самою командою BLT. Таким чином, повністю уникнувши адреси пам’яті, ми отримали короткий і швидкий цикл.

Теоретично є ще один спосіб виконання цього обчислення без використання непрямої регістрової адресації. Цей цикл міг би містити команду для при бавлення А до регістру R1, наприклад

ADD R1,A

Тоді при кожному кроці команда повинна збільшуватися на 4. Таким чином, після одного кроку команда буде виглядати наступним чином:

ADD R1,A+4

і так далі до завершення циклу.

Програма, яка сама змінюється подібним чином, називається програмою, яка змінюється. Ця ідея була запропоноване Джоном фон Непманом і використовувалася в старих комп’ютерах, де не було непрямої регістрової адресації. В наш час програми, які, змінюються вважаються незручними і дуже важкими для розуміння. Крім цього, їх виконання не можна розділити між декількома процесорами. Вони навіть не можуть правильно виконуватися на машинах з розділеною кеш-пам’ятю першого рівня, якщо в кеш-пам’яті команд немає спеціальної схеми для опрацьованого запису.

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