El código máquina, o lenguaje de máquina, está formado por instrucciones sencillas, que -dependiendo de la estructura del procesador- pueden especificar:
Las operaciones más complejas se realizan combinando estas instrucciones sencillas, que pueden ser ejecutadas secuencialmente o mediante instrucciones de control de flujo. Casi todas las instrucciones utilizan 2 operandos específicos para realizar su función. Ejemplo, cuando deseamos mover un valor constante hacia un registro de almacenamiento debemos especificar ambos operandos. Las operaciones disponibles en la mayoría de los conjuntos de instrucciones incluyen:
● mover
llenar un registro con un valor constante (Ej.: mov al, `20`). o mover datos de una posición de memoria a un registro o viceversa (Ej.: mov al, [si]) o escribir y leer datos de dispositivos (Ej.: lea dx, offset cadena)
● Computar
sumar, restar, multiplicar o dividir los valores de dos registros, colocando el resultado en uno de ellos o en otro registro (Ej.: sum, mul, div, entres otras instrucciones). o realizar operaciones binarias, incluyendo operaciones lógicas (AND/OR/XOR/NOT) o comparar valores entre registros (mayor, menor, igual) (Ej.: cmp)
● afectar el flujo del programa
saltar a otra posición en el programa y ejecutar instrucciones allí(Ej.: jmp) o saltar si se cumplen ciertas condiciones (IF) (Ej.: jnb, jnz, jb, jz, jne, je, entre otros) o saltar a otra posición, pero guardar el punto de salida para retornar (Ej.: CALL, llamada a subrutinas) Algunas computadoras incluyen instrucciones complejas dentro de sus capacidades. Una sola instrucción compleja hace lo mismo que en otras computadoras puede requerir una larga serie de instrucciones, por ejemplo:
● salvar varios registros en la Pila de una sola vez
● mover grandes bloques de memoria