FE23  LOOCH  DISASM

СПРАВОЧНИК  ПО  КОМАНДАМ
ПРОЦЕССОРОВ  x86

(empty)
Главная Загрузка Инструкция Команды x86 Карта сайта

 

КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХ


В эту группу собраны команды пересылки данных и команды обмена данными. Поскольку обмен данными - это такие же пересылки без изменения самих данных. И сюда же попали еще несколько команд, которые разумно было тоже отнести к пересылкам данных. Всего здесь 10 команд, если подсчитать разные имена команд ассемблера, или 50 команд, если подсчитать машинные команды с разными кодами операций.

На этой странице во всех таблицах, где есть два операнда, первый операнд - это приемник (destination), в второй операнд - источник (source). На языке ассемблера в командах пересылки важен правильный порядок операндов после имени команды. Пересылка выполняется из операнда-источнка в операнд-приемник.

Команда пересылки данных

 Команда Операнды  Код Формат
  MOV  (r/m8), (reg8)    88    ------dw  MRM 
  MOV  (r/m16), (reg16) 
 (r/m32), (reg32) 
  89    ------dw  MRM 
  MOV  (reg8), (r/m8)    8A    ------dw  MRM 
  MOV  (reg16), (r/m16) 
 (reg32), (r/m32) 
  8B    ------dw  MRM 
  MOV  AL, (mem8)    A0    ------dw  addr(2/4) 
  MOV  AX, (mem16) 
 EAX, (mem32) 
  A1    ------dw  addr(2/4) 
  MOV  (mem8), AL    A2    ------dw  addr(2/4) 
  MOV  (mem16), AX 
 (mem32), EAX 
  A3    ------dw  addr(2/4) 

Команда MOV копирует содержимое второго операнда в первый операнд. При этом содержимое второго операнда не изменяется.

Команда MOV не воздействует на флажки, состояние флажков не изменяется.

В командах MOV с кодами A0, A1, A2, A3 обозначение addr(2/4) это задание адреса в оперативной памяти. Задается смещение относительно начала сегмента DS. Байты (два или четыре), задающие адрес, располагаются в самой команде следом за кодом операции. Размер адреса (2 или 4 байта) определяется атрибутом размера адреса команды.

В командах MOV с кодами 89, 8B, A1, A3 размер операнда (2 или 4 байта) определяется атрибутом размера операнда команды.

(Не путайте атрибут размера адреса и атрибут размера операнда, это две разные вещи.)

Команда для засылки констант

 Команда Операнды  Код Формат
  MOV AL, imm8    B0    ----wreg  data(1) 
  MOV CL, imm8    B1    ----wreg  data(1) 
  MOV DL, imm8    B2    ----wreg  data(1) 
  MOV BL, imm8    B3    ----wreg  data(1) 
  MOV AH, imm8    B4    ----wreg  data(1) 
  MOV CH, imm8    B5    ----wreg  data(1) 
  MOV DH, imm8    B6    ----wreg  data(1) 
  MOV BH, imm8    B7    ----wreg  data(1) 
  MOV  AX, imm16 
 EAX, imm32 
  B8    ----wreg  data(2/4) 
  MOV  CX, imm16 
 ECX, imm32 
  B9    ----wreg  data(2/4) 
  MOV  DX, imm16 
 EDX, imm32 
  BA    ----wreg  data(2/4) 
  MOV  BX, imm16 
 EBX, imm32 
  BB    ----wreg  data(2/4) 
  MOV  SP, imm16 
 ESP, imm32 
  BC    ----wreg  data(2/4) 
  MOV  BP, imm16 
 EBP, imm32 
  BD    ----wreg  data(2/4) 
  MOV  SI, imm16 
 ESI, imm32 
  BE    ----wreg  data(2/4) 
  MOV  DI, imm16 
 EDI, imm32 
  BF    ----wreg  data(2/4) 
  MOV  (r/m8), imm8    C6    -------w  NNN  data(1) 
  MOV  (r/m16), imm16 
 (r/m32), imm32 
  C7    -------w  NNN  data(2/4) 

Здесь операнды imm8, imm16, imm32 - это засылаемая константа, непосредственный операнд размером 1, или 2, или 4 байта.

В командах MOV с кодами C6, C7 в байте ( mod,reg,r/m ), в трехбитном поле ( reg ) должно быть значение 000.

Команда MOV с кодами C6, C7 обычно используется только для засылки константы в память и не используются для засылки константы в регистр, потому что для засылки константы в регистр есть более удобные команды с кодами от B0 до BF.

Другие команды MOV

Команда MOV для пересылки данных в сегментные регистры - смотрите страницу:
      Команды для сегментных регистров.

Команда MOV для пересылки данных в специальные регистры (регистры управления, отладки, тестирования) - смотрите страницу:
      Привилегированные команды

Команды пересылки с расширением операнда

 Команда Операнды  Код Формат
  MOVSX  (reg16), (r/m8) 
 (reg32), (r/m8) 
  0F  BE    -------w  MRM 
  MOVSX  (reg32), (r/m16)    0F  BF    -------w  MRM 
  MOVZX  (reg16), (r/m8) 
 (reg32), (r/m8) 
  0F  B6    -------w  MRM 
  MOVZX  (reg32), (r/m16)    0F  B7    -------w  MRM 

Обе команды, MOVSX и MOVZX, действуют почти одинаково. Различие лишь в том, что команда MOVSX делает знаковое (Sign) расширение, а команда MOVZX - нулевое (Zero) расширение.

Первый операнд является приемником (destination), второй операнд источником (source). Обе команды берут содержимое операнда источника, расширяют это значение до величины атрибута размера операнда команды (до 16 бит или до 32 бит) и заносят результат в операнд приемник.

Операнд-источник задается в поле ( r/m ) байта ( mod,reg,r/m ). Поэтому здесь может быть адрес памяти или регистр. Операнд-приемник задается в поле ( reg ) байта ( mod,reg,r/m ) и здесь может быть только регистр.

Бит ( w ) в коде операции определяет размер операнда-источника. Если ( w = 0 ), это коды операций 0F BE и 0F B6, то операнд-источник имеет размер 1 байт. Если ( w = 1 ), это коды операций 0F BF и 0F B7, то операнд-источник имеет размер 2 байта.

Команды MOVSX и MOVZX не воздействуют на флажки, состояние флажков не изменяется.

Команды расширения операнда

 Команда Операнды  Размер
операнда
 Код Формат
  CBW AX, AL   16 бит   98    -------- 
  CWDE EAX, AX   32 бита   98    -------- 
  CWD DX:AX, AX   16 бит   99    -------- 
  CDQ EDX:EAX, EAX   32 бита   99    -------- 

Команды CBW, CWDE, CWD, CDQ выполняют знаковое расширение операнда-источника. Результатом является операнд удвоенного размера.

Например, команда CBW берет знаковый бит из регистра AL (то есть, старший бит из AL) и заносит его во все биты регистра AH. Точно также, команда CWD берет знаковый (старший) бит из AX и заносит его во все биты регистра DX.

При записи на языке ассемблера для этих команд операнды не указываются. Операнды заранее определены по умолчанию и не могут быть изменены. В таблице показаны операнды, действующие по умолчанию.

Команды CBW, CWDE, CWD, CDQ не воздействуют на флажки, состояние флажков не изменяется.

В таблице указан атрибут размера операнда, который требуется для каждой из команд. Если требуемый для команды размер не совпадает с общим режимом работы всей программы, то перед кодом операции данной команды должен стоять префикс (код 66) для изменения атрибута размера операнда. (Это учитывает ассемблер при генерации кода).

 Команда Операнды  Размер
операнда
 Префикс Код
Режим работы программы - 32 бита
  CBW AX, AL   16 бит   66     98  
  CWDE EAX, AX   32 бита        98  
  CWD DX:AX, AX   16 бит   66     99  
  CDQ EDX:EAX, EAX   32 бита        99  
Режим работы программы - 16 бит
  CBW AX, AL   16 бит        98  
  CWDE EAX, AX   32 бита   66     98  
  CWD DX:AX, AX   16 бит        99  
  CDQ EDX:EAX, EAX   32 бита   66     99  

Команда обмена данными

 Команда Операнды  Код Формат
  XCHG EAX, EAX    90    -----reg 
  XCHG EAX, ECX    91    -----reg 
  XCHG EAX, EDX    92    -----reg 
  XCHG EAX, EBX    93    -----reg 
  XCHG EAX, ESP    94    -----reg 
  XCHG EAX, EBP    95    -----reg 
  XCHG EAX, ESI    96    -----reg 
  XCHG EAX, EDI    97    -----reg 
  XCHG (reg8), (r/m8)    86    -------w  MRM 
  XCHG (reg32), (r/m32)    87    -------w  MRM 

Команда XCHG обменивает содержимое двух своих операндов. Значение, которое было до выполнения команды в первом операнде, оказывается в результате во втором операнде. А значение, которое было до выполнения команды во втором операнде, оказывается в результате в первом операнде.

Команда XCHG не воздействует на флажки, состояние флажков не изменяется.

Команда XCHG всегда имеет два операнда, причем оба операнда должны иметь одинаковый размер (1 байт, или 2 байта, или 4 байта). Операнды могут быть указаны в команде в любом порядке. Это очевидно из смысла выполняемой операции.

Из всех вариантов команды XCHG только команда с кодом 86 может работать с операндами размером один байт.

Машинные команды с кодами 90-97 и 87 могут работать с операндами, размером два байта или четыре байта. Размер операнда (2 или 4 байта) определяется атрибутом размера операнда команды.

Команда XCHG с кодом 87 используется только для обмена "регистр - память" и не используются для обмена "регистр - регистр", потому что для обмена "регистр - регистр" есть более удобные команды с кодами от 90 до 97.

Пустая операция

 Команда Операнды  Код Формат
  NOP    90    -------- 

Очевидно, что команда ( XCHG EAX, EAX ) не выполняет никакой работы, так как здесь регистр EAX должен обмениваться сам с собой, Но такая команда-пустышка иногда может потребоваться в программе. Команда, которая ничего не делает и ничему не мешает. Поэтому данная команда имеет свое персональное имя на языке ассемблера - NOP (No Operation). При записи на языке ассемблера эта команда не имеет операндов. В программе эта команда занимает один байт.

Известны и еще несколько команд, которые тоже могут применяться, чтобы просто занимать место, причем занимать не один байт, а несколько. Но эти команды не имеют своего отдельного имени на языке ассемблера.

Команда перестановки байтов в 32-битном регистре

 Команда Операнды  Код Формат
  BSWAP EAX   0F  C8    -----reg 
  BSWAP ECX   0F  C9    -----reg 
  BSWAP EDX   0F  CA    -----reg 
  BSWAP EBX   0F  CB    -----reg 
  BSWAP ESP   0F  CC    -----reg 
  BSWAP EBP   0F  CD    -----reg 
  BSWAP ESI   0F  CE    -----reg 
  BSWAP EDI   0F  CF    -----reg 

Команда BSWAP изменяет порядок байтов в 32-битном регистре. В таком регистре размещается двойное слово - четыре байта. Если считать, что в исходном состоянии байты пронумерованы (1-2-3-4), то команда BSWAP просто меняет местами первый байт с четвертым, а второй байт с третьим. После выполнения этой команды байты будут расположены в обратном порядке (4-3-2-1). При этом содержимое самих байтов не изменяется.

Как известно, в процессорах x86 принят обратный порядок для расположения данных. Иногда возникает потребность показать результат с прямым порядком байтов. Изменить порядок байтов можно одной командой BSWAP, не делая лишних сдвигов и пересылок.

Команда BSWAP не воздействует на флажки, состояние флажков не изменяется.

Использование команды BSWAP для размера операнда "16 бит" не предусмотрено. Результат операции в этом случае не определен.




Основные страницы справочника

Справочник по командам процессоров x86
 
Все команды по алфавиту (кратко)
Все команды по алфавиту (подробно)
Первый байт кода операций
Второй байт кода операций
 


Главная Загрузка Инструкция Команды x86 Карта сайта


 
Copyright (C) FE23 Looch Disasm, 2011
File          - refe27.htm
File created  - 06 Jun 2011
Last modified - 30 Jun 2011
Hosted by uCoz