Lo que he entendido del lenguaje ensamblador.

10:11 pm Lenguaje Ensamblador, Programación

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 ...

Temas Relacionados:
  • Autómata de pila X^n W Y^n
  • Programar en ensamblador con TASM en Doxbox
  • Virtualbox y Dispositivos USB.
  • ¿Dónde están los ingenieros de software del mañana?
  • Actualizando Wordpress versión 2.3
  • 2 Responses

    1. Memo Says:

      Buen tutorial, gracias por la aportacioń, seguro será de mucha utilidad para los que inician en esto de la programación en arquitecturas comerciales

    2. soullost Says:

      FE DE ERRATA

      En el articulo doy por hecho que TASM necesita de la directiva .MODEL, esto es un error, .MODEL es una directiva de Borland y Microsoft (sus correspondiente ensambladores) para declarar el tipo de memoria, esto a su vez, permite escribir de forma abreviada la declaración de los segmentos. Por eso, simplemente se escribe .CODE, .STACK y .DATA.

      Si no escribimos la directiva .MODEL, necesitamos declarar los segmentos de forma convencional. Para el ejemplo, la estructura de un programa básico quedaría:

      STACKSG SEGMENT PARA STACK 'Stack'	; Se necesita una PILA.
      
      STACKSG ENDS
      
      DATASG SEGMENT PARA 'Data'
      
      DATASG ENDS
      
      CODESG SEGMENT PARA 'Code'			; Area de codigo
      
      Empieza PROC FAR
      		ASSUME SS:STACKSG, DS: DATASG, CS:CODESG
      
      		MOV AX, DATASG
      		MOV DS, AX
      		Mov  Ax,4c00h            ; Regresa a Ms-Dos por medio de la
      		Int  21h                 ;  funcion 4c.
      Empieza ENDP
      CODESG ENDS
      		END  Empieza
      

    Leave a Comment

    Your comment

    You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

    Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.