2010-02-28 13 views
48

Realmente estoy deseando aprender ensamblaje. Soy bastante bueno en c/C++, pero quiero una mejor comprensión de lo que está sucediendo en un nivel inferior.Para aprender a ensamblar, ¿debería comenzar con 32 bits o 64 bits?

que darse cuenta de que las cuestiones relacionadas con la asamblea se han preguntado antes, pero sólo estoy buscando alguna dirección que es particular, a mi situación:

Estoy Windows 7 corriendo, y estoy confundido acerca de cómo debería empezar a trabajar con montaje ¿Tengo tengo para 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:

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

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

  • tag wiki (guías para principiantes, manuales de referencia, documentación ABI, y más.)
  • www.masm32.com
  • X86 Assembly WikiBook
  • X86 Dissassembly WikiBook (grandes para la comprensión de algunas convenciones y los fundamentos de cómo traduce el código más alto nivel en el montaje)
  • WinAsm IDE (juega muy bien con masm32)
  • Intro: Assembly for Windows (todos los ejemplos de código son para masm32)
  • List of Interrupts
  • Assembly Tutorial (ideal para ayudar a entender los conceptos básicos)
  • x86 Assembly Guide
  • Agner Fog's Software optimization resources, incluyendo algunas cosas buenas acerca de convenciones de llamada en diferentes plataformas (Windows vs. Linux/OS X), así como muchos 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 CPUs Intel y AMD, excelente para la micro optimización de rendimiento serio. Algunos principiantes pueden querer ver algo de eso para empezar a pensar cómo funcionan las CPU, y por qué podría hacer algo de una manera en lugar de otra.)

+1

Considere la posibilidad de "Programación desde cero" –

+0

Buena suerte amigo. El ensamblaje de escritura es una verdadera carga. No estoy tratando de desalentarlo, pero maldita sea, es toda la empresa – HumbleWebDev

Respuesta

33

Cuando la gente se refiere a 32-bit y 64-bit montaje, que están hablando, que del conjunto de instrucciones que va a utilizar - también llamados a veces Ia32 y x64 en el caso de Intel, que supongo que estás preguntando acerca . 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 montaje sería algo con un conjunto de instrucciones más simples para manejar. Vaya a aprender MIPS assembly - el simulador 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 en línea el ensamblado en su código C - es una pesadilla de portabilidad de código, y no hay razón para ello.

Puede descargar toda la Intel 64 and IA-32 Architectures Software Developer's Manuals para empezar.

+0

Esto es útil, gracias. La diferencia de conjunto de instrucciones tiene sentido ... ¿es esa la única diferencia? Al igual que, ¿hay alguna diferencia en la forma en que se ejecutará un programa escrito en 32 bits en comparación con un programa de 64 bits? Si no, ¿por qué se llaman 32 bits/64 bits, en lugar de "conjunto de instrucciones A" y "conjunto de instrucciones B", por ejemplo? – Cam

+2

@incrediman, el conjunto de instrucciones es una gran diferencia. Los conjuntos de instrucciones tienen diferentes nombres, pero la gente simplemente usa 32 bits/64 bits como abreviatura. Además, existen diferentes convenciones de llamada (ABI) entre los dos conjuntos de instrucciones, e incluso dos ABI de 64 bits que compiten entre sí. –

+0

"Por el momento, solo haremos codificación de 32 bits, por lo que los registros internos en la CPU, para nosotros, serán de 32 bits. Cada bit es capaz de almacenar 1 o 0." (http://www.friedspace.com/assembly/cpuregs1.php) ... ¿Esta es una diferencia adicional entre 32 y 64 bit asm? Si no, ¿qué intenta decir esa frase? Gracias! – Cam

3

Obtener IDA pro. es las rodillas de las abejas para trabajar con el conjunto.

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 Donald Knuths sobre algoritmos: 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 compiladores intrínsecos: será la mejor optimización para optimizaciones no integradas. : D

+1

Por lo que estoy leyendo, es un desensamblador ... así que, en realidad escribir/codificar algún código de lenguaje ensamblador no es posible, ¿verdad? Si es así, esto es solo una media respuesta. –

+1

Trabajar con ensamblado en estos días (incluso en terrenos integrados) se trata de realizar ajustes en el código generado por un compilador C/C++. IDA hace que este trabajo sea lo menos doloroso posible. –

+0

Eso puede ser, pero todavía no respondió a mi pregunta original tan bien :) – Cam

0

pero quieren una mejor comprensión de lo que está pasando a un nivel inferior

Si realmente quiere saber todo lo que está pasando a un nivel inferior en x86/x64 procesadores/sistemas, lo haría muy recomiendo comenzar con 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.

+1

El tiempo de inicio no es la única forma de bajo nivel para interactuar con un sistema; Creo que escribir ensamblajes nativos para programas de SO es una buena manera de comenzar. Escribir y depurar sistemas de arranque no es para los débiles. –

+2

Comprender los segmentos de 16 bits es tan útil como aprender cómo funcionan los números romanos. Y en cuanto a comenzar en modo real para arrancar su propio sistema operativo, tomaría un par de años de estudio a menos que simplemente se imprima "El BIOS me entregó estos valores de registro en la pantalla xxxx xxxx". Las cosas de bajo nivel, como leer/escribir puertos de hardware en los controladores de dispositivos, serían un buen uso para el código ensamblador, incluso si no eres un genio de los asm. –

+0

+1 para el modo real de 16 bits! – dns

20

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 de montaje para arquitecturas 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 está escrito en C.

Primero que nada, debo ser capaz de interactuar con el resto del software que requiere aprendizaje el paso de parámetros, el diseño de la pila, la creación del marco de la pila, las posiciones de los parámetros, las posiciones de las variables locales, el descarte de la estructura de la pila, los valores devueltos, la limpieza de retorno y 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 en sí, escribo un código simple, viendo lo que genera el compilador y paso a paso a través de él en un depurador sin procesar. 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 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.

¿Qué es un "depurador sin procesar?" 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 adicionales r8 a r15 y que el principal los registros tienen 64 bits de ancho. 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 has llegado hasta aquí y te encuentras con una nueva arquitectura, podrás pasar una o dos horas mirando la lista generada y después de eso sabes muy bien 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 advertirle que una vez que el cuelgue de ella se dará cuenta de que en las mesas de cerca, en la máquina de café, en las reuniones, en los foros y muchos otros lugares habrá personas que esperan para despreciar usted , burlarse de ti, lanzarte citas incompletas y dar consejos desinformados/incompetentes por tu 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 stackoverflow.

+0

Excelente respuesta (gracias por agregarla a pesar de la edad de la pregunta), pero no fue necesario convertirla en wiki de la comunidad: ¡se merece un representante! :) – Cam

+0

Gracias Cam. Sentí que la pregunta necesitaba algo más ... ¡cómo hacerlo en la práctica! –

+0

@OlofForshell Olof, me gustaría hablar con usted alguna vez. Si está interesado en hablar en ensamblador, mi dirección de correo electrónico es [email protected] Siéntase libre de enviarme un mensaje en cualquier momento, lo contactaré nuevamente. – zeboidlund

Cuestiones relacionadas