Инструкции AND и OR выполняют поразрядные операции, которые должны быть знакомы каждому, потому что они являются основой для манипуляции с разрядами.
Инструкции 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 с двумя операндами установит каждый разряд в 1, если одинаковые разряды в каждом операнде различны. Если все разряды одинаковы, то результат равен 0. Поскольку операция
XOR ЕАХ,ЕАХ
выполняется быстрее, чем
MOV EAX,0
(потому что первая занимает меньшее количество машинных тактов), компиляторы Microsoft используют XOR для обнуления регистров.
Эти инструкции очень просты, и можно понять, что они делают, прямо из их названий. Компилятор часто использует эти инструкции при оптимизации некоторых кодовых последовательностей, потому что каждый из них выполняется за один цикл часов.