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

Команда

Назначение

Процессор

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

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

8086

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

mov ax,bx эквивалентна выражению

ах:=Ьх; языка Pascal или

ах=Ьх;

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

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

назначения, сегментный регистр (кроме CS) или переменная. Оба операнда дол­жны быть одного и того же размера - байт, слово или двойное слово.

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

/*^\ Загрузка регистра SS командой MOVавтоматически запрещает прерывания до окончания следующей за ней команды MOV, поэтому можно не опасаться, что в этот момент произойдет прерывание, обработчик которого получит неправильный стек. В любом случае для загрузки значения в регистр SS пред­почтительнее команда LSS.

Команда Назначение Процессор

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

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

Р6

Непривилегированные команды ШПИК

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

cmp        ах,Ьх' ;' Сравнить ах и ох.

cmovl     ах, Ьх ;  Если ах < Ьх,  скопировать Ьх в ах.

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

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

Код команды

Реальное условие

Условие для СМР

CMOVA CMOVNBE

CF = 0 и ZF = 0

Если выше

Если не ниже и не равно

CMOVAE

CMOVNB CMOVNC

CF = 0

Если выше или равно Если не ниже Если нет переноса

CMOVB

CMOVNAE

CMOVC

CF= 1

Если ниже

Если не выше и не равно Если перенос

CMOVBE CMOVNA

CF = 1 или ZF = 1

Если ниже или равно Если не выше

CMOVE CMOVZ

ZF=1

Если равно

Если ноль

CMOVG CMOVNLE

ZF = 0 и SF = OF

Если больше

Если не меньше и не равно

CMOVGE CMOVNL

SF = OF

Если больше или равно

Если не меньше

CMOVL CMOVNGE

SFO OF

Если меньше

Если не больше и не равно

CMOVLE CMOVNG

ZF = 1 или SF 0 OF

Если меньше или равно

Если не больше

CMOVNE CMOVNZ

ZF = 0

Если равно Если не ноль

CMOVNO ■

OF = 0

Если нет переполнения

CMOVO

OF= 1

Если есть переполнение

CMOVNP CMOVPO

PF = 0

Если нет четности Если нечетное

CMOVP CMOVPE

PF = 1

Если есть четность

Если четное

CMOVNS

SF = 0

Если нет знака

CMOVS

SF= 1

Если есть знак


 

Процессоры 1пт.е! в реальном режиме

Команда

Назначение Процессор

XCHG операнді ,операнд2

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

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

xchg    еах, ebx

xchg      al.al ;

To же, что три команды на языке С: temp = еах;еах = ebx;ebx = temp. А эта команда ничего не делает.

Команда

Назначение Процессор

BSWAP регистр32

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

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

mov •    eax, 12345678h

bswap     eax        ; Теперь в еах находится 78563412b.

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

xchg     al,ah    ; Обратить порядок байтов в АХ.

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

других фирм этот вариант не реализован.

Команда

Назначение

Процессор

PUSH источник

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

BGB6

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

pop       ds        _; Теперь DS указывает на тот же сегмент,   что и CS.

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

push      еах        ; Сохраняет текущее значение ЕАХ.

; Здесь располагаются какие-нибудь команды,

; которые используют ЕАХ, например CMPXCHG.

pop       еах        ; Восстанавливает старое значение ЕАХ.

Непривилегированные команды . ШШШШШП

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

Команда Назначение Процессор

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

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

Команда

Назначение

Процессор

PUSHA

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

80186

PUSHAD

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

80386

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

значения регистров по окончании своей работы. В начале такой подпрограммы вызывают команду PUSHA, а в конце - РОРА.

/~\ На самом деле PUSHA и PUSHAD - одна и та же команда с кодом 60h. ГРУ Ее поведение определяется тем, выполняется ли она в 16- или в 32-битном 4— режиме. Если программист использует команду PUSHAD в 16-битном сегмен­те или PUSHA в 32-битном, ассемблер просто записывает перед ней префикс изменения размерности операнда (66h). Это же будет распространяться на некоторые другие пары команд: POPA/POPAD, POPF/POPFD, PUSHF/ PUSHFD,JCXZ/JECXZ,CMPSW/CMPSD, INSW/INSD, LODSW/LODSD,

и

Команда Назначение Процессор

РОРА Загрузить из стека 80186

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

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


 

Процессоры 1п1е1 в реальном режиме

Команда

Назначение Процессор

ІИ приемник.источник

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

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

Команда

Назначение Процессор

ОУТ приемник.источник

Записать данные в порт 8086

Копирует число из источника (АЬ, АХ или ЕАХ) в порт ввода-вывода, номер которого указан в приемнике. Приемник может быть либо непосредственным номером порта (не больше 255), либо регистром ЭХ. На командах Ш и (ШТ стро­ится все общение процессора с устройствами ввода-вывода - клавиатурой, жест­кими дисками, различными контроллерами, и используются они, в первую оче­редь, в драйверах устройств. Например, чтобы включить динамик РС, достаточно выполнить команды:

т а!,61И ог а!,3 ои 61И,а!

Программирование портов ввода-вывода рассмотрено подробно в разделе 5.10.

Команда

Назначение

Процессор

С\ЛГО

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

3086

CDQ

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

80386

 

в учетверенное

 

Команда С\\ТЭ превращает слово в АХ в двойное слово, младшая половина которого (биты 0-15) остается в АХ, а старшая (биты 16-31) располагается в ЦХ. Команда СБО. выполняет аналогичное действие по отношению к двойному слову в ЕАХ, расширяя его до учетверенного слова в ЕЭХ:ЕЛХ.

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

Команда

Назначение

Процессор

СВ\Л/

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

8086

CWDE

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

80386

СВШ расширяет байт, находящийся в регистре АЕ, до слова ' в АХ; СШ)Е рас­ширяет слово в АХ до двойного слова в ЕАХ. Команды СШ)Е и СШТ) отличают­ся тем, что С\\Т)Е размещает свой результат в ЕАХ, в то время как С\\Т), выпол­няющая точно такое же действие, располагает результат в паре регистров ОХ:АХ. Так же как и в командах С\¥В/СО(^), расширение выполняется путем установкНепривилегированные команды ДНИІНіИІІЕН

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

пш        а!,0Р5ґі ; Л1_ = ОР5И = 245 = -11.

СЬ\а/ ;  Теперь АХ = 0РРР5Г\ = 65 525 = -11.

Как и в случае с командами РШНА/РШНАР, пара СШ/СБО,- это одна команда с кодом 99п, и пара СВЖ/СЖРЕ - одна команда с кодом 98И. Интер­претация этих команд зависит от того, в каком (16-битном или в 32-бит­ном) сегменте они исполняются. Если указать СВ^или СЖБЕв 16-битном сегменте, ассемблер поставит префикс изменения разрядности операнда.

Команда

Назначение Процессор

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

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

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

Команда

Назначение Процессор

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

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

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

movzx    ax, bl эквивалентна паре команд mov

mov G

Команда                                   Назначение Процессор Х1АТ адрес                               Трансляция в соответствии с таблицей 8086 Х1АТВ_

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

mov       al, ОСЬ

mov      bx,  offset htable xlatb

если в сегменте данных, на который указывает регистр ES, было записано htable     db "0123456789ABCDEF" то теперь AL содержит не число ОСЬ, а ASCII-код буквы С. Разумеется, это пре­образование разрешается выполнить посредством более компактного кода всего из трех арифметических команд, который будет рассмотрен в описании команды DAS, но с XLAT можно осуществить любые преобразования такого рода.

Команда

Назначение

Процессор

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

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

BGB6

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

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

lea       bx,[ebx+ebx*4] ; ВХ = ЕВХх 5 или сложения:

lea      ebx,[eax+12]    ;ЕВХ = ЕАХ + 12

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