# Instruction Set Architecture
**A model of a computer which defines the instructions, data types, registers, main memory management, fundamental features, and the input/output model.**
A device which *executes* the instructions defined by an instruction set architecture, or ISA, is known as an *implementation*.
An ISA specifies the *behaviour* of machine code running on any *arbitrary* implementation and thus can be implemented in *various ways* without altering the behaviour.
## Types of ISAs
The most common classification of ISAs is through architectural *complexity*.
- *Complex instruction set computer* (CISC) - instructions that execute several low-level operations, rarely used specialised instructions.
- *Reduced instruction set computer* (RISC) - efficient implementation of frequently used instructions, no direct memory content manipulation and thus, [[load-store architecture]]. ^886a94
## Instructions
*Machine code* consists of *discrete* machine language instructions. These instructions may contain:
- *Opcode* - a specification of the operation
- *Operand* - the value on which the operation is performed
- Registers, shifted registers
- Literal/constant values
- Addressing modes
### Instruction types
#### Data handling and memory operations
- *Set* a register to a fixed constant value.
- *Copy* data from a memory location or a register to another memory location or a register. This is typically known as `move`, though that may be confused with a true move operation.
- *Read* and *write* data from hardware devices.
#### Arithmetic and logic operations
- *Add, subtract, multiply,* or *divide* the values of two registers.
- *Increment* or *decrement* the value in a register.
- Perform *bitwise operations*, such as basic or other [[Boolean Algebra#Logical operations|logical operations]], on corresponding bits of a pair of registers.
- *Compare* two values in registers.
- Perform *floating-point arithmetic* on values.
#### Control flow operations
- *Branch* to another location in the program and execute from there.
- *Conditionally branch* to another location if a certain condition is true.
- *Indirectly branch* to another location.
- *Call* another block of code and return after execution.