Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник по Микропроцессорам_МИА.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.67 Mб
Скачать

2.3. Выбор операнда

Команда может не использовать операнды, использовать один или более операндов. Примером безоперандной команды может служить команда NOP (нет операций). Операнд может находиться [32-34]:

-в команде;

-в регистре (32-битные операнды в регистрах EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP; 16-битные операнды в регистрах AX, BX, CX, DX, SI, DI SP или BP; 8-битные операнды в регистрах AH, AL, BH, BL, CH,CL, DH или DL; в сегментных регистрах, в регистре флагов).

Для большинства команд один из двух явно адресуемых операндов является операндом-источником или операндом-приемником и может находиться в регистре или памяти. Другой операнд должен быть в регистре или указан непосредственно в команде. Имеются следующие типы двухоперандных команд:

-регистр- регистр;

-регистр- память;

-память-регистр;

-непосредственный операнд-регистр;

-непосредственный операнд-память.

2.4. Режимы адресации

Неявная адресация. Операнд адресует неявно, если в команде нет специальных полей его определения, т.е. операнд задается кодом операции.

Примерами команд с неявной адресацией могут служить:

AAA – скорректировать регистр AL после сложения;

CMC – инвертировать флажок переноса;

STD – установить в 1флажок направления.

Регистровая адресация. В командах с таким режимом адресации операнд(ы) находится во внутреннем регистре процессора [33, 34]. Регистровые операнды в ассемблерных командах указываются именами регистров в поле операнда. Наиболее часто в командах манипуляций данными участвуют 8/16/32-битные РОН. Привлекаемые в командах регистры определяются полями reg и mod r/m (при mod=11B). В сокращенных формах команд регистры могут указываться в поле операции, особенно это относится к регистрам-аккумуляторам EAX/AX/AL. Сегментные регистры в командах загрузки и сохранения идентифицируются полями sreg2 или sreg3, занимающими место поля reg в байте mod r/m.

Примеры команд с регистровой адресацией:

INC ESI – инкремент регистра ESI;

SUB ECX,ECX – сбросить регистр ECX;

MOV EAX,CR0 – передать в EAX содержимое CR0;

ADD AL,DL – прибавить к AL содержимое регистра DL;

MOVSX EAX,DH – переслать со знаковым расширением.

Непосредственная адресация. В этом режиме операнд находится в самой команде, т.е. хранится в месте с командой в сегментном коде. Из-за этого изменить непосредственный операнд невозможно, им может быть только константа как операнд-источник. Допускаются непосредственные операнды длиной 8, 16 и 32 бита; они всегда находятся в конце команды. Использование непосредственных операндов обычно определяется неявно, а байт mod r/m задает получатель.

Примеры команд с непосредственной адресацией:

MOV EAX,0f0f0f0f0h - загрузить константу в EAX;

AND AL,0fh – выделить младшую тетраду регистра AL;

BT EDI,3 – передать в CF бит 3 регистра EDI.

Адресация ввода-вывода. Процессоры 80х86 могут обращаться к устройствам ввода-вывода двумя способами. Они могут быть отображены на память или иметь свои адреса в пространстве ввода-вывода. Процессор поддерживает 64К адресов ввода-вывода, обычно называемых портами ввода-вывода.

В командах ввода-вывода источником или приемником всегда служит аккумулятор EAX/AX/AL, а порт определяется как непосредственный операнд (фиксированный порт) или содержимое регистра DX (переменный порт).

Примеры команд ввода-вывода:

IN AL,40h –ввод байта из фиксированного порта;

IN AX,40h - ввод слова из фиксированного порта;

IN EAX,40h- ввод двойного слова из фиксированного порта;

OUT 20h,AL- вывод байта в фиксированный порт;

OUT 20h,AX- вывод слова в фиксированный порт;

OUT 20h,EAX- вывод двойного слова в фиксированный порт;

IN AL,DX - ввод байта из переменного порта (адрес порта содержится в регистре DX);

IN AX,DX- ввод слова из переменного порта;

IN EAX,DX- ввод двойного слова из переменного порта;

OUT DX,AL- вывод байта в переменный порт (адрес порта содержится в регистре DX);

OUT DX,AX- вывод слова в переменный порт;

OUT DX,EAX- вывод двойного слова в переменный порт.

Адресация операндов в памяти. Напомним, что эффективный адрес задает смещение (расстояние) от начала соответствующего сегмента. Адрес 0 есть адрес первого байта в сегменте, адрес 1-второго байта и т.д., независимо от физического начального или базового сегмента. В большинстве команд манипуляции данными по умолчанию привлекается сегмент, адресуемый регистром DS, но с помощью префикса замены сегмента можно обращаться к любому другому сегменту.

Прямая адресация. Это простейший режим адресации (он называется также абсолютной адресацией), т.к. эффективный адрес содержится в самой команде. Местонахождение операнда задается смещением в текущем сегменте, которое следует считать константой. Численное значение адреса в ассемблерных командах заключается в квадратные скобки.

Примеры команд с прямой адресацией:

MOV AL, [20h]-передать байт в регистр AL;

SHL WORD PTR [A5h],5 – сдвинуть слово на пять бит влево;

INC DWORD PTR[12345h] – инкремент двойного слова в памяти.

Отметим, что во второй и третьей командах применяется спецификатор длины операнда, т.к. без него невозможно определить, с какими данными должна работать команда.