pentium language instruction assembly x86 x86-64 low-level

assembly - language - list of x86 instructions



Para aprender a ensamblar, ¿debería comenzar con 32 bits o 64 bits? (4)

pero quiero una mejor comprensión de lo que está sucediendo en un nivel más bajo

Si realmente quieres saber todo lo que está sucediendo en un nivel inferior en los procesadores / sistemas x86 / x64, realmente recomendaría comenzar por lo básico, es decir, el código de modo real 286/386. Por ejemplo, en el código de 16 bits, se ve obligado a utilizar la segmentación de la memoria, que es un concepto importante para comprender. Los sistemas operativos actuales de 32 y 64 bits todavía se inician en modo real, luego cambian a / entre los modos relevantes.

Pero si está interesado en el desarrollo de aplicaciones / algoritmos, es posible que no desee aprender todas las cosas de bajo nivel del sistema operativo. En su lugar, puede comenzar de inmediato con el código x86 / x64, dependiendo de su plataforma. Tenga en cuenta que el código de 32 bits también se ejecutará en Windows de 64 bits, pero no al revés.

Realmente quiero aprender ensamblaje. Soy bastante bueno en c / c ++, pero quiero una mejor comprensión de lo que está sucediendo en un nivel inferior.

Me doy cuenta de que las preguntas relacionadas con la asamblea se han hecho antes, pero solo estoy buscando alguna dirección que sea particular para mi situación:

Estoy ejecutando Windows 7, y estoy confundido acerca de cómo debería comenzar a trabajar con el ensamblaje. ¿Debo comenzar con x64 porque estoy ejecutando Windows 7? Algunas personas han dicho ''empiecen con 32 bits primero'' - ¿cómo hago esto? ¿Qué tiene que ver mi sistema operativo con mi capacidad para escribir el ensamblaje para "32" o "64" bits? De hecho, ¿qué significa ensamblado ''n bit'', donde n es un número?

Editar:

Aquí hay algunos enlaces que me han ayudado a comenzar con el ensamblaje; otros que recién están comenzando pueden encontrarlos útiles. Seguiré actualizando esta lista mientras continúo en mi viaje de asamblea :)

Nota: Como he estado aprendiendo, he decidido enfocarme en la programación con masm32. Por lo tanto, la mayoría de los recursos a continuación se centran en eso.

  • wiki de etiquetas x86 (guías para principiantes, manuales de referencia, documentación de ABI y más).
  • www.masm32.com
  • X86 Assembly WikiBook
  • X86 Disassembly WikiBook (ideal para entender algunas convenciones, y los conceptos básicos de cómo el código de nivel superior se traduce en ensamblaje)
  • WinAsm IDE (juega muy bien con masm32)
  • Introducción: ensamblaje para Windows (todos los ejemplos de código son para masm32)
  • Lista de interrupciones
  • Tutorial de ensamblaje (ideal para ayudar a comprender los conceptos básicos)
  • x86 Guía de montaje
  • Los recursos de optimización de software de Agner Fog , incluyendo algunas cosas buenas sobre convenciones de llamadas en diferentes plataformas (Windows vs. Linux / OS X), así como una gran cantidad de ejemplos de cómo hacer cosas específicas de manera eficiente. No es ideal para principiantes totales, pero ideal para lectores de nivel intermedio a avanzado.

    (También tiene información de rendimiento detallada para cada instrucción para las CPU Intel y AMD, excelente para la micro optimización de rendimiento serio. Algunos principiantes tal vez quieran ver algo de eso para empezar a pensar cómo funcionan las CPU y por qué puede hacer algo camino en lugar de otro.)


Empecé a escribir ensamblajes en 1977 tomando la ruta larga: primero aprendiendo operaciones básicas (y, o, xor, no) y matemática octal antes de escribir programas para DEC PDP-8 / E con OS / 8 y 8k de memoria. Esto fue en 1977.

Desde entonces, he descubierto algunos trucos sobre cómo aprender a ensamblar para arquitecturas con las que no estoy familiarizado. Han sido algunos: 8080/8085 / Z80, x86, 68000, VAX, 360, HC12, PowerPC y V850. Pocas veces escribo programas independientes, generalmente son funciones que están vinculadas con el resto del sistema, que generalmente se escribe en C.

Primero debo ser capaz de interactuar con el resto del software que requiere aprender el paso de parámetros, diseño de la pila, creación del marco de la pila, posiciones de los parámetros, posiciones de variables locales, descartar el marco de la pila, valores devueltos, retorno y limpieza de la pila . La mejor manera de hacerlo es escribir una función que llame a otra función en C y examinar la lista de códigos generada por el compilador.

Para aprender el lenguaje ensamblador mismo, escribo un código simple, viendo lo que genera el compilador y paso a paso en un depurador sin formato. Tengo los manuales de instrucciones cerca para poder buscar instrucciones de las que no estoy seguro.

Una cosa buena de conocer (además del manejo de la pila mencionado anteriormente) es cómo el compilador genera el código de la máquina dado un cierto constructo de lenguaje de alto nivel. Una de estas secuencias es cómo las matrices / estructuras indexadas se traducen en punteros. Otra es la secuencia de código de máquina básica para bucles.

Entonces, ¿qué es un "depurador sin formato"? Para mí, es un depurador que forma parte de un paquete de desarrollo simple y que no intenta protegerme del hardware como el depurador Visual (es). En él, puedo cambiar fácilmente entre depuración de fuente y ensamblaje. También comienza rápidamente desde dentro del desarrollo IDE. No tiene tres mil características, más probablemente treinta y esas serán las que usará el 99.9% del tiempo. El paquete de desarrollo generalmente será parte de un instalador donde haga clic una vez para la aprobación de la licencia, una vez para aprobar la configuración predeterminada (¿no le encanta cuando alguien ha pensado en ello y lo ha hecho por usted?) Y una última vez para instalarlo .

Tengo un entorno de desarrollo simple favorito para x86-32 (IA-32) y es OpenWatcom. Puede encontrarlo en openwatcom.org.

Soy bastante nuevo en x86-64 (AMD64) pero la transición parece directa (al igual que cuando se pasa de x86-16 a x86-32) con algunos trucos adicionales, como los registros extra r8 a r15 y que los registros principales son 64 bits amplio. Recientemente me encontré con un entorno de desarrollo para XP / 64, Vista / 64 y 7/64 (probablemente también funciona para el sistema operativo del servidor) y se llama Pelles C (pellesc.org). Está escrito y mantenido por un Pelle Orinius en Suecia y de las pocas horas que he pasado puedo decir que está destinado a convertirse en mi favorito para x86-64. Probé los paquetes de Visual Express (instalan mucha basura, ¿sabe cuántas desinstalaciones necesita hacer después? Más de 20) y también intentaron que gcc de un lugar trabaje con un IDE (eclipse u otra cosa) ) de otro.

Una vez que hayas llegado hasta aquí y te encuentres con una nueva arquitectura, podrás pasar una o dos horas mirando la lista generada y después de eso, sabrás a qué otra arquitectura se parece. Si las construcciones de índice y bucle parecen extrañas, puede consultar el código fuente que las genera y quizás también el nivel de optimización del compilador.

Creo que debo advertirles que una vez que lo dominen, notarán que en los escritorios cercanos, en la máquina de café, en las reuniones, en los foros y en muchos otros lugares, habrá personas esperando para despreciarlos, burlarse de ellos. usted, envíe cotizaciones incompletas a usted y brinde consejos desinformados / incompetentes por su interés en el montaje. Por qué hacen esto, no lo sé. Tal vez ellos mismos son programadores ensambladores fallidos, tal vez solo conocen OO (C ++, C # y Java) y simplemente no tienen ni idea de qué es el ensamblador. Tal vez alguien que "conocen" (o que un amigo suyo sabe) que es "realmente bueno" puede haber leído algo en un foro u oído algo en una conferencia y por lo tanto puede ofrecer una verdad absoluta sobre por qué el ensamblaje es un desperdicio completo de hora. Hay muchos de ellos aquí en .


Obtén IDA pro. Son las rodillas de las abejas para trabajar con el ensamblaje.

Personalmente, no veo mucha diferencia entre 32 bits y 64 bits. No se trata de los bits, sino del conjunto de instrucciones. Cuando hablas de ensamblaje, hablas de conjuntos de instrucciones. Tal vez están implicando que es mejor aprender de un conjunto de instrucciones de 32 bits. Sin embargo, si ese es su objetivo, sugiero los libros de algoritmos de Donald Knuths: enseñan algoritmos en términos de un conjunto de instrucciones de 7 bits: D

Para cuestiones de portabilidad, sugiero que en lugar de ensamblar en línea, aprenda a usar los intrínsecos del compilador: será la mejor optimización para optimizaciones no integradas. :RE


Cuando las personas se refieren al ensamblaje de 32-bit y de 64-bit , están hablando de qué conjunto de instrucciones Ia32 veces también se denominan Ia32 y x64 en el caso de Intel, de lo que supongo que estás preguntando. Están sucediendo muchas más cosas en el caso de 64 bits, por lo que comenzar con 32 bits probablemente sea bueno; solo necesita asegurarse de que está ensamblando su programa con un ensamblador de 32 bits en un binario de 32 bits. Windows aún sabrá cómo ejecutarlo.

Lo que realmente recomiendo para comenzar con el ensamblaje sería algo con un conjunto de instrucciones más simples para manejarlo. Ve a aprender el ensamblaje de MIPS : el simulador de spim es genial y fácil de usar. Si realmente desea sumergirse directamente en el mundo ensamblador de Intel, escriba un pequeño programa en C que llame a sus rutinas de ensamblaje; hacer toda la configuración y desmontaje para un "programa real" es un gran desastre, y ni siquiera podrás comenzar allí. Así que simplemente escriba un contenedor C con main() y compile y vincule eso con los archivos objeto que obtiene al escribir su código ensamblador.

Por favor, no se acostumbre a escribir ensambles en línea en su código C: es una pesadilla de portabilidad de códigos, y no hay razón para ello.

Puede descargar todos los manuales del desarrollador de software Intel 64 e IA-32 Architectures para comenzar.