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

3.4. Непряма адресація

За аналогією з реєстровими й безпосередніми операндами адреса операнда в пам'яті також можна не вказувати безпосередньо, а зберігати в будь-якому регістрі. До 80386 для цього можна було використовувати тільки BX, SI, DI і BP, але потім ці обмеження були зняті й адреса операнда дозволили зчитувати також і з EAX, EBX, ECX, EDX, ESI, EDI, EBP і ESP (але не з AX, CX, DX або SP прямо — треба використовувати EAX, ECX, EDX, ESP відповідно або попередньо скопіювати зсув в BX, SI, DI або BP). Наприклад команда, що випливає, поміщає в регістр AX слово з комірки пам'яті, селектор сегмента якої перебуває в DS, а зсув — в BX:

mov ax,[bx]

Як і у випадку прямої адресації, DS використовується за замовчуванням, але не у всіх випадках: якщо зсув беруть із регістрів ESP, EBP або BP, те в якості сегментного регістру використовується SS. У реальному режимі можна вільно користуватися всіма 32-бітними регістрами, треба тільки стежити, щоб їх уміст не перевищував границь 16-бітного слова.

3.5. Адресація по базі зі зрушенням

Тепер скомбінуємо два попередні методи адресації: наступна команда

mov ax,[bx+2]

поміщає в регістр AX слово, що перебуває в сегменті, зазначеному в DS, зі зсувом на 2 більшим, ніж число, що перебуває в BX. Тому що слово займає рівно два байти, ця команда помістила в AX слово, що безпосередньо випливає за тим, яке є в попередньому прикладі. Така форма адресації використовується в тих випадках, коли в регістрі перебуває адреса початку структури даних, а доступ треба здійснити до якого-небудь елемента цієї структури. Інше важливе застосування адресації по базі зі зрушенням — доступ з підпрограми до параметрів, переданих у стеці, використовуючи регістр BP (EBP) у якості бази й номер параметра як зсуву, що детально розібрано в параграфі 5.2. Інші припустимі форми запису цього способу адресації:

mov ax,[bp]+2

mov ax,2[bp]

До 80386 у якості базового регістру можна було використовувати тільки BX, BP, SI або DI і зрушення могло бути тільки байтом або словом (зі знаком). Починаючи з 80386 і старше, процесори Intel дозволяють додатково використовувати EAX, EBX, ECX, EDX, EBP, ESP, ESI і EDI, так само як і для звичайної непрямої адресації. За допомогою цього методу можна організовувати доступ до одномірних масивів байт: зсув відповідає адресі початку масиву, а число в регістрі — індексу елемента масиву, який треба вважати. Очевидно, що, якщо масив полягає не з байт, а зі слів, прийде множити базовий регістр на два, а якщо з подвійних слів — на чотири. Для цього передбачений наступний спеціальний метод адресації.

3.6. Непряма адресація з масштабуванням

Цей метод адресації повністю ідентичний попередньому, за винятком того, що з його допомогою можна прочитати елемент масиву слів, подвійних слів або учетверенных слів, просто помістивши номер елемента в регістр:

mov ax,[esi*2]+2

Множник, який може бути рівний 1, 2, 4 або 8, відповідає розміру елемента масиву — байту, слову, подвійному слову, учетверенному слову відповідно. З регістрів у цьому варіанті адресації можна використовувати тільки EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, але не SI, DI, BP або SP, які можна було використовувати в попередніх варіантах.

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