Xor ассемблер как работает

от admin

Команда XOR

Команда XOR в Ассемблере выполняет операцию исключающего ИЛИ между всеми битами двух операндов. Результат операции XOR записывается в первый операнд. Синтаксис:

XOR ПРИЁМНИК, ИСТОЧНИК

Инструкция XOR всегда сбрасывает флаги CF и OF, а также (в зависимости от результата) изменяет флаги SF, ZF и PF. Значение флага AF может быть любым — оно не зависит от результата операции.

ПРИЁМНИК может быть одним из следующих:

  • Область памяти (MEM)
  • Регистр общего назначения (REG)

ИСТОЧНИК может быть одним из следующих:

  • Область памяти (MEM)
  • Регистр общего назначения (REG)
  • Непосредственное значение — константа (IMM)

С учётом ограничений, которые были описаны выше, комбинации ПРИЁМНИК-ИСТОЧНИК могут быть следующими:

Операция исключающего ИЛИ

При выполнении операции исключающего ИЛИ значение результата будет равно 1, если сравниваемые биты отличаются (не равны). Если же сравниваемые биты имеют одинаковое значение, то результат будет равен 0.

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

Но, так как любая пара неодинаковых битов это 0 и 1, то операция логического ИЛИ в результате даст 1.

Таблица истинности исключающего ИЛИ

Таблица истинности XOR приведена ниже:

Особенности операции XOR

Операция XOR обладает свойством реверсивности. Если её выполнить дважды с одним и тем же операндом, то значение результата инвертируется. То есть если два раза выполнить эту операцию между битами X и Y, то в конечном результате мы получим исходное значение бита Х.

Это свойство можно использовать, например, для простейшего шифрования данных (об этом как-нибудь в другой раз).

Проверка флага чётности после операции XOR

Команда XOR работает с 8-, 16- и 32-разрядными операциями.

Иногда есть необходимость после выполнения операции проверить флаг чётности PF, для того, чтобы узнать, какое количество единичных битов (чётное или нечётное) содержится в младшем байте результата (это бывает необходимо не только в случае выполнения операции XOR, но и при выполнении других арифметических и логических операций).

Если флаг чётности установлен, то в результате получилось чётное количество единичных битов. Иначе флаг будет сброшен.

Можно также просто проверить на чётность любое число, не меняя значения результата. Для этого надо выполнить команду XOR с нулевым значением. То есть в ПРИЁМНИКЕ должно быть проверяемое число, а в ИСТОЧНИКЕ должен быть ноль. А затем надо проверить флаг чётности. Пример:

В отладчиках обычно для обозначения чётного количества единиц в полученном результате используется сокращение PE (Parity Even), а для нечётного — PO (Parity Odd).

Чётность в 16-разрядных словах

Как уже было сказано, флаг чётности устанавливается в зависимости от количества единиц, содержащихся в младшем байте результата. Чтобы проверить чётность 16-разрядного операнда, надо выполнить команду XOR между старшим и младшим байтом этого числа:

Таким нехитрым способом 16-разрядный операнд разбивается на два байта (2 группы по 8 битов), и при выполнении команды XOR единичные биты, находящиеся в соответствующих разрядах двух 8-разрядных операндов, не будут учитываться. Потому что соответствующий бит результата равен нулю.

Команда XOR удаляет из результата любые пересекающиеся единичные биты двух 8-разрядных операндов и добавляет в результат непересекающиеся единичные биты. То есть чётность полученного нами 8-разрядного числа будет такой же, как и чётность исходного 16-разрядного числа.

В результате 4 единицы, то есть флаг PF будет установлен

Чётность в 32-разрядных двойных словах

Ну а если надо определить чётность в 32-разрядном числе?

Тогда число разбивается на четыре байта, и поочерёдно с этими байтами выполняется операция исключающего ИЛИ.

Например, мы разбили 32-разрядное число B на четыре байта B0, B1, B2, B3, где В0 — это младший байт.

Тогда для определения чётности числа В нам надо будет использовать следующую формулу:

B0 XOR B1 XOR B2 XOR B3

Но в ассемблере такая запись недопустима. Поэтому придётся немного подумать.

Ну и напоследок о происхождении мнемоники XOR. В английском языке есть слово eXception — исключение. Сокращением от этого слова является буква Х (так повелось). Вы наверняка встречали такое в рекламе или в названии продуктов, производители которых претендуют (ну или думают, что претендуют) на исключительность. Например, Лада XRAY, Sony XPeria и т.п. Так что XOR — это аббревиатура, собранная из двух слов — eXception OR — исключающее ИЛИ.

Assembler: Logic

Всем доброго времени суток! Naize в студии, а это значит, что вас сегодня ждёт статья про Ассемблер. Ура, наш самый любимый язык, наконец-то мы продолжаем его учить! Цель сегодняшней статьи — объяснить, что такое логические операторы, и описать, какие они бывают конкретно в АСМЕ. Итак, за дело! Для начала познакомимся со списком этих самых операций, а потом поговорим про каждую подробнее))

What is Logic at Assembler?

Вот список логических побитовых команд:

  • AND — Побитовое логическое умножение. Используют для выделения части битов.1100 AND 1010 = 1000
  • OR — Побитовое логическое сложение. Используют вместо команд сравнения
  • XOR — Побитовое сложение по модулю два. Используют для обнуления.
  • TEST — Выполняется логическое умножение, но приемник не меняется. Меняются только флаги.
  • NOT — Инвертирует каждый бит

Побитовые они оттого, что сравнивают каждый байт двоичного числа по-отдельности. За исключением NOT, эта команда нечего не с чем не сравнивает.

Хорошо, в общем виде вы теперь знаете, что к чему. Пора поговорить про все логические операции подробнее, и попутно дать несколько примеров для полного понимания темы.

Логическое И (AND)

В Assembler этот оператор сравнивает два регистра по одному биту. Он обозначается как AND, и вот пример работы:

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

01101001 AND 01000111

Очевидно, что результатом этой операции будет 01000001, давайте я напишу в более удобном виде:

Возникает один вопрос: куда же будет помещён результат выполнения оператора? Так вот, результат записывается в регистр, который стоит первым после and. Например:

Результат будет помещён в регистр eax.

Логическая инструкция TEST

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

Она как и AND производит побитовое умножение, но не записывает результат в какой либо регистр, а всего лишь поднимает флаги для каждого бита, то есть она, как бы так сказать, имитирует выполнение and.

Логическое ИЛИ (OR)

В Assembler логическое побитовое ИЛИ обозначается как OR, и синтаксис идентичен синтаксису команды and, по своей сути представляет побитовое сложение. Давайте посмотрим на простой пример:

01101001 OR 01000111

Результатом этой операции будет 01101111, и, как и в случае с AND, OR поместит это двоичное число в регистр, который стоит первым после самой команды. Вот более удобная запись, кстати:

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

Также помимо логического ИЛИ, существует исключающее ИЛИ. Оно обозначается командой XOR и выделяет различия в регистрах, то есть, если в одном бите содержится 1, а в другом 0, то XOR вернет 1, если же в битах содержатся одинаковые значения, то XOR вернет 0.

Конструкция из 3 xor позволяет поменять местами значения в регистрах.

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

Также отметим конструкцию XOR eax, eax — она позволяет обнулить регистр (естественно, вместо eax может быть любой другой регистр). По сути это аналог команды MOV eax, 0, но многие из тех, то работает с асмом, любят использовать именно эту конструкцию… Потому что она быстрее и тратит меньше памяти.

Читать:
Как вычислить радиус кривизны траектории

Давайте посмотрим на простой пример:

00101110 XOR 10011100

В данном примере, после выполнения XOR получится 10110010, думаю суть всего этого вы уже уловили))

Результат этой команды, как и в случае с предыдущими, помещается в тот регистр, который идёт первым.

Логическое НЕ (NOT)

Данная мнемоника инвертирует все биты числа, она единственная из сегодняшнего списка, не сравнивает что то с чем то. И в качестве “аргументов” она принимает только один регистр, в который и помещается в итоге результат ей выполнения:

Так, давайте ка глянем пример:

NOT 01010011

Понятно, что результатом данной операции будет 10101100. В след за предыдущими, пример в более читаемом виде:

AfterWords

Вот и всё на сегодня. Теперь вы немного лучше разбираетесь в ассемблере, и знаете, какие логические операции в нем используются. В следующем посте мы поговорим про IMUL, IDIV и NEG. Пока не буду рассказывать, что это, если захотите — сами найдёте))

Assembly — Logical Instructions

The processor instruction set provides the instructions AND, OR, XOR, TEST, and NOT Boolean logic, which tests, sets, and clears the bits according to the need of the program.

The format for these instructions −

Sr.No. Instruction Format
1 AND AND operand1, operand2
2 OR OR operand1, operand2
3 XOR XOR operand1, operand2
4 TEST TEST operand1, operand2
5 NOT NOT operand1

The first operand in all the cases could be either in register or in memory. The second operand could be either in register/memory or an immediate (constant) value. However, memory-to-memory operations are not possible. These instructions compare or match bits of the operands and set the CF, OF, PF, SF and ZF flags.

The AND Instruction

The AND instruction is used for supporting logical expressions by performing bitwise AND operation. The bitwise AND operation returns 1, if the matching bits from both the operands are 1, otherwise it returns 0. For example −

The AND operation can be used for clearing one or more bits. For example, say the BL register contains 0011 1010. If you need to clear the high-order bits to zero, you AND it with 0FH.

Let’s take up another example. If you want to check whether a given number is odd or even, a simple test would be to check the least significant bit of the number. If this is 1, the number is odd, else the number is even.

Assuming the number is in AL register, we can write −

The following program illustrates this −

Example

When the above code is compiled and executed, it produces the following result −

Change the value in the ax register with an odd digit, like −

The program would display:

Similarly to clear the entire register you can AND it with 00H.

The OR Instruction

The OR instruction is used for supporting logical expression by performing bitwise OR operation. The bitwise OR operator returns 1, if the matching bits from either or both operands are one. It returns 0, if both the bits are zero.

The OR operation can be used for setting one or more bits. For example, let us assume the AL register contains 0011 1010, you need to set the four low-order bits, you can OR it with a value 0000 1111, i.e., FH.

Example

The following example demonstrates the OR instruction. Let us store the value 5 and 3 in the AL and the BL registers, respectively, then the instruction,

should store 7 in the AL register −

When the above code is compiled and executed, it produces the following result −

The XOR Instruction

The XOR instruction implements the bitwise XOR operation. The XOR operation sets the resultant bit to 1, if and only if the bits from the operands are different. If the bits from the operands are same (both 0 or both 1), the resultant bit is cleared to 0.

XORing an operand with itself changes the operand to 0. This is used to clear a register.

The TEST Instruction

The TEST instruction works same as the AND operation, but unlike AND instruction, it does not change the first operand. So, if we need to check whether a number in a register is even or odd, we can also do this using the TEST instruction without changing the original number.

The NOT Instruction

The NOT instruction implements the bitwise NOT operation. NOT operation reverses the bits in an operand. The operand could be either in a register or in the memory.

What is the meaning of XOR in x86 assembly?

I’m getting into assembly and I keep running into xor, for example:

Does it just clear the register’s value?

11 Answers 11

A XOR B in english would be translated as «are A and B not equal». So xor ax, ax will set ax to zero since ax is always equal to itself.

xor reg, reg is often used to clear register. It can be an alternative to mov reg, 0

AFAIR, it was faster (or shorter) in some cases.

And of course, XOR itself is eXclusive OR (a.k.a.: exclusive disjunction) operation (but it’s a shame to describe here such basics — use Wikipedia)

Lukasz's user avatar

xor ax, ax is the fastest possible way to set the ax register to 0 . Fastest in terms of the size of instruction and number of instructions. For detail about how it works you need a little knowledge of bit arithmetic.

XOR operation between two bits returns 1 if one and only one of the two bits is 1; 0 otherwise. Another way to explain is that that it returns 1 if the two bits are different; 0 otherwise.

XOR operation between two binary numbers of same length works likewise on a bit-by-bit basis. XOR two numbers you get a number with bits set to 1 where corresponding bits of the two operands differ, 0 when corresponding bits are same.

From this knowledge its fairly easy to see that if the two operands are the same (ax and ax for example) the result will be 0.

Похожие статьи