Notepad++ y TASM II

Lenguaje Ensamblador, Programación No Comments

Después del mi primer post (http://soullost.org/programacion/notepad-y-tasm/) sobre Notepad++ y la posibilidad de poder compilar/ejecutar programas hechos en ensamblador (con Turbo Assembler) mediante archivos batch, he modificado los archivos para así poder tener un mejor orden. Anteriormente, los archivos generados mediante la compilación quedaba en la misma carpeta que el archivo fuente, ahora, se crean dos directorios nuevos: build y exes. En build, contendrá los archivos de listados, los archivos objetos y los archivos map. En exes, contendrá todos los ejecutables generados.

Imágenes:

Directorio principal

Directorio principal


Directorio build

Directorio build


Directorio exes

Directorio exes

También antes solo usaba dos archivos batch para tales motivos, ahora son tres, uno para compilar y enlazar, otro para correr el programa y uno más para llamar a mandar al depurador. Los archivos son los siguiente:

Nombre: tasm.bat
Ejecutar: $(NPP_DIRECTORY)\tasm.bat $(NAME_PART) $(CURRENT_DIRECTORY) $(NPP_DIRECTORY)

echo off

PATH="%3\tasm\"

TITLE COMPILANDO %1

CLS

CD %2

if NOT EXIST build mkdir build

echo Compilando...

tasm /l %1 build\ build\

echo Link...

if NOT EXIST exes mkdir exes

tlink build\%1, exes\%1.exe, build\%1.map

echo.

pause

Nombre: execute.bat
Ejecutar: $(NPP_DIRECTORY)\execute.bat $(NAME_PART) $(CURRENT_DIRECTORY)

echo off

TITLE EJECUTANDO %1

CLS

CD %2\exes\

echo Ejecutando...

echo.

%1.exe

echo.

pause

Nombre: td.bat
Ejecutar: $(NPP_DIRECTORY)\td.bat $(NAME_PART) $(CURRENT_DIRECTORY) $(NPP_DIRECTORY)

echo off

PATH="%3\tasm\"

CLS

CD %2\exes\

td -jn %1.exe

Para terminar, ya no utilizo un “tasm instalado”, tengo los ejecutables correspondiente (tams.exe, tlink.exe, td.exe y rtm.exe) en una carpeta tasm en el directorio apuntado por la variable $(NPP_DIRECTORY).

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Notepad++ y TASM

Lenguaje Ensamblador, Programación 7 Comments

Notepad++

Hoy, por algunas razones, he estado probando Notepad++ [http://notepad-plus.sourceforge.net] en su versión portable. Resulta que Notepad++ hace uso de una característica (que también usa Gedit [http://soullost.org/gnulinux/usando-gedit-para-phpxhtmlcss/]) muy peculiar, las herramientas externas. Las herramientas externas nos permite ejecutar otros programas desde Notepad++, en las F.A.Q del sitio dice:

Puede necesitar ejecutar alguna herramienta externa, como un compilador, un intérprete o un navegador web, desde Notepad++ (por medio del diálogo Ejecutar) pasando como argumento el documento que está editando.

Despues de ver un archivo por lotes, donde se demuestra como compilar con java usando las herramientas externas [http://arkadoel.blogspot.com/2008/10/compilar-java-con-notepad.html], pensé que, podría compilar y ejecutar con TASM el archivo que estuviera editando. Puse manos a la obra en el caprichito y si!, ahora ya puedo compilar y ejecutar mis archivos ASM ( desde mi memoria USB :) ) con un simple atajo del teclado desde este editor. Sólo hay que seguir los siguientes pasos:

1) Guardar (en el directorio definido por $NPP_DIRECTORY) el siguiente archivo batch:

echo off
PATH="c:\TASM\BIN"
TITLE COMPILANDO %1
CLS
CD %2
echo Compilando...
tasm /l %1
echo Link...
tlink %1
echo.
echo Ejecutando...
echo.
%1.exe
echo.
pause

2) Vamos a Ejecutar y escribrimos: $(NPP_DIRECTORY)\tasm.bat $(NAME_PART) $(CURRENT_DIRECTORY).

Lo guardamos con las opciones correspondientes:

Atajo del teclado

Atajo del teclado

3) Ahora, desde nuestro archivo ASM que estemos editando podemos pulsar Ctrl + Alt + F5 (en mi caso) para compilar y ejecutar dicho archivo:

Archivo ASM

Archivo ASM


Ejecutando Herramienta Externa

Ejecutando Herramienta Externa

También he definido otra herramienta externa para mandar a llama al debugger TD. Es este:

echo off
PATH="c:\TASM\BIN"
CLS
CD %2
td %1

Ejecutando: $(NPP_DIRECTORY)\td.bat $(NAME_PART) $(CURRENT_DIRECTORY).

Eso es todo ;) , nos olvidamos de usar la bendita consola de msdos.

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5 out of 5)
Loading ... Loading ...

Lo que he entendido del lenguaje ensamblador.

Lenguaje Ensamblador, Programación 2 Comments

Una aclaración antes de empezar. El lenguaje ensamblador tiene mucho que ver con arquitectura de computadoras (http://es.wikipedia.org/wiki/Arquitectura_de_computadores) y de hecho, trabaja con muchos conceptos que se generan a partir de esta. No voy a explicar cada uno de estos conceptos, lo que voy hacer es, tratar de dar las bases para que entiendan “cómo” empezar a crear programas en lenguaje ensamblador. Así que, si quieren una base teórica más profunda, pueden buscar referencias en otra parte.

¿Lenguaje ensamblador?

Según wikipedia: http://es.wikipedia.org/wiki/Lenguaje_ensamblador

El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador.

Fue usado ampliamente en el pasado para el desarrollo de software, pero actualmente sólo se utiliza en contadas ocasiones, especialmente cuando se requiere la manipulación directa del hardware o se pretenden rendimientos inusuales de los equipos.

Conceptos básicos.

El lenguaje ensamblador tiene contrastes con los lenguajes de programación de alto nivel.

- La estructura de un programa hecho en lenguaje ensamblador es diferente a los lenguajes de alto nivel.
- El lenguaje ensamblador trabaja más directamente con el hardware (con registros del microprocesador, memoria, dispositivos,..,etc.).
- El sistema numérico por excelencia no es el decimal.

Para nuestros programas, disponemos de varios registros, 4 de lo más importantes son:

AX - Acumulador.
BX - Base.
CX - Contador.
DX - Registro.

Cada uno de estos es de 16 bits. Se puede usar sólo la mitad de esos 16 bits, seleccionando la parte correspondiente del registro. Cada uno de estos registros están formados por su parte baje y su parte alta de 8 bits.

Registros

Nota: Para el manejo de aplicaciones de 32 bist, los registros pasan a ser: EAX, EBX, ECX, EDX,..,etc.

http://es.geocities.com/e0n_ftp/TallerASM/Imagen1.jpg” alt=”Registros 32bits” />

Existe otro registro importante, es el registro de banderas. El registro de banderas (flags) te proporcionará información al hacer uso de varias operaciones (suma (ADD), por ejemplo).

Flags

Otra cuestión importante a mencionar son las Interrupciones. Las interrupciones son un conjunto de instrucciones que detiene el flujo de un programa para hacer una tarea determinada. Por ejemplo, la captura de un carácter del teclado es una interrupción.

Estructura de un programa en lenguaje ensamblador.

No existe una convención establecida para la estructura de un programa en lenguaje ensamblador (no como sucede con otros lenguajes, como C/C++). Como regla de oro, es necesarios la declaración de dos segmentos, la de código (CODE) y la de pila (STACK). En total, hay 4 segmentos principales: Segmento de datos, Segmento de código, Segmento de pila y Segmento Extra.

La diferentes segmentos tienen las siguientes funciones:

Segmento de datos: Contiene la dirección donde inicia la declaración de variables. Aquí, escribiremos nuestras variables.
Segmento de código: Contiene la dirección de inicio donde se encuentran las instrucciones del programa. Aquí, escribiremos todo el código de nuestro programa
Segmento de pila: Contiene la dirección donde se encuentra la pila.
Segmento Extra: Contiene la dirección donde podemos almacenar datos extras.

Hay que aclarar que si existen directivas dependiendo del programa ensamblador (http://es.wikipedia.org/wiki/Assembler) que se utilicé (en mi caso, estoy utilizando TASM como programa ensamblador). En TASM las declaraciones de los segmentos se hace de la forma: .[SEGMENTO].

Para declarar la estructura de un programa básico (que no hace nada), sería de la forma:

; Define el modelo de memoria

;

     .MODEL    SMALL          		; Modelo de memoria

     .STACK                   		; Se necesita una PILA.

     .CODE                    		; Area de codigo

Empieza:                          ; Etiqueta de comienzo de programa

     mov  Ax,4c00h                ; Regresa a MS-DOS por medio de la

     int  21h                     ; funcion 4c.

END  Empieza                      ; Fin del programa

En TASM también es necesario especificar el modelo de memoria. Además, hay que especificar la función (4c00h) de salir del programa mediante la interrupción 21h de MSDOS, si no, el programa nunca termina y nunca vamos a regresar al prompt.

Programando en lenguaje ensamblador.

Para programar en ensamblador es necesario conocer las instrucciones con las que podemos realizar nuestras tareas. Estas instrucciones se llaman mnemónicos (http://es.wikipedia.org/wiki/Mnemónico). Tienen la siguiente sintaxis:

 [nombre]  mnemónico  [operandos] [;comentarios]
 

[nombre]. Es una etiqueta que se puede usar (es opcional) para controlar el flujo de nuestro programa.
mnemónico. Es la instrucción a usar.
[operandos]. Son los operandos con los que va a trabajar.
[;comentarios]. Comentarios.

Ejemplo: MOV AX,BX.

Si buscamos la definición de MOV, nos vamos a encontrar que mov sirve para pasar datos de un registro a otro. En este caso, pasamos los datos de BX a AX.

Declaración de variables. La declaración de variables se hace en el segmento .DATA. La sintaxis es de la siguiente forma:

[nombre] Tipo [valor]

Tipo de datos:

DB (bytes), DW (palabras), DD (palabra doble), DQ (palabra cuádruple), DT (diez bytes)

Ejemplo:

     Mensaje DB 'Bienvenido!.$' 	; Cadena a desplegar

Interrupciones. Existen diversas interrupciones de las que podemos hacer uso. Lo más importante no es aprendernos todas, si no tener una referencia donde fijarnos si existe una interrupción para lo que queremos hacer. Entre las que más se ocupan, son las de MSDOS (si trabajamos en un ambiente con él) y las del BIOS.

Ejemplo:

Interrupción: 21h
Entrada (rutina/función): AH=01h
Descripción: Espera entrada desde el teclado (un carácter).
Salida: Lo que tecleemos lo coloca en el registro AL.

	mov Ah,01h			; Llamamos a una funcion del MSDOS

	int 21h				  ; para leer un caracter del teclado

Ejemplo práctico y descripción.

Suma de dos valores de una sola cifra:

.MODEL SMALL				; Modelo de memoria

.DATA					; Segmento de datos

Mensaje DB 'Programa para sumar: $'	; Cadena a desplegar

.STACK					    ; Se necesita una pila

.CODE					      ; Area de codgio

Main:					      ; Etiqueta de comienzo del programa

	mov Ax, @Data			      ; Inicializa DS con la direccion de

	mov Ds, Ax			        ; @data

	mov Dx, Offset Mensaje	; Direccion de mensaje en DX

	mov Ah, 9h			        ; para poder desplegarloa traves de

	int 21h				          ; la Int 21h de MSDOS

	mov Ah,01h			        ; Llamamos a una funcion del MSDOS

	int 21h				          ; para leer un caracter del teclado

	sub Al,30h			        ; Ajuste de caracter a numero

	mov Bl,Al			          ; Pasamos el contenido de AL a BL

					                ; Llamamos a una funcion del MSDOS

	int 21h				          ; para leer un caracter del teclado

	sub Al,30h			        ; Ajuste de caracter a numero

	mov Cl,Al			          ; Pasamos el contenido de AL a CL

	add Bl,Cl			          ; Realizamos operacion

	add Bl,	30h			        ; Convertimos resultado a ASCII

	mov DX,BX			          ; Copiamos BX a DX para presentar en

					                ; pantalla   	

	mov ah,02h			        ; Int 02h mostrar caracter

	int 21h				          ; Muestra en pantalla el valor de DL

	mov Ax, 4c00h			      ; Regresa al MSDOS por medio de la

	int 21h				          ; funcion 4c	

END Main				          ; Fin del programa

Voy a tratar de explicarlo por partes:

Definición de datos e inicio de programa.

.DATA					; Segmento de datos

Mensaje DB 'Programa para sumar: $'	; Cadena a desplegar

Simplemente definimos un mensaje a mostrar en pantalla. Para mostrarlo:

	mov Ax, @Data			      ; Inicializa DS con la direccion de

	mov Ds, Ax			        ; @data

En esta parte, obtenemos la dirección donde inicia el segmento de datos y lo pasamos a Ax, de Ax a Ds.

	mov Dx, Offset Mensaje	; Direccion de mensaje en DX

	mov Ah, 9h			        ; para poder desplegarla traves de

	int 21h				          ; la Int 21h de MSDOS

Ahora hacemos un offset a la dirección donde apunta la variable Mensaje, con esto, obtenemos la dirección de Mensaje en DX.

¿Para qué pasamos las direcciones correspondientes a DX y DS?. Porque la rutina Ah=09h de la interrupción 21h (que sirve para desplegar una cadena de caracteres por la pantalla de MSDOS), ocupa estos registros para encontrar la cadena de caracteres a mostrar.

Información de la interrupción.

Sacar un string a la pantalla

INT 21H AH = 9H

Descripción: Su función es la de sacar una cadena de caracteres ASCII por pantalla.

Uso: Entrada: AH = 9H
DS contiene el valor de la dirección del segmento del comienzo de la cadena de caracteres a sacar.
DX contiene el offset de dicha cadena en el segmento anterior.
El último byte de la cadena de caracteres debe ser el carácter $, que no se muestra en pantalla.
Salida: Ninguna
Registros afectados: AX

Captura de datos.

	mov Ah,01h			        ; Llamamos a una funcion del MSDOS

	int 21h				          ; para leer un caracter del teclado

	sub Al,30h			        ; Ajuste de caracter a numero

	mov Bl,Al			          ; Pasamos el contenido de AL a BL

Esta interrupción ya se explicó anteriormente, obtenemos el carácter que pulsamos en Al. Después, pasamos el valor ASCII a numérico para proceder con la operación. Además, respaldamos el número en Bl (para poder ingresar el siguiente número).

La conversión se lleva a cabo restando 30h al valor que pulsamos. Ejemplo, si pulsamos un 3, el valor que se asigna a Al es 33 en hexadecimal (33h), hacemos la operación: 33h -30h = 3h. 3h = 3 en Decimal.

	int 21h				          ; para leer un caracter del teclado

	sub Al,30h			        ; Ajuste de caracter a numero

	mov Cl,Al			          ; Pasamos el contenido de AL a CL

Lo mismo que lo anterior, pero ahora, respaldamos en valor numérico en Cl.

Suma.

	add Bl,Cl			          ; Realizamos operacion

Se hace la suma. Ejemplo: 3+2 =5. El resultado se guarda en Bl con un valor de 5h.

Muestra del resultado.

	add Bl,	30h			        ; Convertimos resultado a ASCII

	mov DX,BX			          ; Copiamos BX a DX para presentar en

					                ; pantalla   	

	mov ah,02h			        ; Int 02h mostrar caracter

	int 21h				          ; Muestra en pantalla el valor de DL

Antes de mostrar el carácter, debemos convertir el valor número a ASCII para mostrarlo en pantalla. Así que, le sumamos 30h. Siguiendo con el ejemplo anterior:

5h + 30 h = 35h.
3 * 16^1 = 48.
5 * 16^0 = 5.
48 + 5 = 53. El carácter ASCII del valor 53 es ‘5′.

La rutina 02h muestra el carácter que se encuentre en Dl (por eso pasamos el valor de BX a DX, igual sólo se pudo haber pasado la parte baja de los dos registros correspondientes).

Terminación de programa.

  	mov Ax, 4c00h			      ; Regresa al MSDOS por medio de la

	  int 21h				          ; funcion 4c00h

  END Main				          ; Fin del programa

Regreso al prompt del msdos y termina el programa (END). El Main indica en que etiqueta inicia el programa, en este caso, sólo se maneja esa.

Captura de pantalla:

Free Image Hosting at www.ImageShack.us

QuickPost Quickpost this image to Myspace, Digg, Facebook, and others!

Conclusión.

El lenguaje ensamblador no se limita a un programa de suma y resta (o similares), tiene aplicación en muchas áreas, como la electrónica digital, cracking, .., etc. Espero que con el articulo tengan una idea mejor sobre lo que trata el lenguaje ensamblador y cuando menos, dar las bases para que se animen a probarlo. Nos vemos.

Mirror: http://foros.hackerss.com/t8496/lo-que-he-entendido-del-lenguaje-ensamblador

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 4 out of 5)
Loading ... Loading ...

Programar en ensamblador con TASM en Doxbox

GNU/Linux, Lenguaje Ensamblador, Programación 4 Comments

Dosbox

Resulta que a pesar de tener alternativas libres y más actualizadas para trabajar en lenguaje ensamblador (sintaxis de Intel), en la universidad, nos piden que trabajemos con TASM. Quiero creer que es porque el laboratorio que se asignó para la materia tiene computadoras IBM PC (no sé exactamente el modelo pero, creo son del año en que nací) bastante viejas con un flamante Windows 98. El caso es que, era una tontería (al menos para mi) arrancar la maquina virtual de Windows XP para trabajar en TASM, así que, terminé instalando TASM en Dosbox :P .

Dosbox según Wikipedia
:

DOSBox es un emulador que recrea un entorno similar al sistema DOS con el objetivo de poder ejecutar programas y videojuegos originalmente escritos para el sistema operativo MS-DOS de Microsoft en ordenadores más modernos o en diferentes arquitecturas (como Macintosh). También permite que estos juegos funcionen en otros sistemas operativos como GNU/Linux.

DOSBox es software libre, y está disponible para muchos sistemas operativos, como Linux, FreeBSD, Windows, Mac OS X, OS/2 y BeOS. Incluso recientemente ha sido adaptado a las consolas portatiles PSP y GP2X.

La versión de Dosbox que estoy utilizando es la 0.72. Cabe destacar que Dosbox utiliza un fichero de configuración que hay que crear con la siguiente instrucción: config -writeconf dosbox.conf, en la línea de comandos del MSDOS al arrancar Dosbox, esto, creará un archivo dosbox.conf en el directorio home de nuestro usuario (/home/soullost, en mi caso). Además del archivo de configuración de Dosbox, otra de las primeras cosas que tenemos que hacer es crear la Unidad C:\, ya qué, Dosbox por defecto sólo cuenta con una unidad virtual llamada Z:\, donde, dispone de los archivos elementales de un ambiente normal de DOS. Para tal motivo contamos con el comando mount, muy al estilo Unix (para más detalles, consultar el Wiki de Dosbox), procedemos a crear la unidad C:\ a partir de un directorio físico de nuestro disco: mount c /home/soullost/dos. Hay que tener en cuenta que el montaje sólo dura hasta que cerremos el programa, podemos, hacer que se cargue automáticamente al iniciar Dosbox mediante su archivo de configuración, especificamente en la sección [autoexec]. Quedando:


[autoexec]
# Lines in this section will be run at startup.
mount c /home/soullost/dos
c:

Ahora si, estamos listos para instalar programas en ambiente DOS. Yo instalé TASM y un IDE para programar en ensamblador:

El IDE Asm Edit lo pueden descargar de la siguiente dirección: http://www.o-love.net/asmedit/ae_down.html. Tiene un ambiente muy parecido al famoso Turbo C++, por lo que, podemos agilizar la tarea de compilar y ejecutar los programas que realizamos (eso de usar comandos para compilar cada programa que se realiza, es muy aburrido, además necesitaba un editor para crear los programas porque Dosbox no dispone de ninguno), también, se puede invocar al turbo debugger desde ahí y regresar al editor cuando terminemos de usarlo. Sólo tuve un único problema al configurar el Asm Edit y es que, los archivos DPMI16BI.OVL y RTM.EXE son incompatibles con la versión que instalé de TASM (5.0), basta entonces, con reemplazarlos por los archivos que se encuentran en la carpeta BIN de TASM (C:\TASM\BIN, no es necesario usar conmandos de DOS, se puede copiar desde nautilus, en caso de GNOME). Aqui algunas capturas de cómo he configurado el IDE:

Hay que cambiar los directorios donde instalamos el TASM (TASM.EXE, TLINK.EXE, TD.EXE). Ojo, para que queden grabadas para la próxima vez que se inicie el programa hay que seleccionar Options > Save [ASMEDIT.DSK]:

También, los directorios donde se guardarán los archivos generados durante la compilación:

Si todo está correcto, puede empezar a ejecutar sus programas en ensamblador:

.

Por último, les dejo mi archivo de configuración de dosbox para ganar un poco de velocidad al ejecutar Asm Edit (ya que se sentía lento, antes de hacer las modificaciones), claro, que he probado y me han funcionado a mi; y, el archivo fuente de Hola, que tal!. que se muestra en las capturas:

Archivo ASM.


;***************************************************************************

; Nombre del programa:   MENSAJE.ASM

;***************************************************************************

; COMANDO DE ENSAMBLE    : MASM MENSAJE;

; COMANDO DE ENLACE      : LINK MENSAJE;

; COMANDO DE EJECUCION   : MENSAJE [Enter]

;***************************************************************************

;

; Define el modelo de memoria

;

     .MODEL    SMALL          		; Modelo de memoria

     .DATA                    		; Segmento de datos

      Mensaje DB 'Hola, que tal !.$' 	; Cadena a desplegar

     .STACK                   		; Se necesita una PILA.

     .CODE                    		; Area de codigo

Empieza:                      ; Etiqueta de comienzo de programa

     mov  Ax, @Data           ; Inicializa DS con la

     mov  Ds, Ax              ; direccion de @Data

     mov  Dx, Offset Mensaje  ; Direccion de Mensaje

     mov  Ah, 9               ; en Dx para poder desplegarlo

     Int  21h                 ; a traves de la Int 21 de MS-DOS.

     mov  ax,4c00h            ; Regresa a MS-DOS por medio de la

     int  21h                 ; funcion 4c.

     END  Empieza             ; Fin del programa

Archivo de configuración: Descargar.

Nos vemos.

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...