# 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.