# 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.**
An **instruction set architecture**, or **ISA**, is a model of the relationship between software and the central processing unit of a computer, describing the supported operations and instructions, data types, registers, main memory management, and the input/output interface.
A device which executes and follows an instruction set architecture is known as an *implementation* of that architecture.
An instruction set architecture defines the behaviour of machine code on any arbitrary implementation and thus allows software designed in a particular architecture to be implemented across many different hardware.
## 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.