jueves, 24 de febrero de 2011

Como usar MASM y debug

El Microsoft Macro Assembler (MASM) es el ensamblador de Microsoft para la familia de microprocesadores x86. Este ensamblador fue pensado para sistemas de 16 y 32 bits, no se desarrollaron dos aplicaciones separadas para estos sistemas. Más tarde se desarrollaron versiones que permitían crear aplicaciones para Windows, pero la versión que os voy a explicar yo solo sirve para MS-DOS. A nivel académico es una buena opción.
Para todo el tutorial usaré el código del programa suma.asm que muestro a continuación. Podéis bajarlo desde aquí.

Este programa suma dos vectores de hexadecimales y guarda el resultado en otro vacío.
Antes de empezar podéis descargaros el MASM aquí y descomprimir los dos archivos ejecutables (MASM.EXE y LINK.EXE) en el mismo directorio donde guardéis el código .asm.
MASM
Entramos en el directorio donde esté nuestro fichero .asm (en nuestro caso suma.asm) y el ensamblador (MASM.EXE y LINK.EXE)
Una vez ahi, procedemos a ensamblar el archivo con la herramienta MASM escribiendo en la linea de comandos masm (para nuestro ejemplo masm suma.asm)
A continuación nos pedirá el nombre del fichero .obj, por defecto se llamará igual que el fichero .asm (le damos a intro porque queremos que se llame igual)
Le volveremos a dar dos veces más a intro puesto que nos pedirá otras dos cosas que nos interesan. Si todo ha ido bien el ensamblado nos devolverá 0 errores y 0 warnings (los warnings en ensamblador también son errores por lo que no puede haber ninguno) y se generará el código .obj en el mismo directorio en el que estamos.
Una vez que hemos ensamblado hay que linkar el código .obj que se habrá generado en el paso anterior. Para ellos usaremos la herramienta LINK escribiendo en la línea de comandos link (en nuestro caso link suma.obj). Nos pedirá el nombre del archivo .exe que nos generará (por defecto nos pondrá el mismo nombre que el .obj, en nuestro caso suma.exe). Como queremos que se llame igual simplemente le damos a intro.
A continuación le volveremos a dar otras dos veces a intro puesto que nos volverá a pedir otras dos cosas que no nos interesan.
Una vez que hemos terminado el linkado se habrá generado el archivo .exe. para ejecutarlo simplemente escribimos el nombre del archivo en la línea de comandos (suma.exe). En nuestro caso no se mostrará nada por pantalla puesto que el ejemplo suma.asm solo suma vectores y no imprime nada por pantalla.
Con esto no sabemos con seguridad si ha salido todo bien o no, lo que tenemos que hacer es usar la herramienta DEBUG de MS-DOS.

DEBUG
Para comprobar si el ensamblado y linkado han salido bien utilizaremos el debuger de MS-DOS escribiendo en la línea de comandos debug (en nuestro caso: debug suma.exe). Después de darle a intro nos aparecerá un guión para que pulsemos una de las opciones del debuger.
si escribimos ? y pulsamos intro nos aparecerá el menú con todas las opciones que nos permite el debuger. Las que nos interesan son t, g y q. A continuación las veremos con más detalle.
Si elegimos t ejecutará una instrucción de nuestro código .asm mostrando el estado de todos los registros del microprocesador 8086 antes de la ejecución de la misma. Cada vez que pongamos t ejecutara una instrucción por orden mostrando el estado de los registros antes de la misma, es decir, el estado de los registros de la instrucción anterior. Es recomendable tener el código delante para asegurarnos que hace lo que queremos y darnos cuanta de lo que está mal en caso contrario.
Si queremos ejecutar más de una instrucción a la vez y ver sus registros pulsaremos t seguida de un numero (en la imagen siguiente he pulsado t3)
Si queremos terminar la ejecución de nuestro programa pulsaremos g. Esto terminará las instrucciones que quedan pero no mostrará el contenido de los registros. Si todo va bien nos mostrará un mensaje: "El programa ha terminado de forma normal"
Para salir del debuguer pulsaremos q y volveremos a la línea de comandos de MS-DOS
Como ya expliqué anteriormente podremos ejecutar nuestro programa escribiendo en la línea de comandos suma.exe