programas maquina lenguaje instrucciones historia explicados ensamblador ejemplos desde cero assembler assembly

assembly - maquina - Acabo de terminar de aprender el lenguaje ensamblador x86. ¿Qué puedo hacer con eso?



lenguaje maquina pdf (12)

Acabo de terminar de aprender el lenguaje ensamblador. Pero no pude entender qué podría implementar (para práctica / como proyecto pequeño). Sería genial si es algo útil para cualquier persona.


Sería genial si es algo útil para cualquier persona.

Te has familiarizado con el funcionamiento de bajo nivel de las computadoras. Poder leer ensamblador puede ayudarlo a comprender cómo se comporta su compilador.

El resto puede llamar a algunas críticas, porque refleja una visión polarizada. Un día después de un lamentable proyecto integrado, mi mentor me dijo: "Si alguien que trabaja para usted escribe en asamblea, despídalo para que conserve su propio trabajo". Estoy de acuerdo con él. Desde un punto de vista programático, escribir en el montaje es demasiado problemático.


Dependiendo de qué tan bien haya aprendido el ensamblaje, podría intentar escribir el firmware para microprocesadores pequeños o incluso para dispositivos pequeños conectados a su computadora. También podría intentar escribir aplicaciones de software completas en ensamblaje y darles una interfaz gráfica de usuario atractiva.

En general, desde mi experiencia, el ensamblaje no es tan útil en la programación de proyectos de software masivos porque para muchas aplicaciones, la velocidad realmente no importa (al menos, no en los días de procesadores multi-core) así que lo que puedes hacer es algo limitado


Esto puede parecer muy cliché, pero podría intentar responder algunas de las preguntas en projectueler usando ensamblaje.


Hoy, el ensamblador se usa en estas áreas:

  • Desarrollo Kernel / OS. Pregúnteles a los chicos de Linux o revisen los otros proyectos de sistema operativo que hay.
  • Desarrollo del compilador (alguien tiene que traducir los lenguajes de nivel superior a la CPU)
  • Desarrollo de controladores
  • Dispositivos embebidos (pero cada vez más se están moviendo a lenguajes de nivel superior, también ... mi decodificador ejecuta Python)
  • Desarrollo de juegos para efectos especiales (pero esto es principalmente en dialectos ensambladores específicos para la tarjeta gráfica)

Mejoramiento. Aprenda cómo usar el VTune de Intel si programa en Windows. Aquí puedes ver dónde están tus cuellos de botella. Luego, vuelva a escribir esas rutinas en ensamblador.

Como la mayoría de los softwares modernos cambian todo el tiempo, esto es más un ejercicio intelectual y una auto satisfacción para que algo funcione más rápido que beneficios en el mundo real.

Hay una o dos personas que han reescrito muchas de las primordiales de núcleo C, memcpy, memset, etc. en el ensamblador adaptado a la CPU de tiempo de ejecución. Por lo tanto, el código es más grande ya que tiene rutinas adicionales para aprovechar las extensiones de CPU, SSE, etc., pero más rápido. Estos primitivos C a menudo terminan en muchos paquetes .dlls ya que la mayoría de los programas hacen cosas de memoria todo el tiempo.


Por lo menos, ahora puede exportar un ensamblador desde gcc de esta manera:

gcc -c -S test.c -o test.asm

Luego puede inspeccionar la salida del código C generado para fines educativos.


Puede aprender cómo funciona el sistema operativo a bajo nivel (interrupciones, memoria virtual, etc.). Primero, escriba un gestor de arranque que le proporcione acceso completo al hardware, luego podrá comenzar a jugar con el modo protegido, la programación VGA y más.

Dos buenos recursos:
http://wiki.osdev.org/Main_Page
http://www.osdever.net/FreeVGA/home.htm

[Editar]

Si desea obtener información sobre optimizaciones, visite el sitio web de Agner Fog: http://agner.org/optimize/ .

[Editar]

Copiado del comentario de Simucal:

Es posible que desee agregar un enlace a MikeOS también. Es un pequeño sistema operativo escrito en Assembly que está diseñado como una herramienta de aprendizaje para ver cómo funcionan los sistemas operativos simples. Tiene código y documentación bien comentados: mikeos.berlios.de


Puede buscar un robot o un controlador que pueda conectarse a su puerto paralelo y escribir algunos manejadores de teclas geniales para controlarlos. También puede interceptar las llamadas de la BIOS como Int13 for Disk y escribir algunas herramientas de duplicación de disco, controladores RAID, etc. Puede conectar algunos transductores como Temp / vibración / presión, etc. y realizar alguna adquisición de datos.


Puede echar un vistazo al proyecto liboil:

http://liboil.freedesktop.org/wiki/

Es una biblioteca para innerloops altamente optimizados.

La mayoría de los bucles ya tienen una implementación de ensamblador x86, pero aún quedan algunos bucles para reescribir.


Si ya es desarrollador en un lenguaje de programación de nivel superior, el lenguaje ensamblador le permite crear rutinas / funciones optimizadas. No sé sobre los demás, pero Delphi, por ejemplo, le permite integrar perfectamente el código ensamblador en cualquier unidad, y se ocupa de los parámetros de la función, etc.


Supongo que podrías probar code-golf

También hay al menos un sistema operativo escrito para la PC en el ensamblaje: MenuetOS . (No tengo idea de por qué.) Pueden querer contribuciones.

Entiendo que antes de la invención de C en la década de 1970, la mayoría de los sistemas operativos se escribieron en ensamblaje directo. No recomendaría hacer eso, pero podrías escribir un programa independiente, solo por diversión. Tenga en cuenta que la CPU se iniciará en el modo de 16 bits y es bastante difícil lograr que cambie a 32 bits. Probablemente sea mejor simplemente escribir el programa independiente en 16-bit x86. Puede usar un simulador para el desarrollo.


Uno de mis pasatiempos favoritos es Ingeniería inversa.

Requiere un sólido conocimiento de ensamblaje y el uso de desensambladores / depuradores para recorrer el código compilado. Esto le permite alterar, comprender e invertir los programas compilados. ¡Cada nuevo programa es como un rompecabezas esperando a ser resuelto!

Por ejemplo, muchas personas invierten juegos como Minesweeper cuando recién comienzan.

Aquí hay una captura de pantalla de una sección clave del código en Minesweeper I invertido un tiempo atrás (comentarios en el lado derecho):

Esto se localizó colocando un punto de interrupción en las llamadas a la función rand() y retrocediendo en la pila de llamadas. Después de excavar, resulta obvio que:

  1. Minefield Height se encuentra en 0x1005338
  2. Minefield Width se encuentra en 0x1005334
  3. Minefield Baseaddress se encuentra en 0x1005340

Con este conocimiento, es fácil determinar la ubicación de cualquier mina en el campo de minas de la siguiente manera:

cellAddress = mapBaseAddress + (32 * (y+1)) + (x+1);

Entonces, con un simple bucle y algunas llamadas a ReadProcessMemory() ¡tienes el mejor hack Minesweeper!

Leer el ensamblaje escrito a mano es mucho más fácil que leer el ensamblaje generado por la máquina. Los compiladores modernos hacen algunas cosas mágicas y locas para el código para la optimización que a veces puede ser difícil de seguir. Por lo tanto, esto definitivamente impulsará su conocimiento de ensamblaje.

Hay muchas actividades que pueden derivarse de esto:

  1. Invertir API ocultas en las bibliotecas
  2. ¡Graba hacks avanzados de juegos usando DLL Injection, Code Caves, Function Hooking y más!
  3. Comprender las limitaciones de varios esquemas de protección empleados por el software
  4. Invierta un formato de archivo que no está publicado o conocido y escriba el código para leer este formato con fines de interoperabilidad.
  5. Escribir emuladores para varios sistemas (¡incluyendo sistemas de juegos antiguos!)
  6. Comprenda cómo un programa conocido hace una tarea en particular.
  7. Invierta malware y virus para ver cómo y qué hacen.

¡Y más!

Si está interesado, le sugiero encarecidamente el libro: Inversión: secretos de la ingeniería inversa