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, які можна було використовувати в попередніх варіантах.
