Организация ЭВМ и систем: Курс лекций (Позиционные системы счисления. Процессоры семейства IA-32. Лазерные принтеры), страница 16

XCHG         операнд1, операнд2            обмен значений операндов         8086

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

BSWAP       32-разрядный регистр        обмен байтов внутри регистра  80486

Обращает байты внутри регистра. Биты 0-7 меняются местами с битами 24-31, а биты 8-15 — с битами 16-23. Например, если в регистре EAX находится число 12345678H, то после выполнения команды

                BSWAP   EAX

в том же регистре будет находиться число 78563412H.

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

                XCHG    AH, AL

PUSH         источник                             поместить данные в стек             8086

Помещает содержимое источника в стек.

Источником может быть:

—  непосредственный операнд;

—  регистр, в том числе сегментный;

—  память.

С точки зрения программиста, команда уменьшает значение регистра ESP на размер источника и копирует содержимое источника по адресу SS:[ESP] в защищённом режиме или SS:[SP] — в режиме реальной адресации.

Начиная с процессора 80286 команды

                PUSH    SP

и

                PUSH    ESP

помещают в cтек значение регистра SP или ESP до того, как они же уменьшат его значение, а процессор 8086 записывает в стек значение регистра SP, уже уменьшенное на два.

POP            приёмник                             извлечь данные из стека              8086

Помещает значение из стека в приёмник.

Приёмником может быть:

—  регистр общего назначения;

—  сегментный регистр, кроме CS;

—  память.

Если в качестве приёмника выступает операнд, использующий ESP для косвенной адресации, команда POP вычисляет адрес операнда уже после увеличения ESP.

Примечания

1.  Чтобы загрузить CS из стека, нужно воспользоваться командой RET.

2.  Чтобы скопировать содержимое одного сегментного регистра в другой, например, CS в DS, можно воспользоваться следующей парой команд:

                PUSH    CS
                POP     DS

PUSHA       поместить в стек 16-разрядные регистры общ. назначения 80186

PUSHAD     поместить в стек 32-разрядные регистры общ. назначения 80386

Команда PUSHA помещает в стек регистры в следующем порядке: AX, CX, DX, BX, SP, BP, SI, DI. PUSHAD помещает в том же порядке соответственные 32-разрядные регистры. В стек помещается содержимое регистра SP или ESP, которое находилось в них до начала работы команды.

Примечание. PUSHA и PUSHAD — две мнемоники одной и той же команды с кодом 60H. Её интерпретация определяется тем, выполняется ли она в 16-разрядном или в 32-разрядном режиме. Если команда PUSHAD используется в 16-разрядном режиме или PUSHA — в 32-разрядном, ассемблер записывает перед ней префикс изменения размерности операнда с кодом 66H. То же самое верно для нижеследующей пары команд.

POPA         загрузить из стека 16-разрядные регистры общ. назначения                   80186

POPAD       загрузить из стека 32-разрядные регистры общ. назначения                   80386

Команды выполняют действия, обратные командам PUSHA и PUSHAD с точностью до помещённого в стек значения регистра SP или ESP, которое игнорируется. POPA загружает из стека значения DI, SI, BP, увеличивает значение регистра SP на два, загружает BX, DX, CX, AX. POPAD выполняет те же операции с соответственными 32-разрядными регистрами, увеличивая ESP не на два, а на четыре.

Примечание. Пара команд PUSHA/POPA или PUSHAD/POPAD часто используется в процедурах, которые не должны изменять значения регистров по окончанию своей работы. В первую очередь, это относится к обработчикам прерываний. В начале процедуры используют команду PUSHA или PUSHAD, а в конце POPA или, соответственно, POPAD.

IN              приёмник, источник           считать данные из порта             8086