Inicio Foro Noticias Retos Articulos Grupos iHackerss Mapa Creditos Youtube
foros de discusión

Welcome Guest ( Log In | Register )

 
Reply to this topicStart new topic
> Lo que he entendido del lenguaje ensamblador., Introducción a ASM.
Soul Lost
post Sep 20 2008, 04:03 PM
Post #1


Un poco Geek
******


Group: Hackerss Member
Posts: 1,637
Joined: 22-March 06
From: UnderHouse
Member No.: 8



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:

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



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



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



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:

QUOTE
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:

CODE
; 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:

CODE
[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:

CODE
[nombre] Tipo [valor]


Tipo de datos:

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


Ejemplo:

CODE
     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:
QUOTE
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.


CODE
    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:

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

CODE
.DATA            ; Segmento de datos

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



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

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


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

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

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

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


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


CODE
      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:



Como ejercicio, pueden mover el cursor del prompt para que el resultado aparezca abajo o algo por el estilo (hay una interrupción para eso).


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.

Links para profundizar:

Undergound:
http://foro.elhacker.net/analisis_y_diseno...-t208188.0.html
http://www.wikilearning.com/curso_gratis/c...n_de_virus/4312
http://crysol.inf-cr.uclm.es/node/493

Teórico:
http://es.wikipedia.org/wiki/8086
http://es.wikibooks.org/wiki/Programaci%C3...aje_ensamblador

Algunas interrupciones:
http://arantxa.ii.uam.es/~gdrivera/labetcii/int_dos.htm

This post has been edited by Soul Lost: Sep 20 2008, 04:07 PM


--------------------
Siempre hay algo nuevo que aprender

Nuevo blog: www.soullost.org

Guías,Tutoritales,Howtos,Articulos. Bajo Licencia: CreativeCommons
Go to the top of the page
 
+Quote Post
Soul Lost
post Nov 29 2008, 08:47 AM
Post #2


Un poco Geek
******


Group: Hackerss Member
Posts: 1,637
Joined: 22-March 06
From: UnderHouse
Member No.: 8



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:
CODE
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


--------------------
Siempre hay algo nuevo que aprender

Nuevo blog: www.soullost.org

Guías,Tutoritales,Howtos,Articulos. Bajo Licencia: CreativeCommons
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic

 

RSS Lo-Fi Version Time is now: 2nd September 2010 - 10:49 PM