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

2.2.8. Адресация по базе с индексированием и масштабированием

Это самая полная схема адресации, в которую входят все случаи, рассмотренные ранее как частные. Полный адрес операнда можно записать как выражение, представленное на рис. 6.

Рис. 6. Полная форма адресации

Смещение может быть байтом или двойным словом. Если ESP или ЕВР используются в роли базового регистра, Селектор сегмента операнда берется по умолчанию из регистра SS, во всех остальных случаях - из DS.

2.3. Основные непривилегированные команды

В этом разделе описаны все непривилегированные команды процессоров Intel серии х86. Для каждой команды указана форма записи, название и модель процессоров Intel, начиная с которой она поддерживается.

2.3.1. Пересылка данных

Команда

Назначение

Процессор

MOV приемник, источник

Пересылка данных

8086

Базовая команда пересылки данных. Копирует содержимое источника в приемник, источник не изменяется. Команда MOV действует аналогично операторам присваивания из языков высокого уровня, то есть команда

эквивалентна выражению

языка Pascal или

языка С, за исключением того, что команда ассемблера позволяет работать не только с переменными в памяти, но и со всеми регистрами процессора.

В качестве источника для MOV могут использоваться: число (непосредственный операнд), регистр общего назначения, сегментный регистр или переменная (то есть операнд, находящийся в памяти); в качестве приемника: регистр общего назначения, сегментный регистр (кроме CS) или переменная. Оба операнда должны быть одного и того же размера - байт, слово или двойное слово.

Нельзя выполнять пересылку данных с помощью MOV из одной переменной в другую, из одного сегментного регистра в другой и нельзя помещать в сегментный регистр непосредственный операнд - эти операции выполняют двумя командами MOV (из сегментного регистра в обычный и уже из него в другой сегментный) или парой команд PUSH/POP.

Команда

Назначение

Процессор

CMOVcc приемник, источник

Условная пересылка данных

P6

Это набор команд, которые копируют содержимое источника в приемник, если удовлетворяется то или иное условие (см. табл. 5). Источником может быть регистр общего назначения или переменная, а приемником - только регистр. Требование, которое должно выполниться, - просто равенство нулю или единице тех или иных флагов из регистра FLAGS, но, если использовать команды CMOVcc сразу после СМР (сравнение) с теми же операндами, условия приобретают особый смысл, например:

Слова «выше» и «ниже» в табл. 5 относятся к сравнению чисел без знака, слова «больше» и «меньше» учитывают знак.

Таблица 5. Разновидности команды CMOVcc

Код

Команда

Назначение

Процессор

ХСНG операнд1, операнд2

Обмен операндов между собой

8086

Содержимое операнда 2 копируется в операнд 1, а старое содержимое операнда 1 - в операнд 2. XCHG можно выполнять над двумя регистрами или над регистром и переменной.

Команда

Назначение

Процессор

BSWAP регистр 32

Обмен байтов внутри регистра

80486

Обращает порядок байтов в 32-битном регистре. Биты 0-7 (младший байт младшего слова) меняются местами с битами 24-31 (старший байт старшего слова), а биты 8-15 (старший байт младшего слова) - с битами 16-23 (младший байт старшего слова).

Чтобы обратить порядок байтов в 16-битном регистре, следует использовать команду XCHG:

В процессорах Intel команду BSWAP можно использовать и для обращения порядка байтов в 16-битных регистрах, но в некоторых совместимых процессорах других фирм этот вариант не реализован.

Команда

Назначение

Процессор

PUSH источник

Поместить данные в стек

8086

Помещает содержимое источника в стек. Источником может быть регистр, сегментный регистр, непосредственный операнд или переменная. Фактически эта команда уменьшает ESP на размер источника в байтах (2 или 4) и копирует содержимое источника в память по адресу SS:[ESP]. Команда PUSH почти всегда используется в паре с POP (считать данные из стека). Поэтому, чтобы скопировать содержимое одного сегментного регистра в другой (что нельзя выполнить одной командой MOV), можно использовать такую последовательность команд:

Другой вариант применения команд PUSH/POP - временное хранение переменных, например:

Начиная с процессора 80286 команда PUSH ESP (или SP) помещает в стек значение ESP до того, как она же его уменьшит, а на 8086 регистр SP располагался в стеке уже уменьшенным на два.

Команда

Назначение

Процессор

POP приемник

Считать данные из стека

8086

Помещает в приемник слово или двойное слово, находящееся в вершине стека, увеличивая ESP на 2 или 4 соответственно. POP выполняет действие, полностью обратное PUSH. Приемником может быть регистр общего назначения, сегментный регистр, кроме CS (чтобы загрузить CS из стека, надо воспользоваться командой RET), или переменная. Если в роли приемника выступает операнд, использующий ESP для косвенной адресации, команда POP вычисляет адрес операнда уже после того, как она увеличивает ESP.

Команда

Назначение

Процессор

PUSHA

PUSHAD

Поместить в стек

все регистры общего назначения

80186

80386

PUSHA располагает в стеке регистры в следующем порядке: АХ, СХ, DX, ВХ, SP, ВР, SI и DI. PUSHAD помещает в стек EAX, ECX, EDX, EBX, ESP, EBP, ESI и EDI. (В случае с SP и ESP используется значение, которое находилось в регистре до начала работы команды.) В паре с командами POPA/POPAD, считывающими эти же регистры из стека в обратном порядке, это позволяет писать подпрограммы (обычно обработчики прерываний), которые не должны изменять значения регистров по окончании своей работы. В начале такой подпрограммы вызывают команду PUSHA, а в конце - РОРА.

Команда

Назначение

Процессор

РОРА

POPAD

Загрузить из стека

все регистры общего назначения

80186

80386

Команды выполняют действия, полностью обратные действиям PUSHA и PUSHAD, но помещенное в стек значение SP или ESP игнорируется. РОРА загружает из стека DI, SI, ВР, увеличивает SP на два, загружает ВХ, DX, СХ, АХ, a POPAD загружает EDI, ESI, ЕВР, увеличивает ESP на 4 и загружает EBX, EDX, ECX, EAX.

Команда

Назначение

Процессор

IN приемник, источник

Считать данные из порта

8086

Копирует число из порта ввода-вывода, номер которого указан в источнике, в приемник. Приемником может быть только AL, АХ или ЕАХ. Источник – или непосредственный операнд, или DX, причем во время использования непосредственного операнда можно указывать лишь номера портов не больше 255.

Команда

Назначение

Процессор

OUT приемник, источник

Считать данные из порта

8086

Копирует число из источника (AL, АХ или ЕАХ) в порт ввода-вывода, номер которого указан в приемнике. Приемник может быть либо непосредственным номером порта (не больше 255), либо регистром DX. На командах IN и OUT строится все общение процессора с устройствами ввода-вывода - клавиатурой, жесткими дисками, различными контроллерами, и используются они, в первую очередь, в драйверах устройств. Например, чтобы включить динамик PC, достаточно выполнить команды:

Команда

Назначение

Процессор

CWD

CDQ

Конвертирование слова в двойное слово

Конвертирование двойного слова в учетверенное

3086

80386

Команда CWD превращает слово в АХ в двойное слово, младшая половина которого (биты 0-15) остается в АХ, а старшая (биты 16-31) располагается в DX.

Команда CDQ выполняет аналогичное действие по отношению к двойному слову в ЕАХ, расширяя его до учетверенного слова в EDX:EAX.

Эти команды лишь устанавливают все биты регистра DX или EDX в значение, равное величине старшего бита регистра АХ или ЕАХ, сохраняя таким образом его знак.

Команда

Назначение

Процессор

CBW

CWDE

Конвертирование байта в слово

Конвертирование слова в двойное слово

8086

80386

CBW расширяет байт, находящийся в регистре AL, до слова в АХ; CWDE расширяет слово в АХ до двойного слова в ЕАХ. Команды CWDE и CWD отличаются тем, что CWDE размещает свой результат в ЕАХ, в то время как CWD, выполняющая точно такое же действие, располагает результат в паре регистров DX:AX.

Так же как и в командах CWD/CDQ, расширение выполняется путем установки каждого бита старшей половины результата равным старшему биту исходного байта или слова, то есть:

Команда

Назначение

Процессор

MOVSX приемник, источник

Пересылка с расширением знака

80386

Копирует содержимое источника (регистр или переменная размером в байт или слово) в приемник (16- или 32-битный регистр) и расширяет знак аналогично командам CBW/CWDE.

Команда

Назначение

Процессор

MOVZX приемник, источник

Пересылка с расширением нулями

80386

Копирует содержимое источника (регистр или переменная размером в байт или слово) в приемник (16- или 32-битный регистр) и расширяет нулями, то есть команда

эквивалентна паре команд

Команда

Назначение

Процессор

XLAT адрес

XLATB

Трансляция в соответствии с таблицей

8086

Помещает в AL байт из таблицы в памяти по адресу ES:BX (или ES:EBX) со смещением относительно начала таблицы равным AL. В качестве аргумента для XLAT в ассемблере можно указать имя таблицы, но эта информация никак не используется процессором и служит только в качестве комментария. Если он не нужен, можно применить форму записи XLATB. Например, можно написать следующий вариант преобразования шестнадцатеричного числа в ASCII-код соответствующего ему символа:

если в сегменте данных, на который указывает регистр ES, было записано

то теперь AL содержит не число 0Сh, а ASCII-код буквы С. Разумеется, это преобразование разрешается выполнить посредством более компактного кода всего из трех арифметических команд, который будет рассмотрен в описании команды DAS, но с XLAT можно осуществить любые преобразования такого рода.

Команда

Назначение

Процессор

LEA приемник,источник

Вычисление эффективного адреса

8086

Вычисляет эффективный адрес источника (переменная) и помещает его в приемник (регистр). С помощью LEA можно вычислить адрес переменной, которая описана сложным методом адресации, например по базе с индексированием. Если адрес - 32-битный, а регистр-приемник - 16-битный, старшая половина вычисленного адреса теряется, если наоборот, приемник - 32-битный, а адресация - 16-битная, то вычисленное смещение дополняется нулями.

Примечание.

Команду LEA часто используют для быстрых арифметических вычислений, например умножения:

или сложения:

(эти команды меньше, чем соответствующие MOV u ADD, и не изменяют флаги)

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