X86 Assembly/Logic
Logical instructionsEdit
The instructions on this page deal with bit-wise logical instructions. For more information about bit-wise logic, see Digital Circuits/Logic Operations.
All logical instructions presented in this section are executed in the, as the name already suggests, the arithmetic logic unit.
binary operationsEdit
These instructions require two operands.
logical and
Edit
and mask, destination | GAS Syntax |
and destination, mask | Intel Syntax |
operationEdit
and
performs a bit-wise and
of the two operands, and stores the result in destination.
side effectsEdit
exampleEdit
movl $0x1, %edx ; edx ≔ 1
movl $0x0, %ecx ; ecx ≔ 0
andl %edx, %ecx ; ecx ≔ edx ∧ ecx
; here ecx would be 0 because 1 ∧ 0 ⇔ 0
applicationEdit
- An
and
can be used to calculate the intersection of two “sets”, or a value representing a “mask”. Some programming language require that Boolean values are stored exactly as either1
or0
. Anand rax, 1
will ensure only the LSB is set, or not set. - If partial register addressing is not available in the desired size, an
and
can be used for a operation, that is the remainder of integer division. For that, mask has to contain the value (i. e. all lower bits set until a certain threshold), where equals your desired divisor.
logical or
Edit
or addend, destination | GAS Syntax |
or destination, addend | Intel Syntax |
operationEdit
The or
instruction performs a bit-wise or
of the two operands, and stores the result in destination.
side effectsEdit
exampleEdit
movl $0x1, %edx ; edx ≔ 1
movl $0x0, %ecx ; ecx ≔ 0
orl %edx, %ecx ; ecx ≔ edx ∨ ecx
; here ecx would be 1 because 1 ∨ 0 ⇔ 1
applicationEdit
- An
or
can be used to calculate the union of two “sets”, or a value representing a “mask”.
logical xor
Edit
xor flip, destination | GAS Syntax |
xor destination, flip | Intel Syntax |
operationEdit
Performs a bit-wise xor
of the two operands, and stores the result in destination.
side effectsEdit
exampleEdit
movl $0x1, %edx ; edx ≔ 1
movl $0x0, %ecx ; ecx ≔ 0
xorl %edx, %ecx ; ecx ≔ edx ⊕ ecx
; here ecx would be 1 because 1 ⊕ 0 ⇔ 1
applicationEdit
xor rax, rax
(or any GPR twice) will clear all bits. It is a specially recognized word. However, sincexor
affects flags it might introduce bogus dependencies.
common remarksEdit
side effects for and
, or
, and xor
Edit
- OF ≔ 0
- CF ≔ 0
- SF becomes the value of the most significant bit of the calculated result
- ZF ≔ result = 0
- PF is set according to the result
unary operationsEdit
logical not
Edit
not argument
operationEdit
Performs a bit-wise inversion of argument.
side-effectsEdit
None.
exampleEdit
movl $0x1, %edx ; edx ≔ 1
notl %edx ; edx ≔ ¬edx
; here edx would be 0xFFFFFFFE because a bitwise NOT 0x00000001 = 0xFFFFFFFE
applicationEdit
not
is frequently used to get a register with all bits set.