Отладка приложений

Манипуляции с данными


  • AND    логическое И
  •  OR         логическое ИЛИ-(включающее)

Инструкции AND и OR выполняют поразрядные операции, которые должны быть знакомы каждому, потому что они являются основой для манипуляции с разрядами.

  •  NOT    отрицание с поразрядным дополнением до 1 
  •  NEG    отрицание с поразрядным дополнением до 2



Инструкции NOT и NEG иногда вызывают некоторое замешательство, потому что по виду они похожи, но, конечно, не выполняют одну и ту же операцию. Инструкция NOT — поразрядная операция, которая устанавливает каждую двоичную 1 в 0 и каждый двоичный 0 в 1. Инструкция NEG выполняет вычитание операнда из 0. Следующий фрагмент кода показывает различия между этими двумя инструкциями:

void NOTExample { void )

 {

_asm {

MOV EAX , OFFh

MOV EBX , 1

NOT EAX // EAX теперь содержит OFFFFFFOOh.

NOT EBX // ЕВХ теперь содержит OFFFFFFFEh. 

}

void NEGExample ( void ) (

_asm 

{

MOV EAX , OFFh MOV EBX , 1

NEG EAX // EAX теперь содержит OFFFFFFOlh ( 0 - OFFh ). 

NEC EBX // EBX теперь содержит OFFFFFFFFh ( 0 - 1 ). 

}

  •  XOR логическое ИЛИ (исключающее)

Инструкция XOR — это самый быстрый способ обнулить значение. XOR с двумя операндами установит каждый разряд в 1, если одинаковые разряды в каждом операнде различны. Если все разряды одинаковы, то результат равен 0. Поскольку операция

XOR ЕАХ,ЕАХ

выполняется быстрее, чем

MOV EAX,0

(потому что первая занимает меньшее количество машинных тактов), компиляторы Microsoft используют XOR для обнуления регистров.

  •  INC      инкремент (увеличение) на 1
  •   DEC     декремент (уменьшение) на 1

Эти инструкции очень просты, и можно понять, что они делают, прямо из их названий. Компилятор часто использует эти инструкции при оптимизации некоторых кодовых последовательностей, потому что каждый из них выполняется за один цикл часов.
Кроме того, эти инструкции отображаются прямо в целочисленные арифметические С-операции ++ и - -

  •  SHL           сдвиг влево, умножение на 2 
  •  SHR      сдвиг вправо, деление на 2
При двоичных манипуляциях поразрядные сдвиги выполняются быстрее, чем соответствующие инструкции умножения и деления в CPU x86. Эти инструкции родственны поразрядным С-операциям « и », соответственно.

  •  DIV    беззнаковое деление 
  •  MUL       беззнаковое умножение
Эти простые с виду инструкции фактически немного странны. Обе инструкции выполняют беззнаковые действия на регистре ЕАХ. Но вывод неявно использует регистр EDX. Старшие байты двойного слова и большие по величине множители помещаются в регистр EDX. Инструкция DIV сохраняет остаток в EDX, а частное — в ЕАХ. Обе инструкции оперируют значением из ЕАХ, используя в качестве второго операнда только значения из регистра или из памяти.

  •  IDIV    деление со знаком 
  •  IUML      умножение со знаком
Эти инструкции подобны инструкциям DIV и MUL, за исключением того, что они обращаются с операндами как со знаковыми значениями. Старшие байты двойного слова и большие по величине множители помещаются в регистр EDX. Инструкция IDIV сохраняет остаток в EDX, а частное — в ЕАХ. Обе инструкции оперируют значением из ЕАХ, используя в качестве второго операнда только значения из регистра или из памяти. Инструкция IMUL иногда имеет три операнда. Первый операнд — целевой (в нем сохраняется результат), а два последних — исходные операнды. В наборе инструкций х86 IMUL — единственная инструкция с тремя операндами.

  •  LOCK   устанавливает сигнальный префикс LOCK#
LOCK — не реальная инструкция, а скорее префикс к другим инструкциям. Префикс LOCK сообщает CPU, что действие с памятью, к которой обращается следующая инструкций, должно быть атомарной операцией, когда CPU, выполняющий такую инструкцию, блокирует шину памяти и тем самым запрещает любому другому CPU в системе обращаться к этой памяти.

  •  MOVSX    пересылка с расширением знакового разряда 
  •  MDVZX    пересылка с расширением нулем
Эти две инструкции копируют значения меньшего размера в значения большего размера и указывают, как в больших значениях заполняются старшие разряды. MOVSX указывает, что знаковое значение исходного операнда будет расширено на все верхние разряды регистра-приемника (т. е. регистра результата). MOVZX заполняет, верхние разряды регистра-приемника нулями. Эти две инструкции предназначены для наблюдений за значениями при прослеживании ошибок в знаках.



Содержание раздела