Tengo 15 años y sé bastante sobre computadoras, pero quiero aprender a ensamblar. ¿Recomendaciones sobre sitios que puedan enseñarme sobre el montaje?

Obtendrá mucho menos apoyo para su aprendizaje de ensamblaje que el que teníamos en los 80, eso es seguro. Y el ensamblaje se ha vuelto más complejo con los sistemas y los procesadores se han vuelto mucho más complejos.

En primer lugar, olvídate de este meme que Mohd Shahril Zainol Abidin habla: “Los compiladores son mucho mejores que los humanos”. Eso es total y completo … respetuosamente mal. Lea el prólogo de “El Arte de la Asamblea” sobre ese meme, que voy a vincular unas líneas debajo de “¿Qué tiene de malo la Asamblea?”.

Y con esto, aquí está el primer libro que puedes leer, es “mierda vieja”, significa desde 1996, pero tiene todo lo que quieres saber. Simplemente ignora la programación de DOS y la segmentación de memoria de 16 bits y todo eso. Solo salta esa parte, el resto estará bien.

El arte de la programación en lenguaje ensamblador

Es bueno comenzar el ensamblaje a tu edad. Tenía tu edad cuando comencé, no tenía libros, solo un amigo que estaba haciendo lo mismo y ningún maestro. Aún así, estaba haciendo mis primeros programas de ensamblaje en el C64 justo después de una semana. Después de una semana que tuve esa cosa, no después de una semana de aprendizaje.

Sin embargo, podría llevarte un poco más de tiempo hoy.

Entonces, haga el código x86_64 y concéntrese en los ejemplos que funcionan con eso. Ignora la vieja basura de 32 bits, no la necesitarás y ya nadie más usa el código de 32 bits. No hay razón para eso si su computadora no es una arquitectura de 32 bits, como lo son algunos de los procesadores ARM en el mundo integrado.

Pero eso es otra cosa.

Más sobre eso aquí: Ensamblaje de Linux y aquí: convenciones de llamada x86
Y aquí: Wikilibros, libros abiertos para un mundo abierto.

Entonces, el enlace que Mohd ha proporcionado “¿Usar GCC para producir ensamblajes legibles?” Es un buen ejemplo de cómo son realmente los compiladores de mierda. Aparte del punto que el código que puede ver es toda la basura de 32 bits, que ninguna persona sensata codificaría hoy, incluso en esas pocas líneas es un código terrible, terrible.

Si hicieras una cosa así y yo fuera tu profesor, te arrancaría la cabeza por eso. Tienes que llegar a algo mucho mejor que eso, si quieres sobrevivir. Incluso esas pocas líneas no son más que horribles y me hacen sentir dolor. Por favor, trate de averiguar por qué es así.

Y deja de lado ese tonto meme de que los compiladores hacen un mejor código que incluso el codificador humano más ignorante.

Lo siguiente que debes hacer es instalar el Nasm como tu compilador principal y el Fasm. Ambos tienen algunos directorios de ejemplo que puedes estudiar.

Entonces es posible que desee echar un vistazo a PC Assembly Book, también hay algunos buenos ejemplos. Especialmente el ensamblaje de Linux es de interés. A tu edad, concéntrate totalmente en Linux como tu entorno. Eso es divertido, está abierto, no tiene dinero y usted puede ver y aprender, se le permite ver el código, cambiarlo, adaptarse, resolverlo, jugar con él.

Y cuando tienes 25 años y quizás un ingeniero, Windows ya está muerto de todos modos. Así que no pierdas el tiempo en un barco que se hunde. Y con una buena base de Linux puedes hacer todo en este nuevo mundo. Desde aplicaciones de servidor, bases de datos y supercomputación hasta los sistemas integrados más pequeños con Raspberry Pi y Arduinos. O lo que quieras entre esos extremos.

Además, es la base para la mayoría de los proyectos científicos, incluidos los proyectos ISS y la mayoría de los proyectos de la NASA. Realmente no funcionan con Windows. Entonces, si quieres hacer algo, elige tu sistema sabiamente. Y los gráficos son un lastre, si no los necesitas.

Con Windows, estarás atrapado en algunas aplicaciones de mierda para hacer clic alrededor de maniquíes y ayudarles a encontrar los botones para hacer clic en tu trabajo. Y haz los botones grandes y coloridos y agradables. Como si eso le interesara a nadie mas que al marketing.

No hay diversión en eso y sin diversión no aprenderás nada.

Por lo tanto, deshacerse de todo arrastre y poner en marcha sus refuerzos.

Y aquí algunos más enlaces para ti.

Recursos de lenguaje ensamblador. Realmente, ¿qué tan difícil puede ser?

Vayamos a la cadena de herramientas.

Va a utilizar algunos Kubuntu | La distribución de Linux de Friendly Computing, Kubuntu lo hace bien, pero puede elegir lo que quiera. No es tan importante de qué distribución es, si encuentra mucho apoyo de la base de usuarios. El soporte para Ubuntu es realmente bueno. Y no es solo para hombres con barbas muy largas, puedes hacerlo totalmente a tu edad.

Me gusta todo el entorno de Raspberry Pi. Esas personas realmente se dirigen a los jóvenes como tú. Así que encontrarás un gran apoyo allí. Pero el ensamblaje es diferente y no admiten tanto ensamblaje en el RasPi. Solo empezaron a llevar a los niños a C recientemente y lejos de Python.

Su compilador y su cadena de herramientas serán los de GCC. Ese es mi consejo, usa todo sobre GCC, pero el ensamblador. El gas es simplemente horrible.

Cambie todas sus herramientas, como Objdump y así sucesivamente a la sintaxis de Intel. Comienza a aprender y trabajar en la sintaxis de Intel. Sí, los nativos dicen que la sintaxis de AT&T para Linux, pero el único ensamblador que realmente soporta eso es el Gas. El gas es una herramienta pésima. Y AT&T es más difícil de leer, no es tan agradable y fácil como Intel.

Puede llegar a otra conclusión usted mismo, pero luego veremos nuevamente en la mitad de un año y nuevamente hablaremos sobre eso. Y usted, como yo, estará maldiciendo mientras tiene que reescribir todo su código de AT&T a Intel, porque el ensamblador es tan horrible.

Yo uso Nasm. También puede elegir Fasm, pero ese ensamblador apunta más al hardware de la PC / procesadores Intel / AMD, mientras que Nasm es una buena herramienta para todo tipo de objetivos. Es un buen ensamblador y funciona bien con el enlazador de GCC y todo el entorno.

Hay algunas cosas que hablan del ensamblador plano “Fasm”, pero no estoy convencido, incluso si esa es una gran herramienta. Algunas cosas que hacen son muy bonitas. En general, Nasm fue mi primera opción e implementé algunas de las sutilezas de Fasm para mi herramienta. Solo porque hay buenas ideas en el Fasm. Es una buena herramienta, pero tampoco funciona tan bien con la cadena de herramientas GCC como lo es Nasm. Explicarlo todo ahora superaría el alcance de tu pregunta. Simplemente hazlo.

Nasm es la corriente principal. Así que no haces nada malo con eso.

Para la depuración, use el Gdb o use algún frontend gráfico DDD o Kdbg, que sería nativo en KDE / Plasma para usted. El QTcreator es también una herramienta de elección. Si realmente quieres utilizar la GUI mientras trabajas, orienta el texto.

Personalmente, quiero seguir estando en la consola de texto cuando trabajo con texto, así que uso VIM, tmux para varias ventanas o el terminal / Konsole de KDE. También he elegido el Zsh para mi shell principal, utilizando la expansión oh-my-zsh y algunas otras cosas.

Luego solo haz algunas cosas pequeñas y en lugar de solo leer, hacerlo es la mejor escuela. No debe haber más del 50% de lectura. La codificación es más importante que cualquier otra cosa. Solo hazlo, incluso si es una mierda al principio, mejorarás. Compara tu código con la salida del compilador. Al principio puedes aprender una u otra cosa de tu compilador. Eso se irá pronto.

Roba de él, pero no mires atrás, si empiezas a golpearlo. Aún así, hay para un principiante lo que debe aprender. Y nunca subestimes esa máquina. Cuando de repente te das cuenta: “¡Jaja, no está usando ENTER! Eso es mucho mejor ”, debes saber que ENTER es más lento que lo que GCC hace. Pero LEAVE no es más lento que escribir los comandos por separado.

http://www.agner.org/optimize/in… estas tablas de instrucciones de Agner Fog son una de las cosas a tener en cuenta. Averigüe qué procesador tiene y dónde están sus fortalezas y dónde sus debilidades. Mi procesador es el Piledriver AMD FX-6300, una cosa realmente buena, echa un vistazo al tuyo. Y donde están las fortalezas. Y como cosecharla.

Su compilador es solo un compañero de arenero no tan agudo que superará rápidamente, pero que puede ayudarlo con sus primeros pasos.

Aquí algunas formas de hacer “Hello World”, la forma del sistema:

; Hola Mundo
; Hanno Behrens 2016 https://plus.google.com/u/0/+HannoBehrens

; obtener las llamadas al sistema incluidas
% incluye “unistd_64.inc”

; protección de la pila
% ifidn __OUTPUT_FORMAT __, elf64
sección .note.GNU-stack noalloc noexec nowrite progbits
%terminara si

inicio global

STDOUT equ 1

SECCION. Texto
rel predeterminado
_comienzo:
putc:
; Imprimir AL, AH debe ser 0
;Parámetro
; rdi = canal 1 = stdout
; rsi = cadena
; rdx = len

empujar STDOUT; stdout
pop rdi; chan = stdout
lea esi, [msg]; rsi: = sp (apunta a char + 0) (predeterminado rel!)
empujar MSG_LEN
pop rdx
% si STDOUT == SYS_write
mov eax, edi
%más
empujar SYS_write; escribir (canal = rdi, búfer = rsi, len = rdx)
rax pop
%terminara si
syscall

salida:
xor edi, edi; código de salida 0
empuje SYS_exit; Byte de empuje de 3 bytes; registro de pop
rax pop
syscall llamando a exit ()

msg: db `¡Hola mundo! \ n`
MSG_LEN es igual a $ -msg

Compila y tira para hacerla realmente pequeña:

nasm -O3 -s -felf64 hello.asm -o hello.o
ld -nostartfiles -nostdlib -z noexecstack -s -o hola hola.o
strip -x -R .comment -R .note -R .note.ABI-tag -R .note.gnu.build-id -R .gnu.hash –strip-all hello

El mismo estilo C y con eso es mucho más fácil de leer y escribir, simplemente comenzaría, si fuera usted, escribiendo un ensamblaje en estilo C y solo después de eso iría al estilo de programación del sistema anterior. Es un poco más grande en código, debido a las bibliotecas C vinculadas, pero está bien por ahora. Es importante que mantener una alta tasa de producción para sus programas, escribir muchos pequeños es más importante que escribir un gran proyecto, así que aquí está la vía C, que es donde debe centrarse en el momento:

; protección de la pila
% ifidn __OUTPUT_FORMAT __, elf64
sección .note.GNU-stack noalloc noexec nowrite progbits
%terminara si

Texto de la sección
rel predeterminado
puestos externos
principal global

principal:
mov edi, msg
llamada pone

xor eax, eax
jubilado

SECCION de datos

msg: db `¡Hola mundo!`, 0

; Seccion bss

Compilar:

nasm -O3 -s -felf64 hello_c.asm -o hello_c.o
cc -O3 -s -Wl, -s, -z, noexecstack -o hello_c hello_c.o

Sé que solo pregunta por recursos, pero permítame contarle sobre mi propia experiencia pasada sobre cómo aprendí autoaprendizaje en lenguaje ensamblador y qué tomé para lograrlo. He incorporado muchos recursos en línea útiles que pueden ayudarlo a lograr sus esfuerzos y curiosidad sobre el lenguaje ensamblador.

De mi experiencia anterior, si quieres estudiar y conocer ensamblaje (¿estás hablando de x86 aquí?), Estos son los pasos que tomé anteriormente:

Si ya conoces C, salta al paso 3.

  1. Familiarízate con C, especialmente con temas como el puntero. LearnCpp es el sitio que solía aprender C antes. Contiene tanto C (al principio) como C ++ en la mitad superior de su contenido.
  2. (Opcional pero muy recomendable) Para familiarizarse con los conceptos de C, haga muchas prácticas (como resolver los problemas de Codechef o hacer sus propios proyectos) y asegúrese de leer las preguntas más votadas de Stack Overflow (con C / Etiquetas C ++). Si tiene tiempo, lea también el C-Faq.
  3. Instala la distribución de Linux que más te guste. Hay muchas distribuciones disponibles, pero para principiantes, se recomienda Ubuntu, ya que tiene muchos apoyos de la comunidad en comparación con otras distribuciones.
  4. Una vez que haya adquirido confianza en las habilidades de su C, tome un libro de ensamblaje de PC que fue escrito por el Dr. Paul Carter. Es gratis.
  5. (Opcional pero muy recomendable) Para conocer cómo manejar el lenguaje ensamblador, lea mucho sobre el sistema operativo. Temas como administración de memoria, conocimientos básicos de CPU como registros, cachés de CPU, más y más.
  6. Para perfeccionar su ensamblaje, cree un proyecto básico utilizando el conocimiento que obtuvo del libro del paso cuatro. Es muy importante porque al hacerlo sabrás mucho sobre cómo implementar el lenguaje en un proyecto real, en lugar de solo aprender la teoría. Anteriormente, creé un programa que puede convertir números de una base a otra, pero bueno, quizás tenga mejores ideas, todos tengan su propia creatividad para aprender cosas. 😉
  7. (Opcional pero muy recomendable) Intente comprender el código de máquina generado por los compiladores de alto nivel. Te sorprenderá saber que los compiladores son mucho más inteligentes cuando generamos códigos de máquina muy optimizados que nosotros, humanos. Aprenderás muchos trucos increíbles haciendo esto. Lea aquí sobre cómo hacer eso.
  8. ???
  9. Beneficios

Muy bien, eso es todo (de mí), aprender ensamblaje no es un viaje fácil, debes tener mucho compromiso, curiosidad y ganas de aprender cosas. No es un idioma que se puede pasar alrededor de una semana y saber todo sobre él. Es un viaje de por vida y, si cavas más, encontrarás muchas cosas interesantes que las personas hicieron al usar el conocimiento de ensamblaje.

Todos tienen sus propios objetivos diferentes para aprender este lenguaje obsoleto , pero créanme al tener este conocimiento, sus habilidades de programación se elevarán de un nivel a otro.

Manuales de desarrollo de software de arquitecturas Intel® 64 e IA-32