Difference between ISA (e.g. MIPS) and Assembly language

An Instruction Set Architecture (ISA) is physically correspondent to machine operations within a particular processor. This means that the ISA lists any and all instructions, as well as opcodes, that can be performed by specific processors.

An assembly language usually has a 1-1 relationship with the ISA, but can be implemented in different ways. Sometimes the assembly code can perform an entire set of ISA level instructions.

Assembly languages are an abstracted set of ISA opcodes, logic, and instructions that allow for variables/macros/functions/methods/etc. They can be very basic (meaning almost 1-1 mapping) or they can support more complex operations like structural programming blocks.


I doubt there are any "authoritative" definitions of those terms, but here are some senses in which they may not perfectly overlap:

  • While the "ISA" standardizes a public interface to a processor that should be used as the basis to write programs that are binary-compatible with multiple processors that implement the ISA, "assembly language" may just as well refer to what is implemented by a specific processor, without necessarily being compatible with other implementations.
  • More generally, "an ISA" is a standards document, while "assembly language" is a programming language.
  • An ISA would normally specify not only instructions and their names, but also a binary encoding for them (such as opcodes and argument encodings). The term "assembly language" refers to the text form of the instructions only, without reference to their encoding.

That said, they obviously have a lot of overlap, so in non-normative texts it would be quite understandable if they are used interchangably in some contexts.


ISA means instruction set architecture. As those words imply this is the instruction based architecture that some particular processor was designed to. Somebody somewhere knows what that architecture does and the instructions (machine code) to make it do what it does.

Assembly Language is a term for a programming language. Unlike Java or Python, there is not one standard body that makes a definition for one assembly language. Ideally for each ISA there is an Assembly Language, but it is not all that uncommon that more than one or subtle variations can exist between Assembly Languages for a specific ISA. The Assembly Language is essentially defined by the Assembler, sometimes the word Assembler is also used to mean the language itself, I try to separate Assembly Language, the programming language and Assembler the programmers utility that takes the Assembly Language and parses it and converts it to machine code.

Assembly Language is ideally a programming language where you have a one to one relationship between each Assembly Language mnemonic and an instruction in the instruction set (ISA). But this is not always the case, there are things to make your life easier like labels for branching to. There are often a number of directives where you can for example insert some data (a string you want to print perhaps). And there are macros which are not unlike macros in C a way you can write some code you want to reuse one time in one place then simply use the macro.

MIPS is a company that makes processors and the name of the ISA and the name of the Assembly Language and the processors will all bear the name MIPS. Just like Intel processors, Assembly Language and instruction set can be properly called Intel (although we also see x86 and other variations). ARM, same deal, processor, architecture, instruction set, assembly language.

Usually the inventor of an instruction set (as in the group of people working together not necessarily one individual chip engineer), creates documentation for that instruction set, usually including the machine code. Along with that there is usual an assembly language syntax. Often the syntax in the reference manual is the starting point for the Assembler. Not as often there are instructions which are defined here which are actually pseudo instructions, nop is common, some instruction sets dont want to waste an opcode and instead the assembler encodes add r0+0 or and r0,r0 or some such thing that basically does nothing but is a real alu instruction. MIPS has some commonly used assembly language instructions/mnemonics which are pseudo instructions that the assembler generates for you, you have to remember not to use these in the branch shadow (defer slot, whatever term you like to use), or you will or should be warned.