Principalmente escribimos programas en lenguaje de alto nivel. Así que mientras estudiaba me encontré con el lenguaje ensamblador. Entonces, un ensamblador convierte el lenguaje ensamblador a lenguaje máquina y un compilador hace lo mismo con lenguaje de alto nivel. Encontré que el lenguaje ensamblador tiene instrucciones como mover r1 r3, mover un 5, etc. Y es bastante difícil de estudiar. Entonces, ¿por qué se creó el lenguaje ensamblador? ¿O fue el primero antes del lenguaje de alto nivel? ¿Por qué estoy estudiando ensambladores en mi clase de ingeniería informática?
programming-languages
education
history
Nithin Jose
fuente
fuente
Respuestas:
"Entonces, ¿por qué se creó el lenguaje ensamblador?"
El lenguaje ensamblador se creó como una abreviatura exacta para la codificación a nivel de máquina, para que no tenga que contar 0s y 1s todo el día. Funciona igual que el código de nivel de máquina: con instrucciones y operandos.
"¿Cuál vino primero?"
Wikipedia tiene un buen artículo sobre la historia de los lenguajes de programación
"¿Por qué estoy estudiando ensambladores en mi clase de ingeniería informática?"
fuente
Bueno, en realidad solo necesitaremos un idioma , que se llama "lenguaje de máquina" o "código de máquina". Se parece a esto:
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:
Estos valores corresponden a:
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):
¿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í:
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:
Esto suena como nuestra adición desde arriba, asumiendo que
x
está en el registro 1,y
está en el registro 2 yz
debería terminar en el registro 3. Pero ¿qué pasa con esta línea?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í:
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).
fuente
Sí, el ensamblaje fue uno de los primeros lenguajes de programación que utilizó texto como entrada, en lugar de soldar cables, usar placas de conexión y / o interruptores de encendido. Cada lenguaje ensamblador se creó para un solo procesador o familia de procesadores, ya que las instrucciones se asignaron directamente a los códigos de operación ejecutados por el procesador.
Si necesita programar controladores de dispositivos o escribir compiladores, comprender el funcionamiento de un procesador es invaluable, si no es necesario. La mejor manera de entender esto es escribir un código en ensamblador.
Si observa cómo un compilador escribe código, es común ver opciones para llamar a convenciones que, sin conocer el ensamblaje, probablemente no se puedan entender.
Si tiene que resolver un error y la única entrada que tiene es un volcado de núcleo , entonces definitivamente necesita conocer el ensamblado para comprender la salida, que es el código de ensamblaje y, si tiene suerte, aumentar con declaraciones de nivel superior de un lenguaje de alto nivel.
fuente
Permítanme agregar un aspecto menos práctico. Esta (probablemente) no es una razón histórica, sino una razón para usted hoy.
El ensamblaje (en comparación con los idiomas de alto nivel) está desnudo . No oculta nada (que se hace en software), y es simple en el sentido de que tiene un conjunto de operaciones relativamente pequeño y fijo.
Esto puede ser útil para el análisis exacto del algoritmo. La semántica y el flujo de control son tan simples que se puede contar todas las operaciones (o el número esperado) anotando el gráfico de flujo de control con conteos de transición (probabilidades). Knuth hace esto en sus libros TAoCP con gran efecto, demostrando algunos de los análisis de algoritmos más rigurosos que existen.
Anécdota: mi colega aprendió a leer el Bytecode de Java exactamente para este propósito.
fuente
Hay respuestas aquí:
¿Cuándo necesitamos lenguaje ensamblador? en Programmers.SE
¿Por qué todavía se necesita lenguaje ensamblador si tenemos lenguajes de alto nivel que ofrecen herramientas sofisticadas? en Stackoverflow
¿Por qué estudiar lenguaje ensamblador? por Gary L. Burt
Todas estas respuestas apuntan a:
fuente
Ensamblado = código de máquina
Algunas personas siguen insistiendo en cómo el lenguaje ensamblador es diferente de los códigos numéricos que entiende la CPU.
Esto (si bien es cierto) pierde completamente el punto.
En cuanto a la traducción, el lenguaje ensamblador y el numérico (binario, hexadecimal) son la misma cosa.
Agrúpelo o suéltelo
Si grok ensamblaje ya sabe cómo funciona una computadora real.
montaje de grokking implica:
multiscalar
significaSi compila bien, tiene una idea casi completa de cómo funciona la CPU conectada a su teclado.
Necesita usar este conocimiento como un cirujano cerebral usa su bisturí.
No necesita abstracciones apestosas
A menos que asimile el ensamblaje (y, por lo tanto, la CPU en la mesa de operaciones), nunca estará libre de las garras de las abstracciones de la máquina RAM (o Dios no lo quiera, el horror de la máquina Turing ).
El ensamblaje L33t Hax0r 5k1llz
también le ayuda a comprender cómo el 133thax0r logra derrotar los esquemas de protección. (P: ¿por qué ASLR no funciona ? Porque lo
mov rax,fs:[28h]
rompe ).El 0.1%
No es el conocimiento del ensamblaje lo que importa, sino el conocimiento de la máquina en la que trabaja.
Si desea conocer la máquina, debe comprenderla y eso significa hablar el idioma de la máquina.
Si no lo haces, entonces estás atrapado con la abstracción.
Eso es ciencia y eso es bueno, pero esa nunca es la imagen completa.
Es como aprender a hablar Xhosa
A menos que apuntes al nivel de gurú, mejor sigue con lo que sabes, esos clics complicarán tu vida .
Porque es divertido.
fuente
Para salir conmigo mismo, primero aprendí RPG II usando un IBM System 32, y luego aprendí APL en un 370. Tenía que ver con el tamaño y la velocidad. Mi mantra era más pequeño y más rápido. El ensamblaje es el lenguaje más compacto y rápido que existe. Haría programas de prueba tanto en C como en Asamblea. Donde los programas C requerirían 100's de Kb, un programa de Asamblea equivalente a menudo sería menos de 5 Kb. Cuando estudiaba la salida del compilador de C, encontraba código que verificaba y volvía a verificar los parámetros, hacía verificaciones condicionales de posibles errores que a menudo eran raros y exóticos y bastante innecesarios, todo lo cual tomó tiempo, pero la mayor acumulación de memoria estaba pasando absolutamente todo hacia y desde la pila.
En el entorno de programación actual, escribir código proporciona un nivel adicional de seguridad y protección. Ser capaz de leer información directamente desde una pieza de hardware que no es accesible para lenguajes de alto nivel, le permite encriptar con Assembly de una manera que un programa solo puede usarse en esa máquina en particular. Por ejemplo, encriptar una clave de usuario utilizando la dirección MAC de la interfaz de red y luego estacionar esa clave en un sector específico no registrado del disco duro y luego marcar el sector como defectuoso para que otros archivos no puedan sobrescribirlo. Por supuesto que pierdes el sector, pero ¿qué es eso? ¿2048 o 4096 bytes de miles de millones o billones?
fuente