Способи адресування операндів МП фірми Intel
Регістрове адресування операндів
Найбільш швидко виконуваним є регістрове адресування, за якого обидва операнди знаходяться у регістрах, які вказуються у команді. Вміст регістра-джерела передається (копіюється) у регістр-приймач, який у команді вказується першим. Наприклад:
MOV AX,CX ; Копіювання 16-розрядного вмісту регістра CX в
; акумулятор AX
Вміст регістра-приймача завжди змінюється на вміст регістра-джерела, який не змінюється.
Безпосереднє адресування операндів
При безпосередньому адресуванні операнд-джерело вказується безпосередньо у команді у вигляді 8- або 16-розрядного даного. Операнд-приймач може бути регістром, або коміркою пам'яті, адресованою будь-яким способом, але не може бути числом. Наприклад:
MOV BL,11H ; 8-розрядне дане записується у регістр BL
При безпосередньому адресуванні знак константи поширюється до 8- або 16-розрядного регістра, а від'ємні числа записуються у регістр або комірку пам'яті у доповнювальному коді.
Припустимо, що до виконання команди
MOV CL,12H ; Завантаження у CL константи 12H
у регістрі CL було записане число FFH (11111111В). Після виконання цієї команди у регістр СL буде записано число 12H (00010010B).
Результатом виконання команди
MOV CН,-30 ; Завантаження у CН константи -30D
буде запис у регістр CН числа Е2Н (11100010В) – числа -30D у доповнювальному коді.
Покажемо на прикладі команди з безпосереднім адресуванням як розміщуються байти команди у сегменті кодів. При уведенні команди
MOV АХ,7000Н
наприклад, у сегмент кодів, який починається з адреси 7000Н (CS) та зміщення 0100Н три байти команди у машинних кодах будуть розміщені у трьох послідовних комірках пам’яті з адресами
Адреса | Машинні коди | ||
7000:0100 | В8 | ; Код операції “пересилати до АХ” | |
7000:0101 | ; Молодший байт | ||
7000:0102 | ; Старший байт операнда безпосередньо | ||
7000:0103 | ; Вільна комірка пам’яті для прийому коду ; операції наступної команди |
Запис команди у сегмент кодів можна також проілюструвати за допомогою фрагмента пам’яті (рис. 9.3):
Рисунок 9.3 – Розташування байтів команди MOV AX,7000Н у сегменті кодів
Таким чином, обсяг пам’яті, яку займає програма, є сумою байтів, займаних усіма командами цієї програми.
Пряме адресування
При прямому адресуванні ефективна адреса операнда у сегментах даних вказується прямо у команді і розміщується у квадратних дужках. Початкова адреса сегмента даних, яка заздалегідь має бути розміщена у відповідному сегментному регістрі даних DS або ES, участь у формуванні ефективної адреси не бере. На рис. 9.4 показано фрагмент сегмента даних, в якому у комірках пам’яті з ефективними адресами 0010Н та 0011Н зберігаються відповідно дані ВВН та ААН, а з адресами 0020Нта 0021Н – дані ССН та DDН.
ВВН | |
ААН | |
• | |
• | |
• | |
ССН | |
DDH | |
Рисунок 9.4 – Пряме адресування
Після виконання команди
MOV АL,[0010Н] ; Завантаження в АL даного з комірки пам'яті з адресою
; 0010Н
у регістр АL буде завантажене дане ВВН.
Після виконання команди
MOV АХ,[0010Н] ; Завантаження в АХ слова з комірок пам'яті з адресами
; 0010Н та 00011Н
у регістр АХ буде завантажено слово ААВВН відповідно до принципу зберігання у пам'яті слів – little endian.
Після виконання фрагмента програми
MOV АХ,[0010Н] ;
MOV [0020Н],АХ ; Завантаження комірок пам'яті з адресами 0020Н та
; 0021Н з акумулятора АХ
у комірках пам'яті з адресами 0020Н та 0021Н будуть записані нові дані: ВВН та ААН відповідно.