2011-07-08 36 views
64

¿Todavía vale la pena aprender ASM?¿Vale la pena aprender el lenguaje ensamblador?

Conozco un poco, pero realmente no lo he usado o no lo aprendí correctamente porque todo lo que aprendo hacer en ensamblador lo puedo hacer en 1/10 de las veces 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 haría un mejor programador?

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

+1

Tenga en cuenta que el lenguaje ensamblador está vinculado a un procesador/controlador. – rmflow

+1

¿Quieres decir que no es multiplataforma? – ApprenticeHacker

+0

No. Por ejemplo: http://www.worldofspectrum.org/Z80instructions.html – rmflow

Respuesta

78

Lo aprendí de Kip Irvine's libro. Si ignoras las críticas (justas) de sus bibliotecas (irrelevantes), puedo recomendarlo como una buena introducción al idioma en sí, aunque para el realmente cosas interesantes tienes que buscar obsesivos en la red.

Creo que es útil entender lo que sucede en los niveles inferiores. A medida que investigas el ensamblador, aprenderás sobre el pipeline, predicción de bifurcación, alineación de caché, SIMD, reordenamiento de instrucciones, etc. El conocimiento de estos te ayudará a escribir un mejor código de alto nivel.

Además, la sabiduría convencional es no tratar de optimizar a mano el montaje 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ápidamente con la instrucción rotar-con-cargar, 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 descubrirlo. Algunas veces you just know something que el compilador no.

También aumenta la comprensión de que los problemas de seguridad - write-o-ejecutar, los excesos de pila, etc.

Algunos concurrency cuestiones sólo se hacen evidentes cuando se da cuenta de lo que sucede en el nivel por la instrucción.

A veces puede ser útil para la depuración si no tiene el código fuente completo.

Existe la curiosidad. ¿Cómo se implementan las funciones virtuales de todos modos? ¿Has intentado alguna vez escribir programas DirectX o COM en ensamblador? ¿Cómo se devuelven las estructuras grandes? ¿Ofrece la función de llamada un espacio para ellas o viceversa?

Luego, hay idiomas especiales para el ensamblaje de hardware de gráficos, aunque los lenguajes de sombreado fueron de alto nivel hace algunos años, cualquier cosa que le permita pensar en un problema de otra manera es bueno.

+3

Bien escrito respuesta +1. Aprender y usar son dos cosas diferentes, aprender que es una buena idea, cuándo/si usarla viene con la experiencia. –

20

Sí, la razón principal para aprender el ensamblaje para los desarrolladores de C y C++ es ayudar a entender lo que sucede bajo el código C y C++. No es que realmente va a escribir código en ensamblado, pero podrá ver el desensamblaje de código to assess its efficiency y comprenderá cómo las diferentes características de C y C++ funcionan mucho mejor.

2

¿Tiene alguna use para ello en lo que planea hacer? ¿Te ayudará de alguna manera en lo que actualmente haces o piensas hacer? esas son las dos preguntas que debe hacerse, la respuesta a ellas es la respuesta a su pregunta.

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

3

Conocer ASM también es útil para la depuración, ya que a veces todo lo que tienes es "volcado de ASM del error".

14

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

Como el ensamblado está en la raíz (bueno, cerca de la raíz) de todos los idiomas, por mi parte, creo que vale la pena aprender a ensamblar.

Por otra parte, vale la pena aprender un lenguaje de programación funcional, programación lógica, lenguajes de scripting, lenguajes matemáticos. Usted solo tiene mucho tiempo, entonces tiene que escoger y elegir.

33

Me parece interesante que tanta gente salte a decir que sí, que necesita/debe aprender a ensamblar. Para mí, la pregunta es ¿cuánto ensamblaje necesitas saber? No creo que tenga que saber ensamblar como un lenguaje de programación, es decir, no creo que todos puedan escribir un programa en ensamblador, pero por otro lado, ser capaz de leerlo y entender qué es en realidad significa (lo que podría requerir más conocimiento de la arquitectura que el ensamblador) es suficiente.

que con seguridad no puede escritura montaje (es decir, escribir cualquier pieza no trivial de código en el montaje), pero puedo leerlo y que 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 e identificar qué parte del código C++ fue la fuente de ese ensamblaje.

+2

¿Quieres decir que debería aprender los comandos básicos ** push, pop, mov e invoke **? – ApprenticeHacker

+6

Acepto, la necesidad de saber ensamblar depende mucho de la rama de programación con la que esté trabajando. ¿Web/escritorio/base de datos? Olvida al ensamblador. Juegos de computadora y gráficos? Podría ser algo útil. ¿Desarrollo del sistema operativo o sistemas embebidos en tiempo real? Es obligatorio. Y así. – Lundin

+1

Está tergiversando las otras respuestas: nadie dice que ** necesita/debería ** aprender a ensamblar; solo que es útil o que vale la pena, según la pregunta. Su respuesta sigue siendo relevante sin embargo. –

2

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

+0

¿Puede que te refieres a dependiente de la familia de CPU? – Romeno