X86 Assembly/Logic

From testwiki
Jump to navigation Jump to search

Template:X86 Assembly Page

Logical instructions

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 operations

These instructions require two operands.

Template:X86-inst-2

operation

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

side effects

See below.

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 Template:Abbr is set, or not set.
  • If partial register addressing is not available in the desired size, an and can be used for a destinationmodmask operation, that is the remainder of integer division. For that, mask has to contain the value 2n1 (i. e. all lower bits set until a certain threshold), where 2n equals your desired divisor.

logical or

Template:X86-inst-2

operation

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

side effects

See below.

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

Template:X86-inst-2

operation

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

side effects

See below.

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 Template:Abbr 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 and, or, and xor

unary operations

logical not

Template:X86-inst-1

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.