¿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).
programming-languages
assembly
nasm
AprendizHacker
fuente
fuente
Respuestas:
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.
fuente
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.
fuente
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 ++.
fuente
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.
fuente
Conocer ASM también es útil al depurar, ya que a veces todo lo que tiene es "volcado ASM del error".
fuente
¿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.
fuente
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.
fuente