¿Por qué necesitamos lenguaje ensamblador?

27

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?

Nithin Jose
fuente
13
Assembler es un código de máquina legible por humanos, por eso.
Andrej Bauer
44
Porque es importante saber cómo funcionan las cosas cuando estamos cerca del hardware. Cuando escribimos ensamblaje entendemos cómo funciona y funciona el hardware de las computadoras en un nivel bajo. La mejor manera de hacerlo es el lenguaje ensamblador, ya que el lenguaje máquina es tedioso y no se puede leer como el ensamblado. ¿Realmente preferirías usar una caja mágica y nunca mirar dentro?
Spencer Wieczorek

Respuestas:

32

"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?"

Aunque es cierto, es probable que no se encuentre escribiendo la aplicación de su próximo cliente en conjunto, todavía hay mucho que ganar aprendiendo el ensamblaje.

Hoy en día, el lenguaje ensamblador se usa principalmente para la manipulación directa del hardware, el acceso a instrucciones especializadas del procesador o para abordar problemas críticos de rendimiento. Los usos típicos son controladores de dispositivos, sistemas integrados de bajo nivel y sistemas en tiempo real.

El lenguaje ensamblador es lo más cercano al procesador que puede obtener como programador, por lo que un algoritmo bien diseñado es excelente: el ensamblaje es ideal para la optimización de la velocidad. Se trata de rendimiento y eficiencia. El lenguaje ensamblador le brinda un control completo sobre los recursos del sistema. Al igual que una línea de ensamblaje, usted escribe código para insertar valores individuales en registros, maneja direcciones de memoria directamente para recuperar valores o punteros. (fuente: codeproject.com )

Tyler y amigos
fuente
29

¿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 xestá en el registro 1, yestá en el registro 2 y zdeberí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).

Chris Cooper
fuente
2
En principio, nada nos impide construir CPU que funcionen directamente con lenguaje ensamblador. ASCII es solo una codificación ineficiente para este propósito, eso es todo.
Raphael
Gracias por la adicion. Estoy de acuerdo, pero lo omití para entender el propósito de la asamblea. Agregaré una nota.
Chris Cooper
15

Entonces, ¿por qué se creó el lenguaje ensamblador? ¿O fue el primero antes del lenguaje de alto nivel?

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.

¿Por qué estoy estudiando ensambladores en mi clase de ingeniería informática?

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.

Guy Coder
fuente
14

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.

Rafael
fuente
4

Hay respuestas aquí:

Todas estas respuestas apuntan a:

  • Optimización de velocidad / memoria
  • Comprender cómo funciona la máquina
  • Entonces los programadores de Noob se convierten en expertos
  • Si conoce el ensamblaje, sabe cómo escribir compiladores para su lenguaje High Lvl
  • etc.
compski
fuente
1
¿Compartes todos estos puntos de vista? Cual es tu experiencia (En particular, el tema "Así los programadores de Noob se convierten en expertos" me parece anticuado por varias décadas).
Raphael
woah woah no tienes que ponerte tan nervioso sobre este tema. Solo estoy vinculando las respuestas a su pregunta duplicada. Y el "So Noob Programmers Become Experts" fue el más votado aquí . Ve a discutir con él, no conmigo =)
compski
1
No soy delicado, estoy tratando de ayudarlo a que su respuesta sea buena (actualmente no lo es, ya que solo se vincula a unos pocos recursos, ninguno de los cuales responde completamente la pregunta). Incluir sus propios pensamientos de manera comparativa es un primer paso para ese fin. (Tenga en cuenta que al relacionar la opinión de manera excluyente, les asigna un valor; en otras palabras, debe poder argumentar por qué valora la opinión lo suficiente como para (re) publicar es como una respuesta.)
Raphael
Bueno, mi experiencia es que realmente odio y me cuesta aprender idiomas de ensamblaje después de acostumbrarme a algunos lenguajes de programación de alto nivel. Y sé que aquellos que son buenos programadores o que conocen C ++ / C de antemano pueden programar bastante bien en ASM. No pensé que mi opinión fuera lo suficientemente valorada como para ser publicada en mi respuesta, por eso ...
compski
Tu primer enlace está roto.
Hola Soy Edu Feliz Navidad
1

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:

  • Aprender las instrucciones y lo que significan (duh).
  • Comprender lo que hacen las instrucciones, lo que no hacen y todos sus efectos secundarios .
  • Aprender cómo una CPU procesa las instrucciones
    • Cómo funciona la tubería.
    • Que multiscalarsignifica
    • Qué es un núcleo de CPU.
    • Cómo funciona el caché.
    • Comprender cómo contar el ciclo
    • aprendiendo las enseñanzas de Agner Fog
  • Comprender cómo los compiladores generan código y cómo fallan a veces.
  • Optimización de problemas bien definidos y muy específicos.

Si 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.

Johan - reinstala a Mónica
fuente
1
El uso más frecuente de la palabra grok en un artículo que he encontrado
rekciltnuc
-1

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?

Brian3163
fuente
1
¿Qué significa "no accesible a idiomas de alto nivel"?
David Richerby