elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Masm32
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Masm32  (Leído 4,999 veces)
Stuxnet

Desconectado Desconectado

Mensajes: 29



Ver Perfil WWW
Masm32
« en: 7 Noviembre 2012, 18:54 pm »

Next Generation Software

Introducción

Muchos recuerdan ensamblador como una necesidad complejo y tedioso cuando un lenguaje de alto nivel no ofrecer en términos de capacidad o rendimiento, sin embargo, siempre ha sido capaz de escribir aplicaciones de tamaño completo de una manera elegante y eficiente. MASM tiene la capacidad de escribir código modular adecuada que se convierte en una necesidad como un proyecto se hace más grande.
Ensamblador tiene la libertad de escribir el código que van desde la auto-impuesta enfoque estructural de la desenfrenada código libre, cada uno con sus respectivas ventajas. Auto-impuesto código modular tiene la ventaja de la organización, especialmente en proyectos de mayor envergadura en estilo libre tiene sus ventajas en la optimización del código corta distancia del bucle.

El rendimiento en el código ensamblador relación tamaño utiliza dos enfoques que se aprovecha de muchas de las técnicas de la eficiencia del lenguaje de alto nivel, tales como la reutilización de código al mismo tiempo ser capaz de centrarse específicamente en el código de velocidad crítica cuando sea necesario.

32 ensamblador poco es tanto más clara y más simple que el DOS y 16 bits de código de Windows y no es la maldición de la complejidad de la aritmética del segmento. Ya no tienen que lidiar con AX: DX pares de enteros largos y no hay límite de 64 KB impuestas por la estructura segmentada de software de 16 bits.

La complejidad de la escritura de 32 bits del software de Windows está relacionado con la estructura de Windows y la enorme gama de funciones en el conjunto de API. Se diferencia del código de DOS sólo en la medida en que los parámetros se pasan en la pila en lugar de en los registros como en las interrupciones de DOS.

Mientras que la enorme gama de funciones de la ventana puede ser un poco intimidante, sino que también pone en manos del programador de lenguaje ensamblador, un enorme conjunto de capacidades que no estaban disponibles en DOS.

Una de las ventajas de escribir en ensamblador es que cómodamente se encarga de la "C" el formato de la API de Windows sin ninguna dificultad. Cero cadenas terminado, estructuras, punteros, los tamaños de datos, etc .. son parte de la escritura ensamblador.



¿Cómo funciona MASM32?

Está diseñado para conectar a un equipo que tiene otros entornos de programación establecido en él y esto exige ciertas restricciones en el formato. Para evitar los problemas asociados a recoger las versiones de enlace mal y directorio de la biblioteca equivocada, obras MASM32 con las rutas especificadas a todos los archivos binarios que necesita para generar los archivos.

En el código fuente, las rutas a los archivos de la biblioteca se especifican y en los archivos de proceso por lotes que son utilizados por el editor para impulsar las opciones de generación, las rutas de cada archivo binario se especifica así.

Archivos de otras fuentes por lo general no construir a partir de MASM32 sin alguna modificación, por lo general la colocación de las directivas específicas MASM siguiente al principio del archivo de origen va a resolver la mayoría de los problemas. La otra es usar la "inclusión" y "includelib" sintaxis para el archivo de inclusión y bibliotecas para que sus caminos se puede encontrar.

     
Código:
0.386, las fuerzas de 32 bits de montaje 
      plana modelo, stdcall; modelo de la memoria y la convención de llamada.
      CaseMap opción: ninguno; caso sensible código

MASM32 utiliza su propia versión de "windows.inc". Es un archivo de más de 800k de tamaño y tiene un conjunto muy grande de iguala y las estructuras en que para 32 bits de programación de Windows. Siempre se debe poner antes de que el sistema se incluyen los archivos y bibliotecas.

Ejemplo

     
Código:
 include \ MASM32 \ include \ windows.inc, siempre el primero

      include \ MASM32 \ include \ user32.inc; sistema incluyen
      include \ MASM32 \ include \ kernel32.inc; siguiente archivo
      include \ MASM32 \ include \ gdi32.inc

      includelib \ MASM32 \ lib \ User32.lib, sistema de juego
      includelib \ MASM32 \ lib \ kernel32.lib, bibliotecas después de que
      includelib \ MASM32 \ lib \ gdi32.lib

MASM32 utiliza un conjunto de archivos de inclusión generados por el funcionamiento del sistema que se derivan de las bibliotecas. Para cada biblioteca, se utiliza el archivo de inclusión que corresponda. Para encontrar una función que necesita en función del material de referencia que está utilizando, busque en el sistema de archivo de inclusión para ver el archivo que tiene el prototipo de la función e incluir el archivo y la biblioteca correspondiente.

La mayoría de las funciones más comunes son en los tres grandes archivos DLL del sistema por lo que si nos fijamos en,

 
Código:
GDI32.INC; gráficos funciones relacionadas 
    KERNEL32.INC, núcleo del sistema operativo funciones
    USER32.INC; interfaz de usuario y varias otras funciones

    se encuentran la mayoría de las funciones comunes.

Para las funciones que no están en las principales bibliotecas, por lo general el material de referencia Microsoft especifica que la biblioteca de la función es en lo que si se mira en el archivo de inclusión para esa biblioteca, se encuentra el prototipo de la misma.

Hay dos fuentes de referencia principal para escribir en ensamblador 32 bits en Windows, para las instrucciones de ensamblador y la arquitectura general de la serie de procesadores x86, los tres (3) el volumen conjunto de archivos PDF a partir de Intel son los mejores disponibles y exhaustivamente documentada en el PIII la configuración manual.

La otra es Microsoft material de referencia. El más común es un archivo de ayuda llamado "Win32.hlp" que ahora es un poco fuera de fecha, pero todavía útil. Se trata de un archivo de ayuda de alrededor de 12 megas de tamaño. Si usted tiene el MSDN 2 juego de CDs, la información es más tarde y mucho más grande, pero es que también ocupa unos 800 megas de espacio en disco cuando se instala. Otra alternativa es los archivos de ayuda PlatformSDK sino que también son de aproximadamente el mismo tamaño.



Código de diseño

Con el uso de la sintaxis MASM alto nivel de "invocar", el código de Windows API se puede escribir mucho como idiomas compilador basado como "C" o "Pascal", la única diferencia real es que usted tiene que recoger el valor de retorno como un línea separada.

     
Código:
LOCAL ReturnValue: DWORD

    invocar FunctionName, par1, par2, par3, PAR4
    mov ReturnValue, eax

Esto está en el lugar de la forma menos legible,

     
Código:
impulsar PAR4 
    par3 empujar
    empuje par2
    empujar par1
    llamar FunctionName
    ReturnValue mov, eax

No es una ventaja considerable en términos de fiabilidad del código mediante el uso de la "invocar" la sintaxis de las llamadas a funciones que son de tipo compara con los prototipos de funciones en los archivos de inclusión que atrapa los desajustes de los parámetros.

Hay algunas situaciones en las que la pila manual de empujones y las llamadas a funciones son útiles, pero a menos que usted disfrute de la tipificación adicional y error de montaje que se derivan de la falta de comprobación de tipos, no hay ventaja en términos de velocidad de codificación y confiabilidad mediante la automatización de las llamadas a funciones API. Esto es particularmente evidente cuando la codificación de los bucles de mensajes con las pruebas condicionales anidadas.

Para cualquier que tienen que estar convencidos, hay un directorio en el código de ejemplo llamado "estilo antiguo", que muestra cómo es lento y propenso a errores de la técnica manual completo y sólo se basa en el mismo tamaño que el modelo genérico que utiliza el pseudo MASM alta nivel de la sintaxis.

El alto nivel [si -.. Endif] sintaxis permite una simulación razonable de la C " switch "en bloque o" Basic Select Case "la sintaxis que se pueden anidar en la forma normal y es aquí donde la codificación de alto nivel en claro su tipo de cuenta verdadera ventaja.

     
Código:
. Si var == 1 
        ; código condicional
    . elseif var == 2
        , código condicional
    más.
        ; código predeterminado
    . endif

El tradicional [cmp eax, valor - je etiqueta] produce pesadillas en la misma situación.

El uso de la simulación de alto nivel en MASM mejora el rendimiento del código de "hack" API de Windows de codificación de manera que las áreas más difíciles de la optimización del circuito y otros temas relacionados con el rendimiento se pueden abordar en un plazo razonable.

Cuando se utiliza la sintaxis MASM seudo alto nivel, que se están aprovechando de MASM "ensamblador macro" de la capacidad, que el código no se hinchan o en peligro de la misma manera que los datos se elaboran. Esta capacidad se puede ampliar por escrito "macros" que a automatizar las formas comunes de codificación.

Las siguientes macros pequeños MASM32 lo demuestra,

       
Código:
volver MACRO arg 
        mov eax, arg
        ret
      ENDM

  permite al programador para salir de la proc mensaje mediante el conocido "C",

     
Código:
return 0 

  que se expande por el ensamblador en,

 
Código:
 mov eax, 0 
    ret

Otra macro se utiliza,

     
Código:
 szText MACRO Nombre, Texto: vararg 
        LOCAL lbl
          jmp lbl
            Texto Nombre db, 0
          lbl:
        ENDM

  que permite que el texto sea incorporado directamente en el código.

       
Código:
szText Msg1, "Esta es una cadena terminada en cero" 
      invocar el cuadro de mensajes, Juin, Msg1 ADDR, ADDR szDisplayName, MB_OK

Esto permite mucho más intuitiva de codificación de tener que volver a la inicialización. Apartado de datos mediante,

     
Código:
 Msg1 db "Esta es una cadena terminada en cero", 0 

Datos integrados en la sección de código. Tiene una ventaja, ya que normalmente es mucho más difícil de encontrar y cortar y normalmente no se puede escribir de la misma manera que la sección. Datos. También es una forma eficiente de utilizar pequeñas cantidades de datos sin necesidad de colocarlo en la sección. Datos.

Para los programadores que desean mantener la posición más intuitiva de texto cerca del código que se utiliza al colocar los datos en la sección. Datos, hay una manera fácil de hacer precisamente eso, en línea escrita con el código fuente,

 
Código:
  . Datos 
      Msg1 db "Se trata de los datos escritos en la sección. datos", 0
    . código

  trabaja muy bien. Ml.exe resuelve el código y coloca los datos en la sección. Datos.

MASM32 intencionalmente ha evitado el uso de macros complejas, ya que no son fáciles de entender al principio, pero hay un considerable poder y la velocidad de codificación mediante la comprensión y el uso de macros escritas correctamente. La siguiente es una macro un poco más compleja que hace uso de un cuadro de mensaje estándar tan fácil como escribir en Visual Basic que puede utilizar el texto citado literalmente o direcciones directas de cero cadenas terminado o combinaciones de ambos.

   
Código:
 MsgBox hWnd, "Hola, estoy escrito en MASM32", "Saludos", MB_OK

Esta es la macro que produce el comando MsgBox.

      MsgBox MACRO Handl, TxtMsg, txtTitle, styl

        LOCAL Msg1
        Titl LOCAL

        Si @ InStr (1, <TxtMsg>, <addr>) eq 0
          @ Si InStr (1, <TxtTitle>, <addr>) eq 0
          . datos
            Msg1 TxtMsg db, 0
            db Titl txtTitle, 0
          . Código
            invocar mensajes, Handl , ADDR Msg1, ADDR Titl, styl
            EXITM
          EndIf
        EndIf

        Si @ InStr (1, <TxtMsg>, <addr>) gt 0
          @ Si InStr (1, <TxtTitle>, <addr>) eq 0
          . datos
            Titl txtTitle db, 0
          . Código
            invocar mensajes, Handl, TxtMsg, ADDR Titl , styl
            EXITM
          EndIf
        EndIf

        Si @ InStr (1, <TxtMsg>, <addr>) eq 0
          @ Si InStr (1, <TxtTitle>, <addr>) gt 0
          . datos
            Msg1 TxtMsg db, 0
          . Código
            invocar mensajes, Handl, ADDR Msg1, txtTitle , styl
            EXITM
          EndIf
        EndIf

        Si @ InStr (1, <TxtMsg>, <addr>) gt 0
          @ Si InStr (1, <TxtTitle>, <addr>) gt 0
            invocar mensajes, Handl, TxtMsg, txtTitle, styl
            EXITM
          EndIf
        EndIf

      ENDM

MASM32 se ha escrito sin ningún compromiso a los intereses o el formato de otros idiomas, se pretende potenciar al máximo las ventajas de escribir en un lenguaje de bajo nivel verdadero. El formato de los archivos de inclusión y el código de ejemplo utiliza tamaños de datos genéricos ensamblador en forma de BYTE, WORD, DWORD, QWORD. No intente poner en práctica las teorías abstractas de clases o cualquier otra técnicas de estratificación, sino simplemente para poner a disposición el verdadero poder bajo nivel de las mejores disponibles en ensamblador.

El tamaño de los datos se relacionan directamente con el tamaño de registro de la serie de procesadores x86 donde hay una correlación exacta entre el tamaño de los datos y los tamaños de registro.

  Registrarse tamaño de DATA

   
Código:
al = BYTE 8 bits 
    ax = palabra de 16 bits
    eax = DWORD de 32 bits
    mm (0) = QWORD 64 bits

Compare esta simplicidad de hardware basado en directo a la situación actual de 32 bits de Windows C + +, que tiene más de 60 diferentes tipos de datos en torno a la teoría de clase abstracta y donde los nombres de los diferentes tipos de datos significar cosas diferentes dependiendo de qué versión del sistema operativo que se construye.

El archivo windows.inc ha tenido todos los tipos de datos convertidos a los tipos de datos genéricos de ASM para eliminar la capa adicional de complejidad en los años 60 o por lo que C + + tipos de datos que reducen hasta el BYTE asm genéricos, WORD, DWORD, QWORD. Esto elimina una de las fuentes de error principales, tipos de datos incorrectos. Hay un conjunto de conversiones en windows.inc para los programadores que portar el código escrito en C / C + + tipos de datos en MASM32.



Código de Portabilidad

Si usted está escribiendo código para las plataformas que posee colectivamente alrededor del 2% del mercado de software, la portabilidad significa algo, pero en un mercado que es aproximadamente el 95% del sistema operativo de Microsoft basado en las ventajas de tamaño, velocidad y potencia superan fácilmente la idea de ser puede escribir código que puede ser compilado en diferentes plataformas.

El problema con el código de plataforma cruzada es que es por necesidad, código más bajo denominador común que por lo general un mal desempeño contra el código específico de la plataforma.

A menudo hay debates acalorados sobre las virtudes diferentes de código portátil contra el código específico de la plataforma, pero lo que no está sujeto a debate es la medición del tamaño de disco utilizado, o la evaluación comparativa en términos de rendimiento.

Código específico de la plataforma tiene la ventaja, en gran medida en términos de rendimiento, pero a costa de no ser compilable en otras plataformas.

Argumentos muy similares son utilizados por algunos que son de la opinión de que los lenguajes de alto nivel son ahora lo suficientemente bien escrito para ser capaz de hacer lo ensamblador puede hacer, pero una vez más, la medida del tamaño del disco y la evaluación comparativa de los resultados cuentan una historia diferente.

Bien escrito el código de alto nivel de lenguaje en un compilador que no tiene muchos bugs en el que a menudo se desempeña bien en comparación con el código ensamblador mal escrito, pero para hacer el punto, el código bien escrito en ensamblador se superan a cualquier lenguaje de alto nivel, no importa lo bien que la código de lenguaje de alto nivel que está escrito.

Algo que se olvida en el debate es que el ensamblador, en este caso, MASM, gestiona todas las construcciones de alto nivel normal, también. Funciones normales con los valores de retorno, los procedimientos, sin valores de retorno, las bibliotecas, las llamadas a DLLs, Windows el uso de recursos, etc ... pero con la ventaja añadida de que puede utilizar las macros escritas correctamente los cuales más de edequately compensar los sistemas de pre-construidos en lenguajes de alto nivel.

Muchos de los que son de la orientación de la programación orientada a objetos evocan las imágenes de los programadores de ensamblador a desarticular a los archivos binarios en un editor hexadecimal, pero esto está lejos de la forma programadores de ensamblador de trabajo. La sintaxis de la seudo alto nivel en MASM, en relación con la capacidad de macro permite que el código muy limpio, si está escrito correctamente, sin embargo, todavía no hay ensamblador puro compromiso.

La distinción básica aquí es que con un ensamblador, usted consigue lo que usted escribe en un compilador, se obtiene más de lo que escriben y tienen poco control sobre lo que se añade. Es cierto que existen compiladores bien diseñado en el mercado, pero no hay razón para suponer que alguno o todos los compiladores se escriben así, sin pruebas de su producción en términos de tamaño o velocidad.

Escrito en ensamblador para una plataforma específica, en este caso de 32 bits de Windows es una tarea que no se compromete a poner en peligro su rendimiento en pos de un objetivo que normalmente no se puede lograr. Absolutamente no se ejecutará en un MAC, pero con menos del 2% del mercado, es una cuestión de "a quién le importa".

Lo que se obtiene con la escritura de ensamblador para una plataforma específica es un rendimiento óptimo para esa plataforma y con el 95% del mercado con procesadores de Intel basados ​​en sistemas operativos de Microsoft, lo que se obtiene es el mejor rendimiento en la plataforma principal.

Para los programadores que necesitan un rendimiento óptimo en otras plataformas, no es la misma alternativa, los ensambladores están disponibles para MIPS, PPC y 68000, así como los procesadores menos conocidos.



Herramientas y juguetes

EDITOR

El editor de MASM32 es qeditor.exe . Es una ventaja para establecer las asociaciones de archivos en el gestor de archivos para que pueda iniciar un archivo ASM haciendo doble clic sobre él en el Administrador de archivos o Explorador. Dependiendo de cómo el equipo individual se establece, esto a veces puede ser un problema en que el Explorador de paso variable parámetros de línea de comandos encerrados en diferentes formatos. La mejor solución es ejecutar "Opciones" en Explorer y configurar las opciones de la siguiente manera,

    1. Seleccione " Mostrar todos los archivos "

    2. Seleccione " Mostrar el total de MS-DOS camino en la barra de título "

    3. ¿Es que no seleccione " Ocultar MS-DOS extensiones de archivo para tipos de archivo que están registrados "

    4. Seleccione " Incluir barra de descripción para los dolores de derecha e izquierda "

El editor viene pre-configurado para crear todo el código de ejemplo y tutoriales Iczelion directamente desde el editor. El menú "Proyecto" tiene el rango de la opción de generación en él para seleccionar y apoyar el GUI y aplicaciones de consola.


Generador de código:

Prostart.Exe es el generador de código se suministra con MASM32. Se basará trabajo EXE como titular a un proyecto. Tiene varias opciones para los componentes incluidos en el código fuente. Prostart.Exe es una herramienta muy útil de aprendizaje en que se escribe el código de la API correcta para las aplicaciones basadas basados ​​en Windows. Este código se puede utilizar para iniciar una aplicación, para el código de creación de prototipos sin tener que escribir manualmente el código de inicio y también para probar ideas de forma rápida.


Usted tendrá que crear un directorio para un nuevo proyecto, seleccione el directorio y elija las opciones que necesita para el proyecto. Puede crear el proyecto directamente desde Prostart.Exe y se prueba para ver si hace lo que usted requiere. Proyectos escritos por Prostart.Exe están diseñados para crear directamente desde el editor y también se puede construir desde el archivo de proceso por lotes que Prostart.Exe crea.

EJEMPLO DE CÓDIGO
MASM32 viene con una serie de código de ejemplo para ayudar en el diseño de los componentes de un archivo de proyecto. Es en los directorios Ejemplo 1, Ejemplo 2 Ejemplo 3 y de MASM32.

TUTORIAL CÓDIGO
Iczelion ha hecho su serie de tutoriales disponibles a MASM32 y ha modificado para trabajar en MASM32. Cada clase es en su propio directorio, que está fuera del directorio ICZTUTES en MASM32.


NOTA : El código de tutorial y el código de ejemplo son los diferentes estilos escritos por personas diferentes y son para fines ligeramente distintos. Iczelion tutoriales están diseñados como ejemplos de aprendizaje , así como por el valor del código que está diseñado el código de ejemplo como principales ejemplos de referencia . asegúrese de que entiende el código de diseño de ambos antes de mezclar el código fuente ya que a veces pueden tener problemas de compatibilidad si cortar y pegar desde el diseño de códigos a otra.
BIBLIOTECAS
MASM32 tiene su propia biblioteca en el M32LIB directorio que tiene el código fuente completo y un archivo por lotes pre-construidos para crear la biblioteca de nuevo si se ha modificado o añadido a. Puede utilizar el archivo por lotes MAKE.BAT como un ejemplo de cómo construir sus propias bibliotecas.

Se empieza con un directorio aparte y cuando se escribe un módulo de biblioteca, lo copia en el directorio donde desea crear la biblioteca. Crear un archivo de inclusión que tiene el prototipo para cada función en cada módulo de la biblioteca y luego hacer un archivo por lotes del mismo estilo que el MAKE.BAT archivo por lotes que se basará la biblioteca para usted. A continuación, puede utilizar el archivo de inclusión y de la biblioteca en sus propios programas

Para facilitar el proceso de escritura de módulos de biblioteca, el editor tiene una opción en el menú Herramientas en "Crear módulo de la biblioteca". Este es un plug-in DLL que poner un esqueleto módulo de la biblioteca directamente en el editor de esta manera puede escribir nuevos módulos de su propio diseño.

Junto con las macros, las bibliotecas son métodos muy potente de hacer código re-utilizable que es rápido, eficiente y confiable para su uso en el nivel de aplicación. Las combinaciones de las bibliotecas y macros permiten al programador lenguaje ensamblador para diseñar con eficacia su propio idioma que se puede escribir tan rápido como un lenguaje de alto nivel normal, pero sin los malos hábitos y la hinchazón que los lenguajes de alto nivel de los más modernos sufren.
 


Esta información esta extraida de Masm32 version 7 . has click aqui para descargar MASM32 7


En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.524


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Masm32
« Respuesta #1 en: 7 Noviembre 2012, 21:00 pm »

Si te gusta MASM32, vas a adorar jWASM: http://www.japheth.de/JWasm.html


En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

Stuxnet

Desconectado Desconectado

Mensajes: 29



Ver Perfil WWW
Re: Masm32
« Respuesta #2 en: 7 Noviembre 2012, 23:43 pm »

Si te gusta MASM32, vas a adorar jWASM: http://www.japheth.de/JWasm.html

Excelente Gracias.

Hay cosas muy interesantes en esa web no la conocia.

Bytes.
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Masm32
« Respuesta #3 en: 16 Noviembre 2012, 23:20 pm »

Y este tut de que año es?
aún incluyendo los kernel.inc, user.inc .etc directamente?
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Inyeccion dll: [ Delphi ] - [ C++ ] - [ VB ] - [ Masm32 ] - [ C# ??? ] « 1 2 »
.NET (C#, VB.NET, ASP)
XSaMuXPH *-* Traigo uno encima! =D! 10 11,240 Último mensaje 10 Noviembre 2010, 18:41 pm
por luigymax
Colores en codigo ASM (MASM32)
ASM
Riki_89D 2 7,257 Último mensaje 18 Octubre 2009, 18:47 pm
por Riki_89D
Bajar Masm32
ASM
тαптяα 7 6,895 Último mensaje 16 Octubre 2010, 19:02 pm
por Eternal Idol
PlaySound en masm32
ASM
Nop+ 3 3,959 Último mensaje 18 Noviembre 2012, 18:54 pm
por Nop+
Problemas al instalar masm32 « 1 2 »
ASM
0xFer 17 10,521 Último mensaje 26 Mayo 2015, 21:31 pm
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines