programacion-codigo-maquina

Qué es el código máquina

El código máquina es un lenguaje de programación de bajo nivel que es directamente ejecutable por la unidad central de procesamiento (CPU) de una computadora.

Si abrimos un programa ejecutable veremos un chicharro de datos como el siguiente, pero con muchas muchas (¡muchas!) más líneas.

00 F3 0F 6F 05 D7 8E 06 00 0F 11 74 24 60 0F 11 44 24 70 41 80 FD 03 0F 84
9B 03 00 00 8B 7E 04 45 31 F6 85 FF 0F 89 AF FD FF FF 80 7E 08 00 0F 84 DB
02 00 00 31 FF 41 80 FD 01 40 0F 94 C7 83 C7 06 E9 AD FD FF FF 66 0F 1F 84 
00 00 00 00 00 80 7C 24 6F 01 0F 84 3D 04 00 00 8B 44 24 60 48 83 F8 03 0F 
86 5A 02 00 00 BA 03 00 00 00 E9 0E FF FF FF 0F 1F 44 00 00 40 84 ED 48 8D 
3D 43 84 06 00 48 8D 05 40 84 06 00 48 0F 45 F8 E9 C8 FE FF FF 66 0F 1F 44 
00 00 45 84 F6 0F 84 17 03 00 00 45 0F B6 F6 48 8D 05 BC 83 06 00 48 C7 44 
24 70 01 00 00 00 41 BD 01 00 00 00 42 0F B6 04 30 88 84 24 80 00 00 00 48 
8D 44 24 50 48 89 44 24 30 66 0F EF F6 C6 44 24 50 25 44 8B 76 04 48 8D 54 
24 51 F3 0F 5A F1 40 84 FF 74 0A C6 44 24 51 23 48 8D 54 24 52 45 85 F6 78
0F 0F B7 05 12 8E 06 00 48 83 C2 02 66 89 42 FE 40 80 FD 01 C6 42 01 00 BF 
F4 01 00 00 4C 89 FB 19 C0 83 E0 20 83 C0 41 88 02 49 8D 45 01 48 89 44 24 
38 0F 1F 00 4C 29 EF 4A 8D 0C 2B 48 89 FD 45 85 F6 0F 88 A4 00 00 00 4C 8B 
44 24 30 F2 0F 11 74 24 20 45 89 F1 48 89 FA E8 17 F4 FE FF 48 8B 7C 24 78 
48 8B 5C 24 68 85 C0 0F 88 A4 00 00 00 48 98 48 39 E8 0F 82 EA 00 00 00 48 
8B 54 24 38 48 01 D0 48 39 C7 73 AD 48 89 FD 48 D1 ED 48 01 FD 48 39 C5 48

(... muchas muchas muchas más lineas)

Ejemplo de código máquina

¿Qué es eso? Eso es el código máquina, es decir, el código binario necesario para que tu procesador ejecute el programa. Este es el único lenguaje que entiende tu procesador.

Cada instrucción se corresponde con una operación básica específica que la CPU puede ejecutar. Por ejemplo, sumar dos números, transferir datos de un lugar a otro en la memoria, o comparar dos números. Operaciones muy básicas y sencillas.

Las instrucciones disponibles varían entre arquitecturas y modelos de procesadores. Un antiguo x86 8088 tenía entre 81 instrucciones. Un procesador moderno puede tener varios cientos de instrucciones disponibles.

El código máquina utiliza las instrucciones elementales llamándolas por su “código de operación” (opcode). Que es, simplemente, una representación numérica que le damos a cada instrucción.

opcodes

Pila de instrucciones

Como vemos, el código máquina es totalmente dependiente del hardware subyacente. Cada procesador tiene su propio conjunto de instrucciones, sus opcodes y su propia estructura de registros.

Esto significa que el código máquina escrito para una arquitectura de procesador en concreto no es directamente compatible con otro procesador diferente. Ese montón de bytes sólo va a funcionar en un procesador de un tipo.

Otra característica evidente del código máquina es que su legibilidad es baja. Debido a que está escrito en una secuencia de ceros y unos, es muy difícil para los humanos entenderlo y mantenerlo. Además, el código máquina carece de abstracciones y estructuras de control avanzadas que se encuentran en lenguajes de programación de alto nivel.

Aunque os parezca mentira, al principio de la programación se programaba así. Y como os imaginaréis, era un infierno programar en eso. Era un proceso muy lento, complicado, y propenso a errores. Por eso pronto surgieron otros lenguajes, como Ensamblador, que permitían hacer el proceso más sencillo.

Aunque el código máquina se considera (y es) un lenguaje de programación de bajo nivel, su uso directo en el desarrollo de aplicaciones modernas es muy limitado. Por no decir prácticamente nulo.

En la actualidad, la mayoría de los programadores utilizan lenguajes de programación de alto nivel, como C++ o Python, que ofrecen abstracciones y estructuras de control más amigables para el desarrollo de software.