Estaba mirando el problema 48 del proyecto Euler :
La serie, 1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317.
Encuentra los últimos diez dígitos de la serie, 1 1 + 2 2 + 3 3 + ... + 1000 1000 .
En Python puedo hacer esto con una sola línea:
sum((x**x for x in xrange(1,1001))
Pero el equivalente de montaje de esto sería 100 líneas y un verdadero desafío.
¿Debería hacer algunos de estos rompecabezas en ensamblaje para obtener una idea de la programación de bajo nivel y entender cómo funciona realmente la computadora?
self-improvement
assembly
Nishant
fuente
fuente
*
en Python?Respuestas:
Más allá del aprendizaje ensamblado, creo que aprender cómo se compila un lenguaje de bajo nivel como el C es muy valioso. Entonces mi respuesta es sí, pero de nuevo probablemente sea parcial porque disfruto de la programación de bajo nivel.
Por ejemplo, simplemente entendiendo cómo se compilan las declaraciones simples. La siguiente función,
... se convierte (al menos un poco interesante):
Este código toma el argumento de la pila (val, el parámetro a func), lo desplaza a la izquierda 2 lugares (multiplíquelo por 2 ^ 2 o 4) y luego agrega el valor original al resultado. El resultado final es una multiplicación por 5. Un ejemplo como este ilustra una serie de cosas a tener en cuenta, como las optimizaciones del compilador. En lugar de llamar a una instrucción para multiplicar directamente por 5, cambia dos lugares para multiplicar por 4 y luego agrega el valor original. Encontré ejemplos como este para mejorar en gran medida mi comprensión de las cosas en un nivel inferior.
Genere la salida del ensamblador desde gcc con la
-S
opción Sin embargo, tenga en cuenta que los resultados variarán según el compilador y el nivel de optimización.De todos modos, no creo que ser un programador de lenguaje ensamblador sea lo mismo que entender ensamblar . Nuevamente, siento que programar en un lenguaje como C y saber cómo se pone en el código de la máquina es una práctica valiosa.
fuente
Probablemente no sea necesario para poder escribir ensamblador (la mayoría de los cuales son detalles de la convención de inicialización y de llamada para su sistema).
Vale la pena entender algunos, en caso de que esté intentando depurar algo sin fuente.
PERO definitivamente vale la pena entender la máquina al menos al nivel de 'C' y punteros (esencialmente un ensamblador de alto nivel) para que sepa por qué es malo concatenar una cadena un millón de veces en un bucle.
fuente
for i in range(1000000): s = s + '.'
(t mucho) peor que las versiones "optimizadas" que estoy reutilizandos
. Del mismo modo, varios otros desarrollos invalidan lo que es una suposición razonable con conocimiento de C y suponiendo una implementación ingenua. Pero en general es más útil que perjudicial. Solo tenga en cuenta que las implementaciones de lenguaje a veces son más inteligentes que usted;)Buena pregunta. Learning Assembly es definitivamente bueno y vale la pena el esfuerzo.
fuente
Si y no.
Si bien es cierto que le dará una mejor comprensión de lo que está haciendo su código y por qué algunas cosas son solo una mala idea, debe pensar en el esfuerzo.
El ensamblador de aprendizaje no es un proyecto de fin de semana, te llevará mucho tiempo y debes pensar si este tiempo podría o no aprovecharse mejor.
Si no te gusta el código optimizado, es probable que nunca veas beneficios iguales al esfuerzo que pones.
fuente
Hice mucho ensamblador cuando era más joven y no creo que haya ayudado a entender nada fuera del ensamblador. Si echas un vistazo al ensamblador moderno, todo es material de lenguaje macro de todos modos. Por lo general, odio las analogías, pero de todos modos: ¿saber cómo funciona el motor de un automóvil lo convierte en un mejor conductor?
fuente
La forma en que he estado trabajando para entender el ensamblador es escribiendo programas en lenguajes de nivel superior, luego reemplazando partes con (al menos con suerte) secciones funcionalmente equivalentes de código ensamblado. Esto significa que puedo usar HLL para lo que son buenos para organizar y resolver problemas de alto nivel, y uso asm para golpear el metal.
(Cuando hablo sobre el programa host escrito en un HLL, me refiero a C u ObjC cuando intento aprender x86_64 asm, y BASIC cuando estoy trabajando en Z80, 6502 y 6809 asm).
fuente