¿Vale la pena aprender el lenguaje ensamblador? [cerrado]

92

¿Todavía vale la pena aprender ASM ?

Sé un poco de él, pero realmente no lo he usado o aprendido correctamente porque todo lo que aprendo a hacer en ensamblador lo puedo hacer en una décima parte del tiempo con algún lenguaje como C o C ++. Entonces, ¿debería realmente aprender y usar ASM? ¿Me hará algún bien profesionalmente? ¿Aumentará mi ingenio? En resumen, ¿me convertiría en un mejor programador?

Nota: estoy hablando de ensamblaje de bajo nivel como FASM o NASM y no algo como HLA (Ensamblador de alto nivel).

AprendizHacker
fuente
2
Tenga en cuenta que el lenguaje ensamblador está vinculado a un procesador / controlador.
rmflow
7
¿Quieres decir que no es multiplataforma?
ApprenticeHacker
2
Ok, entonces hay un lenguaje ensamblador diferente para cada procesador ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker
3
Un lenguaje ensamblador diferente para cada familia de procesadores. El código 386 se ejecuta en cualquier procesador x86 posterior, incluidas las ofertas de Intel y AMD, pero algunos conjuntos de características son extensiones de propiedad. El idioma es el mismo para estas instrucciones adicionales, pero el binario resultante no será portátil.
Spraff

Respuestas:

107

Aprendí del libro de Kip Irvine . Si ignora las críticas (justas) de sus bibliotecas (irrelevantes), puedo recomendarlo como una buena introducción al lenguaje en sí, aunque para las cosas realmente interesantes debe buscar obsesivos en la red.

Creo que es útil comprender lo que sucede en los niveles inferiores. A medida que investigue sobre ensamblador, aprenderá sobre canalización de CPU, predicción de rama, alineación de caché, SIMD, reordenación de instrucciones, etc. El conocimiento de estos le ayudará a escribir mejor código de alto nivel.

Además, la sabiduría convencional es no intentar optimizar manualmente el ensamblaje la mayor parte del tiempo, sino dejar que el compilador se preocupe por ello. Cuando vea algunos ejemplos de las cosas retorcidas que generan los compiladores, comprenderá mejor por qué se sostiene la sabiduría convencional.

Ejemplo: los LFSR se ejecutan rápido con la instrucción rotate-with-carry, para casos específicos como este es tan fácil escribir la versión del ensamblador como descubrir si el compilador es lo suficientemente inteligente como para resolverlo. A veces simplemente sabes algo que el compilador desconoce.

También aumenta su comprensión de los problemas de seguridad: escritura o ejecución, desbordamientos de pila, etc.

Algunos problemas de concurrencia solo se hacen evidentes cuando se da cuenta de lo que está sucediendo en el nivel por instrucción.

A veces puede ser útil al depurar si no tiene el código fuente completo.

Ahí está el valor de la curiosidad. ¿Cómo se implementan las funciones virtuales de todos modos? ¿Alguna vez ha intentado escribir programas DirectX o COM en ensamblador? ¿Cómo se devuelven las estructuras grandes, la función de llamada ofrece un espacio para ellas o viceversa?

Luego están los lenguajes ensambladores especiales para hardware de gráficos, aunque los lenguajes de sombreado alcanzaron un alto nivel hace unos años, cualquier cosa que te permita pensar en un problema de una manera diferente es bueno.

Spraff
fuente
7
Respuesta bien escrita +1. Aprender y usar son dos cosas diferentes, aprender es una buena idea, cuándo / si usarlo viene con experiencia.
old_timer
Para dar un ejemplo, Linus Torvalds usa un desensamblador para depurar su código, así que creo que tiene un buen conocimiento del ensamblaje x86.
Ivanzinho
52

Me parece interesante que tanta gente se apresure a decir que sí, necesita / debería aprender a ensamblar. Para mí, la pregunta es ¿cuánto montaje necesita saber? No creo que tengas que saber ensamblar como un lenguaje de programación, es decir, no creo que todos deban poder escribir un programa en ensamblador, pero por otro lado, poder leerlo y entender lo que realmente Los medios (que pueden requerir más conocimiento de la arquitectura que el ensamblador) son suficientes.

Seguro que no puedo escribir ensamblado (es decir, escribir cualquier pieza de código no trivial en ensamblaje), pero puedo leerlo y eso, junto con el conocimiento de la arquitectura de hardware real, y las convenciones de llamada que se están utilizando, es suficiente para analizar el rendimiento, y identificar qué parte del código C ++ fue la fuente de ese ensamblado.

David Rodríguez - dribeas
fuente
4
¿Quiere decir que debería aprender los comandos básicos de push, pop, mov e invoke ?
ApprenticeHacker
10
Estoy de acuerdo, la necesidad de conocer el ensamblaje depende mucho de la rama de programación con la que esté trabajando. Web / escritorio / base de datos? Olvídese del ensamblador. ¿Juegos de computadora y gráficos? Podría ser algo útil. ¿Desarrollo de SO o sistemas integrados en tiempo real? Es un deber. Y así.
Lundin
1
Estás tergiversando las otras respuestas: nadie dice que necesitas / deberías aprender a ensamblar; solo que es útil o que vale la pena, según la pregunta. Sin embargo, tu respuesta sigue siendo relevante.
Luc Danton
1
@burningprodigy: Creo que debe tener un conocimiento básico de cómo están las instrucciones en el ensamblador que usa (es decir, cuál es el orden de los argumentos y similares), y una comprensión muy básica de algunos comandos, qué carga o una tienda lo es. Luego, si necesita mirar alguna pieza de ensamblaje, puede usar una referencia para comprender cada una de las instrucciones y, al hacerlo, comenzará a aprender los conceptos básicos que necesita.
David Rodríguez - dribeas
1
Estoy de acuerdo. Especialmente, solo con saber el ensamblaje obtendrá, en el mejor de los casos, poco en la evaluación de la eficiencia en las CPU modernas. Si ese es el objetivo, un poco de conocimiento básico de ensamblaje con una parte justa de los conceptos básicos de arquitecturas de computadoras es mucho más útil. La mayoría de las veces que necesito ensamblar es buscar en volcados de programas optimizados o por diversión (es decir, cosas de seguridad, escribir un mini kernel, ..). Pero no recuerdo la última vez que cambié una decisión de diseño debido a mis conocimientos de montaje.
Voo
27

Sí, la razón principal para aprender a ensamblar para los desarrolladores de C y C ++ es que ayuda a comprender lo que sucede bajo el capó del código C y C ++. No es que realmente vaya a escribir código en ensamblador, pero podrá observar el desensamblaje del código para evaluar su eficiencia y comprenderá cómo funcionan mucho mejor las diferentes características de C y C ++.

diente filoso
fuente
23

Vale la pena aprender muchos idiomas diferentes, de muchos paradigmas diferentes. Aprender Java, C ++, C # y Python no cuenta, ya que todos son instancias del mismo paradigma.

Como el ensamblaje está en la raíz (bueno, cerca de la raíz) de todos los lenguajes, por mi parte digo que vale la pena aprender ensamblador.

Por otra parte, vale la pena aprender un lenguaje de programación funcional, programación lógica, lenguajes de scripting, lenguajes basados ​​en matemáticas. Solo tiene un tiempo limitado, por lo que debe elegir y elegir.

David Hammen
fuente
Y luego, cuando finalmente todos ellos han aprendido y piensa que tiene una idea de lo que está pasando, se descubre J .
Micha Wiedenmann
4

Conocer ASM también es útil al depurar, ya que a veces todo lo que tiene es "volcado ASM del error".

ain
fuente
2

¿Tiene algún uso para ello en lo que planea hacer? ¿Le ayudará de alguna manera en lo que hace actualmente o planea hacer? esas son las dos preguntas que debe hacerse, la respuesta a esas es la respuesta a su pregunta.

En un sentido más general, sí, diría que en mi opinión vale la pena aprender asm (algo como x86 o arm), lo bien que te sirve depende de lo que programes y de cómo lo depures.

Necrolis
fuente
2

Depende del nivel de programación que desee alcanzar. Si necesita trabajar con depuradores, SÍ. Si necesita saber cómo funcionan los compiladores, SÍ. Cualquier ensamblador / depurador depende de la CPU, por lo que hay mucho trabajo, solo verifique la familia x86 qué tan grande y antigua es.

GJ.
fuente
¿Quizás te refieres a la CPU dependiente de la familia?
Romeno