¿Por qué necesitamos lenguaje ensamblador?
Bueno, en realidad solo necesitaremos un idioma , que se llama "lenguaje de máquina" o "código de máquina". Se parece a esto:
0010000100100011
Este es el único idioma que su computadora puede hablar directamente.Es el idioma que habla una CPU (y técnicamente, diferentes tipos de CPU hablan diferentes versiones). También apesta mirar e intentar entender.
Afortunadamente, cada sección del binario corresponde a un significado particular. Se divide en varias secciones:
0010|0001|0010|0011
operation type source register other source destination register
0010 0001 0010 0011
Estos valores corresponden a:
operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3
Entonces, esta operación agregaría los números en los registros 1 y 2 y pondría ese valor en el registro 3. Si literalmente coloca estos valores en una CPU y le dice "ir", agregará dos números para usted. La operación "restar" podría ser un 0011 o algo así, en lugar de 0010 aquí. Cualquier valor hará que la CPU haga una resta.
Entonces, un programa podría verse así (no intentes entenderlo, ya que inventé esta versión particular del código de máquina para explicar las cosas):
instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000
¿Esto apesta a leer? Seguro. Pero lo necesitamos para la CPU . Bueno, si cada código de máquina corresponde a una acción en particular, hagamos una simple taquigrafía "en inglés" y luego, una vez que comprendamos lo que está haciendo el programa, conviértalo en un código de máquina binario real y déselo a la CPU para que lo ejecute.
Entonces nuestra instrucción original de arriba podría verse así:
(meaning) operation type source register other source destination register
(machine code) 0010 0001 0010 0011
("English") add r1 r2 r3
Tenga en cuenta que esta versión en inglés tiene una asignación exacta al código de máquina . Entonces, cuando escribimos una línea de este "inglés", en realidad solo estamos escribiendo un código de máquina más amigable y más comprensible.
Bueno, esto es lenguaje ensamblador. Es por eso que existe, y por qué fue creado originalmente.
Para entender por qué lo necesitamos ahora, lea las respuestas anteriores, pero la clave que debe entender es esta: los lenguajes de alto nivel no tienen una sola representación es el código de máquina. Por ejemplo, en C, Python o lo que sea:
z = x + y
Esto suena como nuestra adición desde arriba, asumiendo que x
está en el registro 1, y
está en el registro 2 y z
debería terminar en el registro 3. Pero ¿qué pasa con esta línea?
z = x * 2 + (y / 6) * p + q - r
Intente representar esa línea en 16 bits de binario y decirle a una CPU "ir". No puedes El código de máquina no tiene una sola instrucción de operación para realizar una suma, resta y cualquier otra cosa con 4 o 5 variables a la vez. Entonces tiene que ser convertido a una secuencia primero de código de máquina. Esto es lo que haces cuando "compilas" o "interpretas" un lenguaje de alto nivel.
Bueno, tenemos programas para hacer eso, entonces, ¿por qué necesitamos ensamblar ahora? Bien, digamos que su programa se ejecuta más lentamente de lo que espera y desea saber por qué. Mirando la "salida" del lenguaje máquina de esta línea, podría verse así:
1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010
Solo para hacer esa línea de Python. ¿Entonces realmente quieres depurar eso?!?!?! NO . En cambio, le pide a su compilador que le proporcione amablemente el resultado en la forma que realmente puede entender fácilmente, que es la versión del lenguaje ensamblador que corresponde exactamente a ese código de máquina. Luego puede averiguar si su compilador está haciendo algo tonto e intentar solucionarlo.
(Nota adicional sobre el consejo de @ Raphael: en realidad, podría construir CPU que funcionen con otras cosas que no sean códigos binarios, como códigos ternarios (base 3) o decimales, o incluso ASCII. Sin embargo, para fines prácticos, realmente nos hemos adherido a los binarios).