An assembly language is a unique language to a CPU that is very close to the actual machine language that directs the operations of the CPU. One might picture a continuum of human comprehension concerning computer languages. On the left of the continuum, the actual voltage differences that a computer recognizes when executing a program. On the right, modern programming environments that allow a programmer to create human-readable programs without even touching a keyboard.
In the continuum lie the thousands of programming languages created and adopted over the years to solve any number of problems in any number of environments using any number of interfaces, each inhabiting a level of abstraction. Hard up against those voltage differences stands something called machine language, a nearly incomprehensible string of 1s and 0s usually expressed in hexadecimal, that’s as close to programming in voltages as one can get without heating up a soldering iron. Each 1 and 0 represents a high or low voltage that will make the computer dance the way the programmer wants.
Before a program can be converted into voltage differences so that a computer can execute it, it must be converted into machine language so that the executable program can be stored on some medium. The great leap forward for programmers was the invention of assembly languages, human-readable programming languages. By using mnemonics, assembly language allows almost anyone the ability to pick up a piece of code and see what is going to happen: ADD, DIV, MOV and other similar terms are recognizable and memorable thus increasing programming speed and productivity.
A single line of assembly language is translated (assembled) into a single line of machine language and then into a single instruction that will control the computer. A single line of a high-level language is translated into one or more (usually several more) lines of assembly language during a process called compiling.
Each assembly language is unique to the architecture of the CPU on which it runs, that is, assembly language for a Intel-based computer is different from the assembly language for an IBM mainframe computer which is different from the assembly language for an IBM mid-range computer and so on. High level languages can be written to run on more than one computer platform. One can write a C program compile it to run on a PC or a mainframe or a Sun MicroSystems workstation. The programmer writes essentially the same code for each box but the compiler for each system is unique and compiles it into the appropriate assembly language. In each case the input to the compiler can be nearly identical and the output is completely different.
The assembly-language programmer is free from most of the constraints faced by a high-level-language programmer, but is free to control the computer as necessary. To assembly language and thus to the programmer, the program and the data are a continuous string of 1s and 0s to be manipulated as seems appropriate. There is no real difference between executable statements and data. Everything is a string of bits. With this freedom comes great responsibility. Things can go very wrong in an assembly language program and can do so very quickly. Assembly-language programmers learn to be paranoid about each line of code written.
A free online guide to learn assembly language at http://assembly.co.nr