# X86 Instructions and ARM Architecture

## Logic Instructions

All logical instructions presented in this section are executed in the, as the name already suggests, the arithmetic logic unit.

#### binary operations

These instructions require two operands.

##### logical and

operation

and performs a bit-wise and of the two operands, and stores the result in destination.

example

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


application

• 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 either 1 or 0. An and 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 destination mod mask operation, that is the remainder of integer division. For that, mask has to contain the value 2n-1 (i. e. all lower bits set until a certain threshold), where 2n equals your desired divisor.

##### logical or

operation

The or instruction performs a bit-wise or of the two operands, and stores the result in destination.

example

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


application

• An or can be used to calculate the union of two “sets”, or a value representing a “mask”.
##### logical xor
 xor flip, destination GAS Syntax xor destination, flip Intel Syntax

operation

Performs a bit-wise xor of the two operands, and stores the result in destination.

example

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


application

• xor rax, rax (or any GPR twice) will clear all bits. It is a specially recognized word. However, since xor affects flags it might introduce bogus dependencies.

##### common remarks

side effects for andor, and xor

• 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 operations

##### logical not

not argument

operation

Performs a bit-wise inversion of argument.

side-effects

None.

example

movl\$0x1,%edx; edx ≔ 1
notl%edx; edx ≔ ¬edx
; here edx would be 0xFFFFFFFE because a bitwise NOT 0x00000001 = 0xFFFFFFFE


application

• not is frequently used to get a register with all bits set.