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.
These instructions require two operands.
|and mask, destination||GAS Syntax|
|and destination, mask||Intel Syntax|
and performs a bit-wise
and of the two operands, and stores the result in destination.
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
andcan 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 either
and rax, 1will ensure only the LSB is set, or not set.
- If partial register addressing is not available in the desired size, an
andcan 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.
|or addend, destination||GAS Syntax|
|or destination, addend||Intel Syntax|
or instruction performs a bit-wise
or of the two operands, and stores the result in destination.
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
orcan be used to calculate the union of two “sets”, or a value representing a “mask”.
|xor flip, destination||GAS Syntax|
|xor destination, flip||Intel Syntax|
Performs a bit-wise
xor of the two operands, and stores the result in destination.
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
xor rax, rax(or any GPR twice) will clear all bits. It is a specially recognized word. However, since
xoraffects flags it might introduce bogus dependencies.
side effects for
- 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
Performs a bit-wise inversion of argument.
movl $0x1, %edx ; edx ≔ 1 notl %edx ; edx ≔ ¬edx ; here edx would be 0xFFFFFFFE because a bitwise NOT 0x00000001 = 0xFFFFFFFE
notis frequently used to get a register with all bits set.