Vous êtes sur la page 1sur 55

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.

UNIDAD II. FUNDAMENTOS (Segunda Parte).


2.1. Estructura de un programa en Ensamblador.
2.1.1 Ejecucin de un programa en el modo consola. Los programas ejecutables en el modo consola son almacenados en disco como archivos .COM y .EXE. El COMMAND.COM usa la funcin del DOS, EXEC, para ejecutar tanto los programas .COM como .EXE y esta funcin realiza las siguientes acciones: 1. Asigna la memoria necesaria para cargar el programa. 2. Construye un bloque de 256 bytes llamado PSP (PROGRAM SEGMENT PREFIX). Este bloque es colocado al inicio de la memoria asignada. 3. Carga el programa arriba del PSP. El PSP es una estructura de datos usada para almacenar informacin de control del programa; tiene una longitud de 256 bytes, es localizada en los primeros 256 bytes del segmento donde el programa es cargado. Hay varias partes del PSP que es importante conocer cuando se escriben programas en DOS. 4. Actualiza los registros y el STACK. 5. Transfiere el control al inicio del programa, cargando CS:IP con la primera instruccin del programa.

2.1.2 Estructura para programas .COM Un programa .COM es almacenado en memoria inmediatamente despus del PSP, esto es 100h bytes (256 bytes) arriba de la direccin de inicio, el mximo tamao de estos programas ser de: 65,536 - 256 - 2 = 65,278. Los ltimos 2 bytes se deben al espacio asignado al tope del STACK, esto es 2 bytes al final del segmento. Cuando un programa .COM inicia su ejecucin todos los registros de segmento contienen la misma direccin, esto es, la direccin de inicio del PSP. El registro SP contiene una direccin de 2 bytes abajo de la memoria mxima disponible para el programa, lo que significa que hay 64 KB de espacio disponible para el programa, SP = 0FFFEh. Esto se debe a que DOS siempre coloca un CERO en la pila antes de transferir el control al programa .COM.

2.1.2.1. Lineamientos para programas .COM 1. Un programa .COM solamente puede ocupar un espacio mximo de memoria de 64 KB. (Un segmento.) 2. La definicin del segmento es muy simple, ya que solo puede usarse un segmento. 3. Todos los registros de segmento son inicializados en el mismo segmento. 4. Deber usarse la directiva ORG para iniciar en el byte 256 (100h), de tal manera de dejar espacio para el PSP, el cual es cargado en memoria de manera automtica en el momento de cargar el programa. 5. Si el programa contiene DATOS, stos no debern ser ejecutados, se podr usar la instruccin JMP de tal forma de brincarlos. Tambin se pueden colocar dichos datos al final del programa despus de la instruccin de retorno al DOS. En la figura 2.1 se muestra el mapa de memoria del programa .COM

Agosto Diciembre 2009

Pg. 15 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.

0FFFEH 0FFFEH

00 00 SP

Cdigo y datos del programa

00100H 000FFh

CS, SS, ES, DS

Figura 2.1 Mapa de memoria de un programa .COM

2.1.2.2 Formato para Estructura Estndar.

CODE

inicio:

jmp

SEGMENT ;Inicio del segmento de cdigo ASSUME CS:CODE, DS:CODE, ES:CODE, SS:CODE ORG 100h ;Principio del cdigo principio ;Salta los datos ;Lugar para datos

principio: nop mov ax, 4C00h int 21h ENDS END ;Aqu inicia el cdigo. ;Se usa la funcin 4Ch de la ;Int. 21h para salir al DOS ;Fin del segmento de cdigo. ;Indica inicio ejecucin.

CODE

inicio

2.1.2.3 Sintaxis de la declaracin de un segmento Sintaxis de SEGMENT nombre-seg SEGMENT --sentencias --nombre_seg ENDS El programa debe terminar con: END etiqueta En este caso la etiqueta se llama inicio, tambin se pone seguida de (:) en la primer lnea de cdigo del programa.

Agosto Diciembre 2009

Pg. 16 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


2.1.2.4 Sintaxis del las instrucciones en Lenguaje Ensamblador. [etiqueta] Donde: assume: Habilita la verificacin de error para valores de registros. Establece la relacin entre un registro de segmento y un segmento. Sintaxis: assume SEG_REG:NOM_SEG,... org Directiva que pone el IP en el valor de expresin. Sintaxis: org expresin Instruccin de salto incondicional. Sintaxis: jmp etiqueta --etiqueta: Instruccin de transferencia de informacin de un operando fuente a un operando destino. Sintaxis: mov oper_des, oper_fuente Instruccin que llama a ejecucin a una interrupcin de un byte Sintaxis: int # interrupcin mnemnico [operandos] [; comentarios]

jmp

mov

int

2.1.2.5. El Llamado a una Interrupcin. En un programa se llaman a algunas interrupciones, para ello se requiere conocer la sintaxis de llamado a estas subrutinas. Por ejemplo: INT 21h Funcin 4Ch: Regresa al DOS con cdigo de retorno Entrada: AH = 4Ch AL = Valor regresado.

Use INT 21h funcin 4Ch para terminar un programa. Puede regresar un valor al programa padre en el registro AL.. Normalmente se regresa un CERO (00h) cuando el programa termina sin problemas. Ejemplo de un programa .COM. usando Estructura Estndar. ; Programa ENSA01.ASM CODE SEGMENT ORG 100h ASSUME CS:CODE, DS:CODE, ES:CODE, SS:CODE inicio: jmp principio Dato DB 'Hola$' ;Salta los Datos. ;Define una cadena, es terminada con signo de pesos para ser utilizada por la Interrupcin 21h funcin 09h. ;Declara el segmento de cdigo. ;Reserva un espacio de 256 bytes. ;Declara registro de segmentacin con segmento.

principio: mov dx, OFFSET Dato mov ah, 09h int 21h mov ax, 4c00h int 21h CODE ENDS END inicio Agosto Diciembre 2009

;Coloca el desplazamiento de la cadena en DX ;Pone en AH funcin 09h ;Llamado a la interrupcin 21h ;Usa la funcin 4Ch de int. 21h para salir al DOS, 00 es el valor regresado ;Llamado a la interrupcin 21h ;Marca el fin del segmento de cdigo. Pg. 17 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


OBSERVACIONES. El programa escribe la palabra hola es la pantalla. El programa consta de un solo segmento, el de cdigo. El operador OFFSET nos permite escribir la direccin de la variable Dato al registro DX. Para enva la palabra hola a la pantalla, utilizamos una rutina definida por el DOS en la interrupcin 21h, es la funcin 09h, la cual se define y llama de la siguiente manera: INT 21h Funcin 09h: Imprime una cadena de caracteres sobre la pantalla. Entrada: AH = 09h DS:DX = Direccin de inicio de la cadena.

La funcin 09h es muy fcil de usar, para utilizarla coloque la cadena en memoria y termnela con un signo de pesos ($), esto significa que no se puede incluir este signo como parte de la cadena, la direccin del inicio de la cadena es colocada en los registros DS:DX

2.1.2.6. Estructura Simplificada. Los ensambladores de Microsoft y Borland en su versiones actuales ofrecen ciertas facilidades que nos simplifican la creacin de archivos fuente en lenguaje ENSAMBLADOR, a este mtodo le llamaremos Estructura Simplificada, la cual adems de facilitarnos la tarea, hace que la estructura del programa sea compatible con los lenguajes de alto nivel estndares. Tal vez al presentar el mtodo parezca en principio un poco mas elaborado, que el anterior, pero una vez dominndolo es ms simple, sobre todo cuando se trabaja con programas .EXE. Formato para Estructura Simplificada. .MODEL SMALL .CODE ORG 100h inicio: nop mov ax, 4C00h int 21h END inicio ;Especifica un modelo de memoria. ;Declara el segmento de cdigo. :Direccin de inicio del cdigo. ;Aqu inicia el cdigo. ;Se usa la funcin 4Ch de la ;Interrupcin 21h para salir al DOS ;Indica donde inicia la ejecucin.

En el esqueleto es necesario primero definir el modelo de memoria a utilizar, de la misma forma que se hace en los lenguajes de alto nivel; en este caso usamos el modelo Small. Su definicin se hace mediante la directiva .MODEL (note que el punto es parte del nombre del identificador). El segmento de cdigo (en este caso es el nico), se define mediante la directiva .CODE, se establece el punto de entrada al cdigo mediante la etiqueta inicio:, la cual va tambin despus del END final. El retorno al DOS se hace mediante la misma funcin del DOS: 4Ch Veamos el siguiente ejemplo el programa ENSA01A.ASM; en este programa usamos 2 nuevas directivas: TITLE COMMENT Establece el nombre del programa al inicio de cada hoja en el archivo .LST. Nos permite escribir comentarios en varios renglones, utilizando solo dos delimitadores cualquiera, uno al inicio del comentario y el mismo al final.

Agosto Diciembre 2009

Pg. 18 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


TITLE ENSA01A.ASM COMMENT & Programa que muestra el uso de la estructura simplificada para programas .COM & .MODEL Small .CODE ORG 100h inicio: a DB jmp main "Hola$" ;Saltamos los Datos. ;Se fija posicin de inicio del PSP

main: mov dx, OFFSET a mov ah, 9 int 21h mov ax, 4C00h int 21h END inicio

;Ponemos en DX la direccin de ;inicio de la cadena para luego ;llamar a la funcin 09h de la INT 21h. ;Salida del programa y Regreso al ;DOS con cdigo de retorno 00h.

OBSERVACIONES. Al analizar el cdigo notamos que es el mismo utilizado en la estructura estndar, y tambin, igual que el anterior, imprime en pantalla la palabra hola. El smbolo utilizado como delimitador en los comentarios iniciales fue (&), podemos emplear cualquier otro siempre y cuando se use el mismo al inicio y al final.

2.1.3 Estructura para programas .EXE El procesador puede manejar hasta cuatro tipos de segmento; STACK, DATA, EXTRA y CODE. Un programa .EXE requiere como mnimo de la utilizacin de 2 segmentos; el de cdigo y el de pila. El Lenguaje ensamblador siempre busca la definicin del segmento de STACK, genera un error si el usuario olvida incluirlo. Podemos generalizar el mapa de memoria de un programa .EXE de acuerdo a la Figura 2.2.

SP Segmento de clase STACK SS Uno o mas segmentos de clase DATA

Arriba del segmento de STACK

Uno o mas segmentos de clase CODE Punto de entrada

CS:IP

PSP

DS, ES

Posicin inicial de los registros de segmento

Figura 2.2 Mapa de memoria de un programa .EXE Agosto Diciembre 2009 Pg. 19 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


2.1.3.1 Estructura Estndar. El MASM hasta su versin 4.0 manej este tipo de definicin nicamente, a la fecha la sigue soportando de la misma manera lo hace el TASM. Esta definicin nos da un mayor control sobre el programa, en muchas circunstancias es necesario utilizarla. Vamos a empezar analizando un programa con solo 2 segmentos; Uno de cdigo, en el cual tambin se incluyen datos, y el otro de pila, necesario en este tipo de estructura. Estructura Estndar de un Programa .EXE STACK SEGMENT PARA STACK 'STACK' DB 128 DUP (?) STACK ENDS CODE inicio: ;Declaracin del segmento de pila ;Reserva 128 bytes. ;Fin del segmento de pila

SEGMENT PARA PUBLIC 'CODE' ;Declara el segmento de cdigo. ASSUME CS:CODE, DS:CODE, ES:CODE, SS:STACK nop ;Aqu inicia el cdigo. mov ax, 4C00h int 21h ENDS END inicio ;Se usa la funcin 4Ch de la ;Interrupcin 21h para salir al DOS ;Fin segmento de cdigo. ;Indica inicio ejecucin.

CODE

OBSERVACIONES En la estructura anterior se delimita cada segmento por un nombre, entonces tenemos 2 segmentos; uno llamado STACK y el otro llamado CODE. Cada segmento inicia con la directiva SEGMENT y termina con un ENDS (fin de segmento). Esta directiva le indica como debe preparar y estructurar el cdigo en lenguaje de mquina, no genera cdigo de mquina. Sintaxis de SEGMENT. nombre-seg SEGMENT ALINEACION COMBINACION 'CLASE' --sentencias --nombre-seg ENDS Para nuestra definicin. SEGMENTO DE PILA. STACK Nombre del segmento de pila. PARA STACK 'STACK' Alineacin, el segmento inicia en los lmites de un prrafo (direccin divisible entre 16 10h). Combinacin, Indica que el segmento es el de pila. 'Clase', Este parmetro se emplea para hacer referencia a una coleccin de segmentos.

Nota: Los segmentos con el mismo nombre de clase se colocan en memoria secuencialmente, siguiendo el orden en que fueron encontrados por el enlazador. El nombre de la clase puede ser cualquier smbolo. DB DUP Esta directiva significa DEFINE BYTE. Reserva e inicializa con un valor una rea de memoria nveces, si se usa (?) no hay un valor inicial. Sintaxis nveces DUP (valor_inicial) Ejemplos: 1. 2. ENDS

DB 128 DUP (?).- Reserva 128 bytes de espacio de memoria para la pila, este espacio no es inicializado con un valor especfico. DB 128 DUP ('STACK').- El espacio es llenado con 128 repeticiones de la cadena 'STACK'.

Indica el final del segmento llamado STACK Pg. 20 Ing. Claudia E. Carrillo R

Agosto Diciembre 2009

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


SEGMENTO DE CODIGO. CODE PARA PUBLIC Nombre del segmento de cdigo. Alineacin, el segmento inicia en los lmites de un prrafo (direccin divisible entre 16, 10h). Combinacin, Todos los segmentos con el mismo nombre y con atributo PUBLIC sern encadenados juntos. 'Clase', Este parmetro se emplea para hacer referencia a una coleccin de segmentos.

'CODE'

Nota importante: Los segmentos con el mismo nombre de clase se colocan en memoria secuencialmente (PUBLIC), siguiendo el orden en que fueron encontrados por el enlazador. El nombre de la clase puede ser cualquier smbolo. ASSUME Esta directiva asocia el nombre del segmento con el registro de segmento. Sintaxis: ASSUME registro_de_segmento : nombre de segmento inicio: Va antes de la primera instruccin ejecutable, la cual debe ser marcada con una "etiqueta", en este caso se uso inicio:, sta aparece tambin despus del END final. Esta etiqueta indica que el programa deber empezar a ejecutarse a partir de "etiqueta" inicio:. En este caso a partir de la instruccin NOP (no operacin). En un programa especifico, aqu se iniciar con la primera instruccin.

Ejemplo: Programa .EXE. Estructura Estndar. ;Programa ENSA02.ASM STACK SEGMENT PARA STACK 'STACK' DB 64 DUP (?) STACK ENDS ;Declaracin del segmento de pila. ;Reserva 64 bytes para la pila ;Fin del segmento de pila.

CODE SEGMENT PARA PUBLIC 'CODE' ;Declaracin del segmento de cdigo. ASSUME CS:CODE, DS:CODE, ES:CODE, SS:STACK inicio: jmp principio Dato DB 'Hola$' principio: mov ax, CS mov ds, ax mov dx, OFFSET Dato mov ah, 9h int 21h mov ax, 4c00h int 21h CODE ENDS END inicio ;Salta los datos ;Define una cadena terminada en $. ;Asigna el segmento de cdigo al segmento de datos ;Coloca el desplazamiento de la cadena en DX ;Pone en AH funcin 09h de la ;interrupcin 21h ;Usa la funcin 4Ch de interrupcin 21h ;para salir al DOS, 00 es el valor regresado por el programa.

OBSERVACIONES. El programa consta de 2 segmentos: El de cdigo y el de datos. Advierta que es necesario asignar la misma direccin a DS que a CS, ya que en el mismo segmento se maneja cdigo y datos. Este programa imprime la cadena Hola en la pantalla.

Agosto Diciembre 2009

Pg. 21 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


2.1.3.2 Definicin simplificada. La manera ms sencilla de escribir un programa en ensamblador es utilizando la definicin simplificada, sin embargo, esta definicin no nos da un control total sobre la computadora, si lo deseamos, tendremos que recurrir a la estructura estndar de un programa en ensamblador. La estructura simplificada es simple y est disponible a partir de la versin 5.0 del MASM, el TASM en su versin 2.0 tambin la usa. En esta primera incursin, no vamos a ahondar en explicaciones detalladas, ms bien debemos concentrar nuestra atencin en los componentes del programa, de tal manera de poder usar dicha estructura en un programa determinado. Estructura Simplificada de un Programa .EXE .MODEL SMALL .STACK .CODE inicio: nop mov ax, 4C00h Int 21h END inicio ;Aqu inicia el cdigo. ;Se usa la funcin 4Ch de la ;Interrupcin 21h para salir al DOS ;Indica donde inicia la ejecucin. ;Especifica un modelo de memoria. ;Declaracin del segmento de pila. ;Declaracin del segmento de cdigo.

OBSERVACIONES. .MODEL Es una directiva que nos permite definir el Modelo de Memoria utilizado, ste le dice al compilador como acomodar en memoria las instrucciones y los datos. Es el nombre de un Modelo de Memoria el cual nos permite usar un segmento para cdigo y un segmento para datos, donde cada segmento puede tener hasta 64 KB de longitud. Es una directiva que le dice al compilador que reserve una cierta cantidad de memoria para realizar operaciones con la pila. Si no se indica cantidad reserva 1KB. Es una directiva que le indica al compilador el inicio del segmento de cdigo. La primera instruccin ejecutable es necesario que sea marcada con una "etiqueta", en este caso se uso inicio:, sta aparece tambin despus del END final. Esta etiqueta indica que el programa deber empezar a ejecutarse a partir de la "etiqueta" inicio:. En este caso a partir de la instruccin NOP (no operacin). En un programa especifico, aqu se iniciar con la primera instruccin.

SMALL

.STACK

.CODE

Ejemplo: ENSA02A.ASM. Estructura Simplificada. COMMENT * Programa ENSA02A.ASM * .MODEL SMALL .STACK 100h .CODE inicio: jmp principio Dato DB 'Hola$' ;Especifica el modelo de memoria SMALL ;Se separan 256B. para la pila. ;Inicia el segmento de cdigo. ;Salta los datos. ;Define una cadena terminada en $.

principio: mov ax, CS mov DS, ax Agosto Diciembre 2009

;Asigna el segmento CS a DS ;el programa solo tiene dos segmentos. Pg. 22 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


mov dx, OFFSET Dato mov ah, 9h int 21h mov ax, 4c00h int 21h END inicio OBSERVACIONES. El programa consta de 2 segmentos: cdigo y stack. Es conveniente colocar las etiquetas en una lnea aparte, esto hace que no se pierda la identacin del programa cuando la etiqueta es grande. Para asignar el contenido de un registro de segmento a otro registro de segmento, es necesario hacerlo tomando como intermediario un registro de propsito general, en este caso el AX. Usando la directiva COMMENT para comentarios. El comentario puede tener ms de 1 rengln, se usa un delimitador, al inicio y al final del comentario, el delimitador puede ser cualquier signo. Este programa imprime la cadena Hola en la pantalla, para lograrlo llama a la funcin 09h de la interrupcin 21h del DOS. Nota importante: Al usar nmeros en un archivo fuente de un programa en ENSAMBLADOR, stos por default son considerados como decimales, a menos que se haga una declaracin explicita, como en el 21h; donde (h) indica que el radix del nmero 21 es hexadecimal. ;Coloca el offset del mensaje en DX ;Pone en AH funcin 09h de ;interrupcin 21h ;Usa la funcin 4Ch de interrupcin 21h ;para regresar al DOS.

2.1.3.3 Programas .EXE con 3 segmentos: Este tipo de formato es el ms comn, consta de: a) Segmento de STACK. b) Segmento de DATOS. c) Segmento de CODIGO.

Ejemplo 1: Usando la Estructura Simplificada. COMMENT + Programa usando el mtodo Simplificado. ENSA03.ASM + .MODEL SMALL .STACK 100h .DATA Dato DB 'Hola$' .CODE inicio: mov ax, @DATA mov ds, ax mov dx, OFFSET Dato mov ah, 9h int 21h mov ax, 4c00h int 21h END inicio OBSERVACIONES. Este programa es el mismo que los anteriores, solo que ahora estamos incluyendo una nueva directiva de compilacin, esta es, .DATA, la cual define un segmento para datos. La asignacin de este segmento al registro DS se hace igual que en los pasados, de manera indirecta, pero ahora se usa para tal propsito la palabra reservada ( @DATA), la cual contiene la direccin del rea de datos Agosto Diciembre 2009 Pg. 23 Ing. Claudia E. Carrillo R ;Define el Modelo de Memoria SMALL ;Asigna un espacio de 256 bytes a la pila ;Inicia el segmento de Datos. ;Define una cadena terminada en $ ;Inicia segmento de cdigo. ;Asigna a DS la direccin de inicio ;del segmento de Datos. ;Coloca el offset de Dato en DX ;Pone en AH funcin 09 de int 21h ;Usa la funcin 4Ch de int 21h para ;salir al DOS.

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Ejemplo 2: Usando la Estructura Estndar. ; Programa ENSA03A.ASM, Ahora usamos 3 segmentos. STACK SEGMENT PARA STACK 'STACK' ;Inicio del segmento de pila. DB 64 DUP (?) ;Se reservan 64 bytes STACK ENDS ;Fin de la pila. DATA SEGMENT PARA PUBLIC 'DATA' ;Inicia seg. de Datos. Dato DB 'Hola$' ;Se define una cadena DATA ENDS ;Fin del segmento de datos. CODE SEGMENT PARA PUBLIC 'CODE' ;Inicia segmento de cdigo. ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK inicio: mov ax, DATA ;Asigna la direccin del segmento mov ds, ax ;de datos al registro DS mov dx, OFFSET Dato ;Coloca el offset del mensaje en DX mov ah, 9h ;Pone en AX funcin 09 de int 21h. int 21h mov ax, 4c00h ;Usa la funcin 4Ch para salir al int 21h ;DOS, regresa 00. CODE ENDS ;Fin del segmento de cdigo. END inicio OBSERVACIONES. En este caso se define formalmente todo el segmento de datos usando la directiva SEGMENT, la alineacin, la combinacin y la 'clase'. En la directiva ASSUME se designa como segmento de datos a DATA y se le relaciona a DS, lo mismo se hace con ES, sin embargo, la direccin de DATA, debe ser asignada usando el mtodo indirecto por medio del registro AX. Ya que al inicio del programa estos registros apuntan al inicio del PSP.

2.1.3.4. Programas con su cuerpo principal dentro de un procedimiento. Al definir este tipo de estructura debemos tener en cuenta algunos puntos: 1. 2. Declarar el procedimiento como FAR. Cuando se define este tipo de estructura para programas en ensamblador no es necesario llamar a la funcin 4Ch de la interrupcin 21h para regresar al DOS, esto se hace simplemente usando una instruccin RETF, esta saca de la pila los ltimos 4 bytes los cuales deben contener la direccin de llamada a la interrupcin 20h, la cual tambin nos regresa al DOS. Primero sale el OFFSET y luego el segmento. La direccin que se debe almacenar en la pila es la direccin de inicio del PSP (OFFSET 0000h), cuando el programa es cargado a memoria, el registro DS apunta a la direccin de segmento del inicio del PSP, como el OFFSET debe ser 0000h, esto se logra poniendo un CERO en la pila, se emplea para ello el registro AX. La introduccin de estos valores a la pila se hace con una instruccin PUSH, primero se mete DS, y luego AX = 0000h. La instruccin RETF los saca al revs.

3.

Sintaxis del procedimiento. etiqueta PROC [ NEAR | FAR ] --secuencia de sentencias --RET etiqueta ENDP

Veamos 2 ejemplos: a) Usando la Estructura Simplificada. b) Usando la Estructura Estndar.

Agosto Diciembre 2009

Pg. 24 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


a) Usando Estructura Simplificada. COMMENT + Programa usando el mtodo Simplificado. ENSA03B.ASM + .MODEL SMALL ;Define el Modelo de Memoria SMALL .STACK 100h ;Asigna un espacio de 256 bytes a la pila .DATA ;Inicia el segmento de Datos. Dato DB 'Hola$' ;Define una cadena terminada en $ .CODE inicio: MAIN PROC FAR push ds sub ax, ax push ax mov ax, @DATA mov ds, ax mov dx, OFFSET Dato mov ah, 9h int 21h ret MAIN ENDP END inicio ;Inicia segmento de cdigo.

;Se guarda en la pila la direccin de regreso al DOS. ;El offset se pone en cero ;y se guarda en la pila. ;Asigna a DS la direccin de inicio ;del segmento de Datos. ;Coloca el offset de Dato en DX ;Pone en AH funcin 09 de int 21h

;Regresamos al DOS sacando de la pila la direccin completa ds:0000

OBSERVACIONES. El programa es el mismo que se ha venido usando, note que aparece la instruccin RET, el ensamblador la substituye por RETF. Esta instruccin saca del STACK primero la direccin de OFFSET y luego la direccin de segmento, a donde debe ser transferido el control. Note que el procedimiento lleva un nombre, en este caso MAIN, al concluir el procedimiento se usa ENDP referencindolo tambin con el nombre del procedimiento MAIN. Lo que cambiara para otro programa sera: el tamao de la pila, los datos y la seccin correspondiente al cdigo de asignacin de segmento y OFFSET e impresin de cadena. b) Usando Estructura Estndar. ; Programa ENSA03C.ASM, Con 3 segmentos usando un PROCedimiento. STACK SEGMENT PARA STACK 'STACK' ;Inicio segmento de pila. DB 64 DUP (?) ;Se reservan 64 bytes STACK ENDS ;Fin de la pila. DATA SEGMENT PARA PUBLIC 'DATA' ;Inicia segmento de Datos. Dato DB 'Hola$' ;Se define una cadena DATA ENDS ;Fin del segmento de datos. CODE SEGMENT PARA PUBLIC 'CODE' ;Inicia segmento de cdigo. ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK inicio: MAIN PROC FAR push ds sub ax, ax push ax mov ax, DATA mov ds, ax mov dx, OFFSET Dato mov ah, 9h int 21h ret MAIN ENDP CODE ENDS END inicio

;Almacena en la pila DS y AX ;con un valor de CERO.

;Asigna la direccin del segmento. ;de datos al registro DS ;Pone offset de mensaje en DX ;Pone en AX funcin 9 de la int 21h.

;Retorna al DOS sacando de la ;Pila la direccin de regreso ;Fin del segmento de cdigo.

Agosto Diciembre 2009

Pg. 25 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA. 2.2. Elementos de un programa en ENSAMBLADOR.
2.2.1. Las sentencias en Lenguaje ENSAMBLADOR. La sentencia es una combinacin de mnemnicos, operandos y comentarios que definen el cdigo objeto a ser creado en tiempo de ensamblado. Cada lnea de cdigo fuente consiste de una sola sentencia, varias sentencias en una lnea no son permitidas. Las sentencias no debern tener ms de 128 caracteres. Una sentencia puede tener hasta 4 campos. Sintaxis: [label] [mnemnico] [operandos] [;comentarios] Donde: label: Etiqueta la sentencia, de tal forma de poder accesarla por nombre desde otra sentencia. mnemnico: Define la accin de la sentencia. operandos: Define el dato a ser manipulado por la sentencia. comentarios: Describe la sentencia, no tiene efecto en el ensamblado. Las sentencias pueden ser escritas en maysculas o minsculas, el ensamblador no es sensible al tamao. Cada campo a excepcin de los comentarios, debe ser separado de otro por medio de un espacio o un tabulador. Se recomienda el uso de tabuladores para hacer ms legible el cdigo. 1. a) b) MNEMONICO. Los mnemnicos son de 2 tipos: DIRECTIVAS. Especifican la manera en que el ensamblador va a generar el cdigo objeto durante el tiempo de ensamble. INSTRUCCIONES. Son transformados en tiempo de ensamble en cdigo objeto. En tiempo de ejecucin controlan la ejecucin del programa.

OPERANDOS. Definen el dato a ser usado por directivas e instrucciones. registros. a)

2.

Constan de smbolos, constantes, expresiones y

LOS SIMBOLOS. Un smbolo es un nombre que representa un valor, son tal vez, los elementos ms importantes de un programa en lenguaje ENSAMBLADOR, stos incluyen; variables, direcciones, etiquetas, macros, segmentos, procedimientos, registros, y estructuras. Constantes, expresiones y cadenas pueden ser representados tambin simblicamente. Un smbolo es un nombre que consta de letras, nmeros y caracteres especiales. Algunas reglas para construir smbolos: 1) El nombre puede tener cualquier combinacin de letras maysculas y minsculas. 2) Los Dgitos pueden ser utilizados dentro de un nombre, pero nunca debern ser el primer carcter del nombre. 3) Un nombre puede tener cualquier nmero de caracteres, pero solo los primeros 31 caracteres son reconocidos. 4) Los caracteres guin bajo (_), la interrogacin (?), y el signo (@) pueden usarse tanto al inicio como dentro de un nombre. 5) El punto (.) no puede ser utilizado dentro de un nombre, pero si puede ser el primer carcter de un nombre. 6) Un nombre no puede ser igual a ninguna palabra reservada.

b)

LAS CONSTANTES. Las constantes se usan en los archivos fuente para especificar nmeros o cadenas, las cuales son inicializadas en tiempo de ensamblado. El MASM reconoce 4 tipos de constantes. 1) Enteras. 2) Binarios empaquetados codificados en decimal. 3) Nmeros Reales. 4) Cadenas. Pg. 26 Ing. Claudia E. Carrillo R

Agosto Diciembre 2009

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


1) Enteras. Se usan para declaracin de datos, o como operandos inmediatos. Estos pueden especificarse en binario, octal, decimal o hexadecimal. El RADIX para un entero puede ser definido usando el especificador RADIX o globalmente mediante la directiva .RADIX Especificadores de Radix. Radix Binario Octal Decimal Hexadecimal Especificador B QO D H b qo d h

Los nmeros hexadecimales debern siempre empezar con un dgito (0 al 9), cuando el nmero inicia con una letra deber anteponerse un CERO (0) para distinguir entre smbolos y nmeros hexadecimales. Las letras pueden ser tambin maysculas y minsculas. El Radix predefinido es el decimal, pero puede ser alterado globalmente en el programa usando la directiva .RADIX Sintaxis: .RADIX expresin Donde: expresin: Es un nmero entre 2 - 16 el cual define la base a ser empleada como predefinida. Nota: La directiva RADIX no afecta a nmeros reales inicializados como variables con las directivas; DD, DQ o DT. Los valores iniciales de estas variables son evaluados como nmeros decimales.

Ejemplo: .RADIX 16 .RADIX 2 ;Define el default Radix como hexadecimal. ;Define el default Radix como binario.

2) Binarios empaquetados codificados en decimal. Cuando un nmero constante entero se define empleando la directiva DT, el nmero se interpreta predefinido como un nmero binario empaquetado codificado en decimal. La sintaxis para especificar nmeros binarios codificados en decimal es exactamente la misma que para otros enteros; sin embargo MASM a los nmeros Binarios Empaquetados Codificados en Decimal los codifica de manera diferente. Ejemplo: positivo DT 1234567890 negativo DT -1234567890

;codifcado 00000000001234567890h ;codificdo 80000000001234567890h

3) Nmeros Reales. Un nmero real consiste de una parte entera, una parte fraccionaria y un exponente. Los nmeros reales son expresados usualmente de manera decimal. Sintaxis: [+ | -] entero.fraccin [E [+ | -] exponente] Durante el ensamblado el nmero real expresado en forma decimal es convertido a formato binario, as tanto el signo, el exponente y la mantisa son convertidos a bits. Se puede expresar tambin el nmero real, ya codificado en binario seguido del designador (R), se usa como el Radix, para nmeros reales. Los nmeros reales pueden ser utilizados para inicializar variables con las directivas DD, DQ y DT. El mximo nmero de dgitos y el mximo rango del exponente depende de la directiva. Por definicin los nmeros reales son expresados en el formato IEEE. Agosto Diciembre 2009 Pg. 27 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Ejemplos: short long long_double DD 25.23 DQ 2.523E1 DT 2523E-2

;Formato IEEE lee_short lee_long lee_longdouble DD 3F800000R DQ 3FF0000000000000R DT 3FFF8000000000000000R ;short 1.0 ;long 1.0 ;long double 1.0

4) Cadenas. Sintaxis: 'caracteres' "caracteres" Las constantes de cadena si son sensibles al tamao. Cuando una cadena consta de solo un carcter, se le llama constante de carcter. Ejemplos: cad1 cad2 cad3 cad4 cad5 cad6 cad7 DB DB DB DB DB DB DB 'a' "a" "Este es un mensaje" 'Pepe''s loches' "Pepe's lonches" "Este ""valor"" no existe" 'Este "valor" no existe'

;Imp: Pepe's lonches ;Imp: Pepe's lonches ;Imp: Este "valor" no existe ;Imp: Este "valor" no existe

c) COMENTARIOS. Son descripciones del cdigo, usados solo para documentacin del programa, son ignoradas por el ensamblador. Los comentarios pueden ser escritos de 2 maneras. a) Usando un punto y coma (;) como inicio del comentario en cada lnea. b) Usando la directiva COMMENT Sintaxis: COMMENT delimitador [texto] texto delimitador [texto] Todo el texto escrito entre la lnea del primer delimitador y la lnea del segundo delimitador es ignorado por el ensamblador. El carcter delimitador es el primer carcter NO BLANCO despus de la directiva COMMENT.

Agosto Diciembre 2009

Pg. 28 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA. 2.3. Herramientas de Desarrollo.


2.3.1 El paquete de ENSAMBLADOR de Microsoft ( MASM) El MACROASSEMBLER (MASM), nos brinda una sintaxis de programacin lgica adaptada a la arquitectura de segmentacin de los microprocesadores 8086/8088, 80186/80188, 80286 y 80386, as como a los procesadores matemticos 8087, 80287 y 80387. El ensamblador nos ofrece mdulos objeto reubicables producidos de archivos fuente en ensamblador. Estos mdulos objeto pueden ser enlazados usando el LINK, tambin de Microsoft. Los mdulos objeto creados por MASM son compatibles con muchos de los mdulos objeto de lenguajes de alto nivel, de los cuales podemos mencionar aquellos que nos brinda Microsoft como son: BASIC, C, FORTRAN y compiladores de Pascal. MASM nos brinda un conjunto de caractersticas, que hacen fcil la programacin, de las cuales podemos mencionar las siguientes: Cuenta con un conjunto completo de Macro Directivas. Podemos compilar de manera condicional porciones de un archivo fuente. Soporta un rango amplio de operadores para crear expresiones complejas en tiempo de ensamblado. Cuenta con una estricta verificacin de sintaxis de todos los estatutos declarados en el archivo fuente. MASM requiere de ciertas caractersticas de hardware y software para poder trabajar adecuadamente y stas se citan a continuacin: De la versin 2.0 del MS DOS en adelante. 192 KB. de memoria RAM. Si se usa el CODE VIEW 320 KB. 2.3.1.1 Ciclo de Desarrollo de un Programa. 1) Use un Editor de Texto que produzca cdigo ASCII para crear y/o modificar los mdulos fuente del programa en ensamblador (Archivos .ASM). Al escribir el archivo fuente recuerde que MASM no es sensible al tamao (puede ser escrito con MAYSCULAS o con minsculas). Use el comando MASM para ensamblar cada uno de los mdulos fuente, (.ASM) el mdulo resultante ser un archivo OBJ. Usando el MASM tambin se pueden crear durante el ensamblado archivos LST (Listado) y CRF (Archivo de referencias cruzadas). Sintaxis de MASM: MASM [opciones] arch_fu [,[arch_obj] [,[arch_lst] [,[arch_ref]]]] [;] De las opciones disponibles en MASM, podemos considerar las siguiente, como ms usuales. /HELP Para ver todas las opciones de MASM. En este caso solo se usa con MASM esta opcin Ej; MASM /Help /V Informacin adicional en el ensamblado. + Nmero de lneas. + Smbolos procesados. /Z Muestra las lneas que contienen errores en la pantalla adems del mensaje de error que describe el problema. /ZI Escribe informacin simblica en el archivo objeto para ser usada por el CODE VIEW (CV).

2)

Ejemplos. Suponemos ya tecleado el archivo ENSA01.ASM y que el PROMPT es A:\USER> a) Para crear solo el archivo ENSA01.OBJ se teclea: A:\USER>MASM ensa01; b) Para crear los archivos: ENSA01.OBJ, ENSA01.LST, ENSA01.CRF y utilizando los parmetros que nos sirven para generar informacin adicional tanto en el ensamblado as como si existen errores, nos mostrar las lneas donde estos fueron generados y por ltimo va a incluir en el archivo .OBJ informacin para el uso posterior del CODE VIEW (CV). A:\USER>MASM /V /Z /ZI ensa01,,,; Nota. Los archivos .CRF son archivos binarios para que estos puedan ser ledos deben ser convertidos a ASCII, esto se hace mediante el archivo CREF, ejemplo: A:\USER>CREF ensa01; Agosto Diciembre 2009 Pg. 29 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.

Figura 2.3 Ciclo de Desarrollo de un Programa.

Agosto Diciembre 2009

Pg. 30 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


3) Use el comando LINK para combinar los mdulos objeto (.OBJ) con los mdulos en las libreras obteniendo como salida un solo archivo ejecutable con extensin .EXE, durante el proceso de enlazado tambin podemos crear de manera opcional un archivo .MAP, el cual contiene la distribucin de los segmentos en el mapa de memoria del programa. Sintaxis de LINK LINK [opciones] arch_obj [,[arch_exe] [,[arch_map] [,[arch_lib]]]] [;] La opcin ms usual en LINK es: /CO Se usa cuando en MASM incluimos /ZI, aade al archivo ejecutable informacin de DEBUG, esto se hace cuando se va a usar posteriormente el CODE VIEW (CV). /HELP Nos muestra las opciones del LINK. Ejemplos. Suponemos ya creado el archivo ENSA01.OBJ y que el PROMPT es A:\USER> a) Para generar solo el archivo ENSA01.EXE, sin informacin para CODE VIEW. A:\USER>LINK ensa01; b) Para crear solo el archivo ENSA01.EXE, incluyendo informacin para CODE VIEW. A:\USER>LINK /CO ensa01; c) Produciendo el archivo ENSA01.EXE y adems el archivo ENSA01.MAP. A:\USER>LINK ensa01,,; d) Si contamos con 2 archivos .OBJ (ENSA01.OBJ y ENSA01A.OBJ), adems otro archivo .OBJ llamado en algunos de los anteriores se encuentra en una librera llamada MILIB.LIB. Vamos a crear los archivos ENSA01.EXE y ENSA01.MAP. A:\USER>LINK ensa01 ensa01a,,,milib;

4)

Si desea un archivo .COM (del cual ya fueron discutidas sus caractersticas). Use EXE2BIN para convertir un archivo ejecutable a un archivo .COM. Ejemplo: Supongamos que el archivo ENSA01.EXE rene los requisitos de un archivo .COM, creamos entonces el archivo ENSA01.COM A:\USER>EXE2BIN ensa01 ensa01.com

5)

Haga un DEBUG del programa para detectar errores lgicos, este rastreo puede ser realizado de varias formas: * Corra el programa y estudie sus entradas y salidas. * Estudie el listado del archivo fuente. * Use CREF para generar un listado de referencias cruzadas (.REF). * Rastree el Programa paso a paso, use: + El DEBUG del sistema Operativo. + El CODE VIEW (CV) del MASM. Una vez descubiertos los errores regrese al punto UNO para corregir el archivo fuente (.ASM).

6)

Todo o parte del ciclo de desarrollo de un programa puede ser automatizado mediante: Para programas sencillos, use archivos .BAT Para programas ms complejos use el MAKE

Para que pruebe lo anterior: Escriba en un Editor el siguiente programa: Agosto Diciembre 2009 Pg. 31 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


COMMENT * Programa ENSA02A.ASM * .MODEL SMALL .STACK 100h .CODE inicio: jmp principio Dato DB 'Hola$' principio: mov ax, CS mov ds, ax mov dx, OFFSET Dato mov ah, 09h int 21h mov ax, 4c00h int 21h END inicio Ensamble el programa usando MASM, con informacin adicional, tanto de ensamblado como de errores. Se crear un archivo ENSA02A.OBJ A:\USER>MASM /V /Z ensa02A; Genere el archivo ejecutable usando LINK, se crear el archivo ENSA02A.EXE A:\USER>LINK ensa02A; ;Declaracin del modelo de memoria SMALL ;Se separan 256 B. para la pila. ;Inicia el segmento de cdigo. ;Salta los datos. ;Define una cadena terminada en $,esto se usa con la funcin 9 de la int. 21h ;Asigna el segmento CS a DS ;el programa solo tiene dos segmentos ;Pone offset de mensaje en DX ;Pone en AH funcin 09 de la ;interrupcin 21h ;Usa la funcin 4Ch de int 21h ;para regresar al DOS.

2.3.2. Depuracin Como programador, sabr que el proceso de depuracin de una aplicacin es indispensable como parte del desarrollo, no slo para detectar fallos puntuales que pudieran surgir en esa fase sino, adems como verificacin de que el programa hace, efectivamente, lo que tiene que hacer. sta es una necesidad que se agudiza al programar en ensamblador que, puesto que cualquier proceso, por simple que pueda ser, requiere muchas instrucciones, siendo imprescindible comprobar cada paso y el resultado global.

2.3.2.1. El DEBUG del DOS. El DEBUG es un programa que nos ofrece un medio controlado para depurar archivos objeto binarios y ejecutables, elimina la necesidad de re-ensamblar un programa para ver si un problema se ha resuelto con un cambio menor. Nos permite alterar el contenido de un archivo o el contenido de un registro del microprocesador e inmediatamente volver a ejecutar el programa para verificar la validez de los cambios realizados. Todos los comandos de DEBUG pueden ser anulados en cualquier momento oprimiendo simultneamente las teclas [Control][C]. La secuencia [Control][S] suspende la presentacin en pantalla, para poder ver la informacin antes de que la salida se desplace fuera de la pantalla. Oprimiendo cualquier tecla, excepto [Control][C] [Control][S] permite la continuacin de la presentacin. 2.3.2.1.1. Como ejecutar el DEBUG. Desde la lnea de comandos: a) Mtodo 1 Para ejecutar el DEBUG usando el mtodo 1 simplemente se teclea desde la lnea de comandos: A:\USER\>debug [ENTER] DEBUG responde con un guin (-), indicando que est listo para aceptar comandos. Como no se especific nombre de archivo se pueden utilizar comandos para trabajar en la memoria, o en sectores de disco. Agosto Diciembre 2009 Pg. 32 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Una vez que aparece el mensaje; de fin de programa para reiniciar el programa use los comandos: N (nombre) L (carga) Luego el programa se ejecutar normalmente. b) Mtodo 2 Para ejecutar el DEBUG utilizando una lnea de comandos, utilice la siguiente sintaxis: DEBUG [nom_arch[lista de argumentos]] Ejemplo, Si hacemos un DEBUG al programa ENSA01B.EXE, escribiremos desde la lnea de comandos: A:\USER\>DEBUG ENSA02A.EXE DEBUG cargar ENSA02A.EXE en la memoria empezando en 100h, en el segmento ms bajo posible. Los registros BX:CX contienen el nmero de bytes puestos en memoria. lista de argumentos Es una lista de parmetros e indicadores de nombres de archivo que sern pasados al programa indicado en nom,_arch. Entonces, esto es equivalente a teclear desde la lnea de comandos: nom_arch lista de argumentos

2.3.2.1.2 Informacin de los comandos del DEBUG. Cada comando del DEBUG consta de una sola letra seguida por uno o ms parmetros. Cuando ocurre un error en un comando, DEBUG vuelve a imprimir la lnea de comandos e indica el error con (^Error). Los comandos pueden ser tecleados tanto en mayscula como en minscula. LISTA DE COMANDOS DE DEBUG Comando A [direccin] C rango direccin D [rango] E direccin [lista] F rango lista G [= direccin [direccin...]] H valor valor I valor L [direccin [unidad:registro registro]] M rango direccin N Nombre de archivo [nombre de archivo] O valor byte P [=direccin] [valor] Q R [nombre de registro] S rango lista T [= direccin] [valor] U [rango] W [direccin [unidad:registro registro]] xa xd xm xs Funcin Ensamblar Comparar Vaceado Entrar Inicializar Ejecutar Hexadecimal Entrada Cargar Mover Nombre Salida Seguir Terminar DEBUG Registro Buscar Seguir Desensamblar Escribir Asigna memoria expandida. Designa memoria expandida. Relaciona pginas de memoria expandida. Presenta el estado de la memoria expandida.

Agosto Diciembre 2009

Pg. 33 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Indicador Desbordamiento Direccin Interrupcin Signo Cero Arrastre auxiliar Paridad Arrastre Activado (1) OV DN (decremento) EI (habilitado) NG (negativo) ZR AC PE (par) CY Desactivado (0) NV UP (incremento) DI (deshabilitado) PL (positivo) NZ NA PO (impar) NC

2.3.2.1.3 Un ejemplo de uso del DEBUG. Para el ejemplo consideremos el programa ENSA02A.EXE, y mostremos el uso de los comandos ms importantes. Para correr el DEBUG tecleemos, desde nuestro PROMPT:

A:\USER\>DEBUG ENSA02A.EXE -r

[ENTER]

AX=0000 BX=0000 CX=0017 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=3865 ES=3865 SS=3877 CS=3875 IP=0000 NV UP EI PL NZ NA PO NC 3875:0000 EB05 JMP 0007 -t AX=0000 BX=0000 CX=0017 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=3865 ES=3865 SS=3877 CS=3875 IP=0007 NV UP EI PL NZ NA PO NC 3875:0007 8CC8 MOV AX,CS -t 3 AX=3875 BX=0000 CX=0017 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=3865 ES=3865 SS=3877 CS=3875 IP=0009 NV UP EI PL NZ NA PO NC 3875:0009 8ED8 MOV DS,AX AX=3875 BX=0000 CX=0017 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=3875 ES=3865 SS=3877 CS=3875 IP=000B NV UP EI PL NZ NA PO NC 3875:000B BA0200 MOV DX,0002 AX=3875 BX=0000 CX=0017 DX=0002 SP=0100 BP=0000 SI=0000 DI=0000 DS=3875 ES=3865 SS=3877 CS=3875 IP=000E NV UP EI PL NZ NA PO NC 3875:000E B409 MOV AH,09 -t AX=0975 BX=0000 CX=0017 DX=0002 SP=0100 BP=0000 SI=0000 DI=0000 DS=3875 ES=3865 SS=3877 CS=3875 IP=0010 NV UP EI PL NZ NA PO NC 3875:0010 CD21 INT 21 -p Hola AX=0924 BX=0000 CX=0017 DX=0002 SP=0100 BP=0000 SI=0000 DI=0000 DS=3875 ES=3865 SS=3877 CS=3875 IP=0012 NV UP EI PL NZ NA PO NC 3875:0012 B8004C MOV AX,4C00 -g El programa ha terminado normalmente
Agosto Diciembre 2009 Pg. 34 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.

-n ensa02A.exe -l -r AX=0000 BX=0000 CX=0017 DX=0002 SP=0100 BP=0000 SI=0000 DI=0000 DS=3897 ES=3897 SS=38A9 CS=38A7 IP=0000 NV UP EI PL NZ NA PO NC 38A7:0000 EB05 JMP 0007 -ucs:0 L 2 38A7:0000 EB05 -ucs:7 L 10 3875:0007 3875:0009 3875:000B 3875:000E 3875:0010 3875:0012 3875:0015 8CC8 8ED8 BA0200 B409 CD21 B8004C CD21 MOV MOV MOV MOV INT MOV INT AX,CS DS,AX DX,0002 AH,09 21 AX,4C00 21 Class CODE DATA STACK JMP 0007

El archivo ENSA02A.MAP RESULTA: Start Stop Length Name 00000H 00016H 00017H _TEXT 00018H 00018H 00000H _DATA 00020H 0011FH 00100H STACK Origin Group 0001:0 DGROUP Program entry point at 0000:0000

Usando el DEBUG y el archivo ENSA02A.MAP podemos construir el mapa de memoria del programa.

2.3.2.2 El CODE VIEW (CV). Este depurador es capaz de rastrear un programa a nivel de cdigo fuente, lo que tambin nos permite usarlo con lenguajes de alto nivel como; BASIC, FORTRAN o "C", en donde trazamos una lnea a la vez, usando este programa podemos tambin monitorear variables del programa usando el nombre con que fueron declaradas. La habilidad del CV de poder usar el cdigo fuente para trazar un programa, tambin se aplica al Lenguaje ENSAMBLADOR. A diferencia de otras herramientas, el CV usa interface de pantalla durante el rastreo del programa, contando con seleccin de comandos por medio de ventanas, adems cuenta con una lnea de comandos alterna y uso de ratn. En la figura 2.4 presentamos las partes que integran la ventana del CV.

Agosto Diciembre 2009

Pg. 35 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.

Figura 2.4 Pantalla del CV

1. Ventana Principal, muestra el cdigo a rastrear. 2. Barra de Ejecucin, muestra la siguiente lnea a ser ejecutada cuando se esta rastreando un programa. 3. Sealizadores de BREAKPOINTS, las lneas mostradas en alta intensidad, son de puntos de paro fijados previamente. 4. Ventana de Dialogo, nos permite introducir comandos, tambin nos puede mostrar salidas como localidades de memoria. 5. Cursor, Se localiza en la ventana de dialogo, nos permite introducir comandos. 6. Separador de Ventanas, divide la Ventana de Dialogo de la Ventana Principal. 7. Ventana de Registros, nuestra el estado de los registros del microprocesador incluyendo el estado de las banderas, es capaz de mostrar los registros de 32 bits del 80386. Tambin nos muestra la direccin efectiva del operando en memoria a ser procesado. Agosto Diciembre 2009 Pg. 36 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


8. Barras de SCROLL, nos permiten, mediante el uso del ratn, avanzar hacia arriba o hacia abajo el contenido de la Ventana Principal. 9. Ventana de WATCH, es una ventana opcional, nos muestra el estado de las variables monitoreadas. 10. Barra de Men, nos muestra los ttulos de los mens principales, los cuales pueden activarse con el teclado o con el ratn. 11. Ventana de Comandos, cada ttulo sobre la Barra de Men contiene una ventana con opciones las cuales pueden ser activadas por medio del teclado o por medio del ratn. 12. Men Seleccionado, dentro de la ventana de Comandos, la lnea sobresaliente nos indica la seleccin actual, se puede cambiar la seleccin con el ratn o con el teclado. 13. Cursor del ratn, indica la posicin actual del ratn. 14. Cajas de Dialogo, (no mostradas), aparecen al centro de la Ventana Principal, cuando se selecciona un men que requiere una entrada de informacin. 15. Cajas de Mensaje, (no mostradas), aparecen al centro de la pantalla, para indicar un error u otros mensajes; como fin de un programa.

Pasos para el uso del CODE VIEW. 1) ARRANQUE. La manera ms fcil de arrancar el CV es, desde la lnea de comandos suponiendo que nuestro PROMPT es A:\USER\> CV [opciones] arch_exe [argumentos] Donde: opciones: Nos permiten modificar las condiciones de operacin del CV, ejemplo: /M Se usa si se cuenta con un Ratn y no se quiere que este activo durante el rastreo. /P Se usa cuando se tiene una tarjeta EGA y se hay problemas al correr el CV. arch_exe: Es el archivo que se quiere rastrear, en el directorio de trabajo deben existir tanto el fuente como el ejecutable. El archivo .EXE debe haber sido creado usando con el MASM (/ZI) y con el LINK (/CO). Si se carga un archivo no ejecutable, aparece el siguiente mensaje: Not an executable file Los archivos .COM no pueden contener informacin para DEBUG, por lo tanto solo pueden ser rastreados en modo ensamblador. Si se rastrea un archivo de este tipo deber especificarse la extensin. argumentos: Se usan si el programa que se quiere rastrear los utiliza. Ejemplo: Si el prompt es A:\USER>CV ENSA01 2) EL AMBIENTE. Una vez dentro del CV es posible observar el valor de los registros presionando la tecla F2. Para rastrear el programa paso a paso, usamos la tecla F8. Para saltar llamadas a procedimientos cuyo cdigo se encuentra en el mismo archivo usamos F10. El CV cuenta con una rea de dialogo en la parte inferior de la pantalla, por medio de la cual, nos es posible interactuar con l, de manera similar como lo hicimos con el DEBUG. En el CV es posible tambin introducir instrucciones como el comando A, mostrar el contenido de una rea de memoria mediante el comando D, o ejecutar un programa usando el comando G, para desensamblar cdigo se usa U, para salir del CV podemos usar tambin el comando Q. El CV espera nmeros en decimal, para que acepte nmeros en hexadecimal es necesario cambiar el radix usando el comando n16. El CV trabaja con 2 pantallas, en una vemos el programa a rastrear, los registros, el men y el rea de dialogo y en la otra nos muestra los resultados generados, podemos cambiar a esta pantalla usando F4. Para tener acceso a los mens oprimimos la tecla ALT o usamos el ratn. Agosto Diciembre 2009 Pg. 37 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


3) MENUS

Men File View Search Run Watch Options Lenguage Calls Help

Descripcin Abre un archivo fuente. Salida temporal al DOS. Salida del CV. Ver el archivo actual como fuente, ensamblado. Mostrar los registros. Ver la pantalla de salida. Busca una cadena en el archivo fuente o una etiqueta en el cdigo ejecutable. Inicia ejecucin de un programa, Reinicializa un programa. Limpia Breakpoints. Monitorea variables y expresiones. Activa cambios de pantalla, Activa registros del 80386. Selecciona el lenguaje a rastrear. No hay opciones en este men. Muestra una lista de las rutinas llamadas durante la ejecucin de un programa. Selecciona el tpico sobre el cual se requiere ayuda.

4) BUSCANDO AYUDA EN EL CV. El ambiente interactivo del CV cuenta con una extensa ayuda, es posible obtener ayuda seleccionando un tpico del men de ayuda, presionando ALT+h o presionando F1, para salir de la ventana de ayuda presione ESC.

5) OBSERVANDO VARIABLES. Para iniciar el proceso seleccione del men WATCH... ADD WATCH, aparece entonces una ventana y el cursor nos indica que podemos escribir el nombre de una expresin cuyo valor deseemos observar, la expresin puede ser simplemente el nombre de una variable que aparece en el programa o el nombre de un registro. Una vez seleccionada la expresin, se abre una ventana en la parte superior de la pantalla, en ella se muestra el nombre de la expresin y su contenido. Por default el valor es mostrado en Decimal, si se requiere el valor en hexadecimal, en el rea de dialogo se debe teclear el comando n16, l cual nos cambia el radix (Se usa la convencin de "C" para mostrar los hexadecimales 0x____ ). Esto se debe a que originalmente el CV fue escrito para el C Compiler de Microsoft. 6) PONIENDO PUNTOS DE PARO (BREAKPOINTS) Un punto de paro sobre una instruccin le dice al CV que ejecute normalmente el programa hasta llegar a la instruccin con el BREAKPOINT en donde se detiene la ejecucin normal del programa, permitindonos continuar a partir de ese punto, paso a paso. Para colocar un BREAKPOINTS es necesario mover el cursor desde el rea de dialogo a la ventana principal, esto se hace presionando F6. Estando el cursor en esta ventana buscamos la lnea donde deseamos que el programa se detenga, colocamos sobre ella el cursor y presionamos F9. La lnea donde es activado el BREAKPOINT, cambia de color o de tonalidad si es un monitor blanco y negro.

7) RASTREANDO UN PROGRAMA. Una vez establecidos los puntos de paro y las variables a monitorear podemos correr el programa de varias maneras. Con: F8 Lnea a lnea. F10 Lnea a lnea sin entrar a rutinas. F5 Hasta el siguiente BREAKPOINT. F7 Posicione el cursor hasta la instruccin donde desea que el programa se detenga, luego presiona F7.

Agosto Diciembre 2009

Pg. 38 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


8) TECLAS CALIENTES DEL CV. Tecla F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 ALT+C ALT+F ALT+H ALT+L ALT+O ALT+R ALT+S ALT+V ALT+W ^C ^Break ^F ^G ^U ^W Funcin Muestra la pantalla de ayuda inicial. Muestra los registros en el lado derecho de la pantalla si existen los elimina. Cambia el modo de mostrar el programa; fuente, ensamblado o mezclado. Conmuta a la Pantalla de Salida. Ejecuta un programa hasta el siguiente punto de paro, si no existe punto de paro, lo ejecuta hasta el fin. Selecciona la ventana Activa. Ejecuta el programa hasta la lnea donde se encuentra el cursor. Ejecuta una lnea. Pone o limpia un punto de paro, en la posicin donde se encuentra el cursor. Ejecuta una lnea. Toma una llamada a procedimiento como si fuese una lnea. Men Calls Men File Men Help Men Lenguages Men Options Men Run Men Search Men View Men Watch Interrumpe la ejecucin del programa y regresa al DEBUG Interrumpe la ejecucin del programa y regresa al DEBUG Encuentra una cadena sobre el archivo fuente. Aumenta el tamao de la ventana activa. Reduce la ventana activa. Pone una expresin a visualizar.

9) COMANDOS PARA OBSERVAR LA MEMORIA (Vaciado) El CV cuenta con varios comandos para mostrar el contenido de la memoria en la pantalla o en otro dispositivo. Estos comandos deben ser ejecutados desde el rea de dialogo del CV. Sintaxis: D [tipo] [direccin | rango] Donde: tipo: Es una letra que especifica el tipo del dato a ser mostrado. direccin: Es la direccin a partir de la cual se va a mostrar el contenido de la memoria. Si no se especifica direccin, el comando asume la ltima direccin mostrada en el comando DUMP anterior. Al inicio de la sesin la direccin de default es la que tiene el segmento DS. rango: Si no se da un rango, el CV muestra localidades de memoria de acuerdo al tamao de la ventana. El rango ms grande es de 32 KB. El rango de default es 128 bytes. En el caso de los reales es de un nmero real. NOTA: Si el valor no puede ser evaluado como real, el comando DUMP muestra: #NAN No es un nmero. #INF Valor tiende a infinito. #IND El valor es indefinido. El tipo real es expresado como: [-] digito.digitosE[+|-] exponente

Los comandos DUMP se muestran a continuacin. Comando D DB DA DI DU DW DD DS DL DT Nombre del Comando DUMP (El tamao es el tipo de default, el tipo definido en el comando DUMP anterior) DUMP BYTE (muestra Byte) DUMP ASCII (muestra ASCII) DUMP INTEGERS (muestra enteros) DUMP UNSIGNED INTEGER (muestra enteros sin signo) DUMP WORDS muestra palabra) DUMP DOUBLE WORDS (muestra palabras dobles) DUMP SHORT REALS (muestra reales cortos) DUMP LONG REALS (muestra reales largos) DUMP 10-BYTE REALS (muestra reales de 10 bytes) Pg. 39 Ing. Claudia E. Carrillo R

Agosto Diciembre 2009

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


2.3.3 Palabras reservadas del lenguaje ENSAMBLADOR Macro Assembler Ver 5.1

: ; = ? [] / () + * . .186 .286 .286C .286P .287 .386 .386C .387 .8086 .8087 ALIGN .ALPHA AND ARG ASSUME %BIM BYTE CATSTR @code CODESEG @codeSize COMM COMMENT %CONDS .CONST CONST @Cpu %CREF .CREF %CREFALL %CREFREF %CREFUREF %CTLS @curseg @data .DATA .DATA? DATAPRR DATASEG

@datasize ??date DB DD %DEPTH DF DISPLAY DOSSEG DP DQ DT DUP DW DWORD ELSE ELSEIF EMUL END ENDIF ENDM ENDP ENDS EQ EQU ERR .ERR .ERR1 .ERR2 .ERR8 .ERRDEF ERRDIF ERRDIFI ERRE ERRIDN ERRIDNI ERRIFN8 ERRIFNDEF ERRN8 ERRNDEF ERRNZ EVEN EVENDATA EXITM EXTERN FAR FARDATA @fardata .FARDATA @fardata? .FARDATA?

@filename ??filename FWORD GE GLOBAL GROUP GT HIGH IDEAL IF IF1 IF2 IF8 IFDEF IFDIF IFDIFI IFE IFIDN IFIDNI IFN8 IFNDEF %INCL INCLUDE INCLUDELIB INSTR IRP IRPC JUMPS LABEL .LALL LARGE LE LENGTH .LFCOND %LINUM %LIST .LIST LOCAL LOCALS LOW LT MACRO %MACS MASK MASM MASM51 MOD MODEL .MODEL MULTERRS

NAM NE NEAR %NEWPAGE %NOCONDS %NOCREF %NOCTLS NOEMUL %NOINCL NOJUMPS %NOLIST NOLOCALS %NOMACS NOMASM51 NOMULTERRS NOSMART %NOSYMS NOT NOTHING %NOTRUNC NOWARN OFFSET OR ORG %OUT P186 P286 P286N P287 P386 P38N P386P P387 P8086 P8087 PAGE %PAGESIZE PARA %PCNT PNO87 %POPLCTL PROC PTR PUBLIC PURGE %PUSHLCTL PWORD QUIRKS QWORD RADIX

.RADIX RECORD REPT .SALL SEG SEGMENT .SEQ .SFCOND SHL SHORT SHR SIZE SIZESTR SMALL SMART STACK .STACK STRUC SUBSTR SUBTTL %SUBTTL %SYMS SYMTYPE %TABSIZE TBYTE %TEXT .TFCOND THIS ??time TITLE %TITLE %TRUNC TYPE .TYPE UDATASEG UFARDATA UNION UNKNOWN USES ??version WARN WIDTH WORD @WordSize .XALL .XCREF .XLIST XOR

Agosto Diciembre 2009

Pg. 40 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Ejemplos de Programas en ENSAMBLADOR. En esta seccin vamos a aplicar lo visto anteriormente, esto es el MASM, el LINK y el DEBUG, tambin avanzaremos un poco en la comprensin de los programas en ensamblador, como siempre empezando con lo ms elemental. COMMENT * Programa ENSA04.ASM, Inicializa SI y luego lo incrementa. Usa la estructura simplificada * .MODEL Small ;Define Modelo de Memoria. .STACK 100h ;Define el segmento de STACK .CODE ;Define el segmento de cdigo. inicio: mov si,2 ;Pone 2 en SI inc si ;Incrementa SI en uno. inc si ;Incrementa SI en uno. mov ax, 4C00h ;Regreso al DOS con cdigo en AL = 00h int 21h END inicio OBSERVACIONES. Lo anterior sera equivalente a lo siguiente en un programa de alto nivel. j = 2; j = j + 2; El mismo programa es presentado usando la estructura estndar del ENSAMBLADOR. ;Programa ENSA04A.ASM, Inicializa SI y luego lo incrementa ;Usa la estructura estndar STACK SEGMENT STACK 'STACK' ;Define el segmento de STACK DB 64 DUP ('STACK ') STACK ENDS TEXT SEGMENT BYTE PUBLIC 'CODE' ;Define el seg. de cdigo. ASSUME CS:TEXT, SS:STACK inicio: mov si,2 ;Pone 2 en SI inc si ;Incrementa SI en uno. inc si ;Incrementa SI en uno. mov ax, 4C00h ;Regresa al DOS. int 21h TEXT ENDS END inicio De nuevo presentamos el programa ahora usando un procedimiento ;Programa ENSA04B.ASM, Inicializa SI en 2 y luego lo incrementa. ;Usa un procedimiento STACK SEGMENT STACK 'STACK' DB 64 DUP ('STACK ') STACK ENDS TEXT SEGMENT BYTE PUBLIC 'CODE' ASSUME cs:TEXT, SS:STACK inicio: main proc FAR push ds sub ax, ax push ax mov si,2 inc si inc si Ret main ENDP TEXT ENDS END inicio Agosto Diciembre 2009 ;Define el segmento de STACK

;Define el seg. de cdigo.

;Inicia la ejecucin del procedimiento main ;Guarda el contenido del registro DS:0000 ;Contiene, Direccin de retorno al MS DOS ;Pone 2 en SI ;Incrementa SI en uno. ;Incrementa SI en uno. ;Regresa al DOS.

Pg. 41 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


En los siguientes programas vamos a ver como el ENSAMBLADOR define y maneja variables. Recuerde que una variable es el contenido de una localidad de memoria. TITLE ENSA05.ASM COMMENT * Copia el contenido de una variable en otra * .MODEL SMALL ;Define el modelo de memoria a usar .STACK 20h ;Define el tamao del STACK .DATA a DW 1000 ;Define a como WORD y se inicializa en 1000. b DW ? ;Define como WORD a b y no se inicializa. .CODE ;Inicia el segmento de cdigo. inicio: mov ax, @data ;Pone el inicio del segmento de datos mov ds, ax ;en el registro DS mov bx, a ;Copia el contenido de a en BX mov b, bx ;Copia el contenido de BX en b mov ax, 4C00h ;Inicia la rutina de salida. int 21h END inicio OBSERVACIONES. La operacin realizada en este programa es: a = 1000; b = a; Usamos la estructura simplificada, agregamos el segmento de DATOS, en donde definimos 2 variables a y b del tipo WORD, sto es, ocupan 2 bytes, la primera es inicializada en 1000 (decimal) y la segunda NO se inicializa. Cuando usamos la estructura simplificada para asignar la direccin del segmento de DATOS al registro DS usamos la palabra reservada (@data), la cual contiene la direccin de inicio del rea de datos, se asigna de manera indirecta al registro DS. El mnemnico mov no puede mover datos entre dos direcciones de memoria, por lo tanto, el movimiento del contenido de a a b lo hacemos en 2 pasos, usando un registro como ayuda. En el siguiente programa vamos a seguir haciendo operaciones, ahora haremos: j = 2; k = j + 3; Usaremos en primer lugar la estructura estndar y un procedimiento dentro del segmento de cdigo, TEXT. ;Programa ENSA05B.ASM ;Ejecuta la operacin si j = 2, k = j + 3 STACK SEGMENT STACK 'STACK' DB 64 DUP ('STACK ') STACK ENDS DATA J DW K DW DATA TEXT inicio: main SEGMENT BYTE PUBLIC 'DATA' 2 ;Define j y lo inicializa a 2. ? ;Define k sin inicializarlo. ENDS SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:TEXT, DS:DATA, SS:STACK proc FAR push ds sub ax, ax push ax mov ax, DATA mov ds, ax mov ax, 3 add ax, j mov k, ax Ret ENDP ENDS END inicio ;Inicia el procedimiento main. ;Guarda en la Pila el valor de DS:0000 ;Para el regreso al DOS ;Coloca en DS el inicio del segmento ;de Datos. ;Carga 3 en AX ;Ejecuta AX = 3 + 2 ;El resultado lo pone en k. ;Regresamos al DOS.

main TEXT

OBSERVACIONES. En el segmento de DATOS definimos j como WORD y la inicializamos a 2, k solo se define como WORD, no es inicializada. Agosto Diciembre 2009 Pg. 42 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Asignamos al registro de segmento DS, la direccin del segmento de datos, DATA. Hacemos las siguientes operaciones: AX = 3 mov ax, 3 AX = AX + j add ax, j k = AX mov k, ax Veamos el mapa de memoria y el DEBUG del programa anterior. ARCHIVO: ENSA05B.MAP Start 00000H 00010H 00210H Stop 00003H 0020FH 00223H Length 00004H 00200H 00014H Name DATA STACK TEXT Class DATA STACK CODE

Program entry point at 0021:0000 En este programa podemos apreciar el estado del STACK antes de meter informacin y tambin podemos observar el segmento de datos. A:\USER>DEBUG ENSA05B.EXE

-R AX=0000 BX=0000 CX=0224 DX=0000 SP=0200 BP=0000 SI=0000 DI=0000 DS=105C ES=105C SS=106D CS=108D IP=0000 NV UP EI PL NZ NA PO NC 108D:0000 1E PUSH DS -DSS:1F0 1FF 106D:01F0 -T 3 53 54 41 43 4B 20 20 20-53 54 41 43 4B 20 00 00 STACK

AX=0000 BX=0000 CX=0224 DX=0000 SP=01FE BP=0000 SI=0000 DI=0000 DS=105C ES=105C SS=106D CS=108D IP=0001 NV UP EI PL NZ NA PO NC 108D:0001 2BC0 SUB AX,AX AX=0000 BX=0000 CX=0224 DX=0000 SP=01FE BP=0000 SI=0000 DI=0000 DS=105C ES=105C SS=106D CS=108D IP=0003 NV UP EI PL ZR NA PE NC 108D:0003 50 PUSH AX AX=0000 BX=0000 CX=0224 DX=0000 SP=01FC BP=0000 SI=0000 DI=0000 DS=105C ES=105C SS=106D CS=108D IP=0004 NV UP EI PL ZR NA PE NC 108D:0004 B86C10 MOV AX,106C -DSS:1F0 1FF 106D:01F0 -GCS:13 53 54 00 00 00 00 04 00-8D 10 7A 0A 00 00 5C 10 ST..

AX=0005 BX=0000 CX=0224 DX=0000 SP=01FC BP=0000 SI=0000 DI=0000 DS=106C ES=105C SS=106D CS=108D IP=0013 NV UP EI PL NZ NA PE NC 108D:0013 CB RETF -DDS:0 1F 106C:0000 106C:0010 02 00 05 00 00 00 00 00-00 00 00 00 00 00 00 00 53 54 41 43 4B 20 20 20-53 54 41 43 4B 20 20 20 ..... STACK STACK

Agosto Diciembre 2009

Pg. 43 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.

-T AX=0005 BX=0000 CX=0224 DX=0000 SP=0200 BP=0000 SI=0000 DI=0000 DS=106C ES=105C SS=106D CS=105C IP=0000 NV UP EI PL NZ NA PE NC 105C:0000 CD20 INT 20 -DSS:1F0 1FF 106D:01F0 53 54 00 00 00 00 05 00-00 00 00 00 5C 10 7A 0A -G=CS:0 CS:13 ST..

En el siguiente programa definimos un arreglo de enteros al cual le llamamos X. Usando la estructura simplificada, copiamos el arreglo X en Y a partir del ltimo elemento hasta el primer elemento. TITLE ENSA06 COMMENT * Copia X en Y de atrs hacia adelante. * DOSSEG ;Mantiene consistencia en el orden de los segmentos con los lenguajes de Alto Nivel .MODEL Small ;Se define el Modelo de memoria. .STACK 100h ;Se define el tamao de la Pila. .DATA ;Inicia segmento de Datos. x DW 100, 1000, 10000, 40000 y DW 4 dup(?) ;Reservamos 4 WORDS sin inicializar .CODE inicio: mov ax, @DATA mov ds, ax mov si, offset x mov di, offset y mov cx, 4h lazo1: push [si] inc si inc si loop lazo1 mov cx, 4h lazo2: pop [di] inc di inc di loop lazo2 mov ax, 4C00h int 21h END inicio ;Colocamos la direccin de inicio del ;segmento de DATOS en DS ;La direccin de X la ponemos en SI ;La direccin de Y la ponemos en DI ;Pone un 4 como contador en CX ;Pone en la Pila el contenido de SI ;Incrementa SI 2 veces para apuntar ;al siguiente entero. ;Esta instruccin decrementa en uno a CX y salta a lazo1, hasta que CX = 0 ;Pone un 4 como contador en CX ;Saca de Pila el ltimo dato almacenado y lo pone donde apunta DI ;Incrementa DI 2 bytes ;Decrementa CX, hasta que CX = 0 ;Llama INT 21h, servicio 4Ch para ;salir al DOS

OBSERVACIONES. La copia se realiza usando como memoria temporal la pila, A la cual primero vamos pasamos el contenido de la direccin de SI, de cada uno de los elementos de X, l cual inicialmente contiene el OFFSET de la direccin inicial de X. Para depositarlos en la pila usamos la instruccin PUSH y luego usando la instruccin POP los sacamos de la pila y los vamos acomodando en Y a partir de la direccin reservada en DI, la cual se va incrementando tambin de 2 en 2 bytes. Como cada elemento ocupa 2 bytes, es necesario incrementar tanto SI como DI dos veces para accesar el siguiente elemento. Sintaxis de LOOP etiqueta: ------------loop etiqueta LOOP transfiere IP a 'etiqueta' en tanto el registro CX sea diferente de CERO y decrementa el contenido de CX en uno. Agosto Diciembre 2009 Pg. 44 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Note que conforme se va llenando la pila, las direcciones van disminuyendo en 2 bytes cada vez que se usa un PUSH. Cuando la pila se va vaciando, (POP) las direcciones de la pila se van incrementando. Analizando el rea de memoria correspondiente a la pila encontramos:

377B:00F0 00 00 27 00 76 37 AF 31 40 9C 10 27 E8 03 64 00 377B:0100 75
Marcando lo que corresponde al rea de la Pila usada. METER A LA PILA SP 100 Tope de la Pila (push) STACK SACAR DE LA PILA SP 0F8 Dir. inicial (pop)

0100H 00 00FFH 64 00FEH 03 00FDH E8 00FCH 27 00FBH 10 00FAH 9C 00F9H 40 SP 00F8H 00F7H

Tope antes del primer PUSH

100

1000

10000

40000

Figura 2.5 Mapa de memoria del programa ENSA06.EXE TITLE ENSA07.ASM COMMENT $ Este programa muestra: * El uso de Constantes $ * El uso de las directivas de segmento simplificadas. DOSSEG .MODEL Small .STACK .CONST a DW 43690 b DW 0AaAaH c DW 1010101010101010b d DT 1234567890 e DT -1234567890 .DATA f DD 1.0 g DD 3F800000R h DQ 0.1E1 i DT 1000.0E-3 .CODE Agosto Diciembre 2009 Pg. 45 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


inicio: MOV AX, DGROUP MOV DS, ax MOV AX, a MOV BX, b MOV CX, c MOV AX, 4C00H INT 21h END inicio OBSERVACIONES. En primer lugar usamos la directiva COMMENT y el delimitador ($), l cual es colocado en el ltimo rengln y tambin lo escrito en este rengln se toma como comentario. El la directiva DOSSEG nos acomoda los segmentos en el orden preestablecido, veamos el mapa de memoria. Start 00000H 00026H 00040H 00060H Stop 00024H 0003FH 00059H 0045FH Length 00025H 0001AH 0001AH 00400H Name _TEXT _DATA CONST STACK Class CODE DATA DATA STACK

Origin Group 0002:0 DGROUP Program entry point at 0000:0010 En el mapa de memoria vemos tambin que la Pila (STACK) a la que no le definimos tamao, se le asigna un tamao de 1 KB (1024 bytes) lo podemos ver en el mapa de memoria escrito en seguida. Es asignado un segmento a CONST y otro a DATA de acuerdo al nmero de datos que contiene cada uno. El nombre de GROUP es DGROUP, este grupo en el modelo de memoria SMALL esta definido como sigue: DGROUP GROUP _DATA, CONST, _BSS, STACK ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP Por lo tanto la direccin de inicio del segmento de datos, es el inicio del Grupo DGROUP, como se aprecia en el mapa de memoria. Haciendo un DEBUG al programa observamos lo siguiente:

-GCS:20 AX=AAAA BX=AAAA DS=1226 ES=1214 1224:0020 B8004C -DDS:0 L 40 1226:0000 1226:0010 1226:0020 1226:0030 -Q B8 00 AA 90 00 00 AA 78 CX=AAAA DX=0000 SP=0400 SS=122A CS=1224 IP=0020 MOV AX,4C00 4C 00 AA 56 CD 00 AA 34 21 F0 AA 12 00 3F AA 00 00 00 90 00 00-80 00-00 78-56 00-00 3F 00 34 80 00 00 12 8B BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

00 00 00 F8

80 00 00 8B

3F 80 00 46

00 FF 00 F0

00 3F 00 80

Primero, como el segmento de DATA es colocado antes del segmento CONST, los datos de DATA se encuentran antes que los de CONST. De acuerdo al mapa de memoria los datos empiezan en la direccin 1226:0006 ya que el cdigo del programa termina en la direccin 1224:0025 que equivale a la direccin 1226:0005. El valor de f = 1.0 equivale en binario a: 00 00 80 3F El valor de g = 3F800000r en memoria es : 00 00 80 3F El valor de h = 0.1E1 equivale a: 00 00 00 00 00 00 F0 3F El valor de i = 1000.0E-3 en memoria : 00 00 00 00 00 00 00 80 FF 3F Por ltimo observamos que los valores del tipo entero definidos en el segmento CONST son equivalentes, los podemos ver tanto en memoria como en los registros AX, BX, CX. Agosto Diciembre 2009 Pg. 46 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA. 2.4. Entorno de programacin.


2.4.1. Definicin simplificada de segmentos. La versin 5.0 de MASM implementa un sistema simplificado para declarar segmentos. Por default, las directivas simplificadas de segmento usan los nombres de los segmentos y convenciones usadas por Microsoft en sus lenguajes de alto nivel. Si se escriben programas estndar en ensamblador en los cuales los nombres de los segmentos, orden y otros factores no son crticos, las directivas simplificadas nos proporcionan una manera fcil de programar. Cuando se escriben rutinas en ensamblador las cuales debern enlazarse con lenguajes de alto nivel de Microsoft, las directivas simplificadas de segmento, aseguran consistencia con las caractersticas de las rutinas en lenguaje de alto nivel.

2.4.1.1. Modelos de Memoria. Especifican el tamao usado tanto en datos como en cdigo en el programa. Los lenguajes de alto nivel requieren la definicin de un modelo de memoria especfico, si vamos a enlazarlo con una rutina en ensamblador, sta deber tener la definicin del mismo modelo de memoria. Esta deber utilizarse antes que cualquier otra directiva de segmento y si se usa la directiva DOSSEG, sta deber ir antes de la directiva del modelo de memoria. Para declara el tipo de memoria a utilizar en un programa, la sintaxis es la siguiente .MODEL nombre_memoria_modelo Donde: nombre_memoria_modelo: Corresponde al tipo de memoria y puede ser una de las que se muestran en la siguiente tabla. Modelo Tiny Small Mdium Compact Descripcin. Tanto datos como cdigo son acomodados en un mismo segmento, se usa para programas .COM Los datos se escriben en un segmento y el cdigo en otro segmento. Cada segmento puede tener hasta 64 KB. En este caso se usan punteros NEAR para cdigo y datos. Todos los datos se escriben en un segmento 64 KB mximo. El cdigo puede ocupar ms de un segmento, entonces los datos se manejan como NEAR paro el cdigo como FAR. Todo el cdigo se acomoda en un solo segmento, pero los datos pueden ocupar ms de un segmento, sin embargo los arreglos no pueden ocupar ms de 64K. De esta manera cdigo es NEAR pero los datos son FAR. Tanto el cdigo como los datos pueden ocupar ms de un segmento, sin embargo los arreglos se siguen limitando a 64 KB. De esta manera, tanto los datos como el cdigo son FAR. Tanto el cdigo como los datos pueden ocupar ms de un segmento, en este caso tambin los arreglos pueden ser mas grandes que 64 KB. Todos los punteros utilizados en este modelo son FAR.

Large Huge

2.4.1.2. Definiendo segmentos simplificados. Sintaxis: .STACK [tamao] .CODE .DATA .DATA? .FARDATA .FARDATA? .CONST Segmento de pila. Segmento de cdigo. Segmento para datos inicializados NEAR. Segmento para datos no inicializados NEAR. Segmento para datos inicializados FAR. Segmento para datos no inicializados FAR. Segmento para datos constantes.

En el caso de la directiva .STACK si no se especifica tamao, este se define como predefinida de 1 KB. Un dato no inicializado es aquel que se declara usando (?) y el operador DUP. En un programa estndar en ensamblador se puede usar tanto la directiva .DATA como .DATA? o .FARDATA como .FARDATA? sin embargo, cuando escribimos una rutina para ser enlazada con un programa escrito en un lenguaje de alto nivel, debemos respetar las convenciones. Un dato constante es aquel que nunca se va a cambiar en tiempo de ejecucin, el uso de la directiva de segmento .CONST es opcional en un programa estndar en ensamblador, pero deber utilizarse cuando la rutina se va a enlazar con un programa escrito en un lenguaje de alto nivel. Los datos definidos con los segmentos .STACK, .CONST, .DATA, .DATA?, son colocados en el grupo llamado DGROUP. Los datos definidos con los segmentos .FARDATA y .FARDATA?, no son colocados en ningn grupo. Agosto Diciembre 2009 Pg. 47 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


2.4.1.3 Orden de los segmentos. La directiva DOSSEG especifica que los segmentos debern ser ordenados de acuerdo a la convencin para segmentos del DOS, esta convencin se utiliza por Microsoft para los lenguajes de alto nivel. Cuando se usa esta directiva los segmentos son ordenados como sigue: 1) Segmentos teniendo el nombre de clase 'CODE'. 2) Cualquier segmento que no tenga el nombre de clase 'CODE' y no se encuentre en el DGROUP. 3) Segmentos que son parte de DGROUP en el siguiente orden: a) Segmentos con nombre de clase BEGDATA. (Este nombre se reserva para uso de Microsoft). b) Cualquier segmento cuyo nombre de clase no sea: BEGDATA, CONST, DATA, BSS o STACK. c) Segmento de clase CONST. d) Segmentos de clase DATA. e) Segmentos de clase BSS. f) Segmento de clase STACK.

STACK

BSS DATA DGROUP CONST

BEGDATA

Otros segmentos CODE

Figura 2.6. Orden de los segmentos

2.4.1.4 Uso de valores predefinidos. Valores de segmento. Para cada una de las directivas de segmento existe su correspondiente valor, el cual se expresa por su mismo nombre, excepto que este valor inicia con el signo (@) y la directiva empieza con un punto (.). As por ejemplo: @code @data @fardata @fardata? Representa el nombre del segmento definido por .CODE Representa el nombre del grupo que comparte todos los segmentos de datos NEAR, puede usarse para accesar los segmentos creados por .DATA, DATA?, CONST y .STACK Representa al segmento .FARDATA Representa al segmento .FARDATA?

Estos valores pueden utilizarse en la sentencia ASSUME y en cualquier lugar donde debemos referir a un segmento por su nombre. Nota: Hay otros valores ya predefinidos, los cuales forman parte del sistema simplificado de segmentos. Relacin predefinida en directivas simplificadas de segmento. Cuando se usa la directiva .MODEL la directiva PROC se asocia con el modelo especfico definido. NEAR Para modelo Small y Compact. FAR Para modelo Medium, large y huge. En el caso de datos, la direccin base es DGROUP, ya vimos que segmentos forman este Grupo. Agosto Diciembre 2009 Pg. 48 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Nombres de segmentos predefinidos.

En esta seccin analizaremos solo los correspondientes al modelo Small. Segmentos y tipos para el Modelo de Memoria SMALL

Modelo Small

Directiva .CODE .DATA .CONST .DATA? .STACK

Nombre _TEXT _DATA CONST _BSS STACK

Alineacin WORD WORD WORD WORD PARA

Combinacin PUBLIC PUBLIC PUBLIC PUBLIC STACK

Clase 'CODE' 'DATA' 'CONST' 'BSS' 'STACK'

Grupo

DGROUP DGROUP DGROUP DGROUP

2.4.2. Definicin estndar de segmentos. Si deseamos un control completo sobre los segmentos es necesario realizar una definicin completa de ellos. 2.4.2.1. Definiendo Segmentos estndar. Sintaxis: nombre SEGMENT [alineacin] [combinacin] [use] ['class'] sentencias nombre ENDS nombre Define el nombre del segmento, puede ser nico o puede ser el mismo dado a otros segmentos en el programa. Los segmentos con el mismo nombre son tratados como el mismo segmento. Alineacin, combinacin, use, y class instruyen al ensamblador y al enlazador la manera como acomodar los segmentos en el programa y en memoria. Estos tipos pueden especificarse en cualquier orden. No tienen efecto en un programa .COM ya que ste tiene un solo segmento. El tipo USE es para el 80386, como USE16 USE32, define el tamao del segmento, el valor predefinido es el USE16. Cuando se usa la directiva .386, el valor predefinido es USE32.

tipos

2.4.2.1.1 Controlando la alineacin. El enlazador usa la informacin de alineacin para determinar la direccin relativa de inicio de cada segmento. El DOS usa la informacin para calcular la direccin real de cada segmento cuando el programa es cargado en memoria.

Alineacin BYTE WORD DWORD PARA PAGE

Significado Usa el siguiente byte disponible. Usa la siguiente direccin disponible divisible entre 2, esto es, la siguiente palabra. Usa la siguiente direccin disponible divisible entre 4, esto es, inicia cada 4 bytes. Usa la siguiente direccin disponible divisible entre 16, esto es, el siguiente prrafo. Usa la siguiente direccin disponible divisible entre 256, esto es, la siguiente pgina.

Agosto Diciembre 2009

Pg. 49 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


2.4.2.1.2. Combinacin PUBLIC Definiendo la combinacin de los segmentos, usando el tipo combine. Significado Concatena todos los segmentos con el mismo nombre para formar un solo segmento. Todas las direcciones de las instrucciones y datos en el nuevo segmento quedan relativas a un solo registro de segmento y todos los offsets son ajustados al inicio del nuevo segmento. Concatena todos los segmentos con el mismo nombre para formar uno solo. Se comporta igual que el anterior, solo que en este caso el registro de segmento es el SS y el offset queda en el SP, el cual se inicializa en el tope del segmento. Crea segmentos sobrepuestos usando la misma direccin de inicio para todos los segmentos con el mismo nombre. La longitud del rea resultante es la correspondiente al segmento de mayor longitud. Es similar a la combinacin PUBLIC. Define en dir la direccin de inicio del segmento. Este tipo de definicin no se usa normalmente para cdigo o para datos inicializados, dir es la direccin de cdigo o datos los cuales ya existen en memoria, como un buffer de pantalla u otra localidad definida por hardware.

STACK

COMMON

MEMORY AT dir

2.4.2.2. Definiendo Grupos de segmentos. Un GRUPO es una coleccin de segmentos asociados con la misma direccin de inicio. Es conveniente usar un GRUPO si se tienen diferentes tipos de datos organizados en segmentos separados en el archivo fuente, sin embargo se desea una manera simple de accesar los datos, usando UN SOLO registro de segmento. Sintaxis: nombre GROUP segmento [,segmento] Donde: nombre: Es el smbolo asignado a la direccin de inicio del grupo. Todas las etiquetas y variables dentro del grupo son relativas al nombre del grupo. Ejemplo: MISEG GROUP DATA, CONST Normalmente a continuacin de la definicin de GROUP se usa la directiva ASSUME.

2.4.2.3. Asociando segmentos con registros. Muchas instrucciones se relacionan como predefinido ciertos segmentos, por ejemplo: JMP PUSH MOV Asume el segmento asociado con CS Asume el segmento asociado con SS Asume el segmento asociado con DS

Cuando el ensamblador necesita referenciar una direccin, deber saber a que segmento corresponde, Este trabajo lo realiza usando los registros asociados con las direcciones de inicio de los segmentos definidos en la directiva ASSUME. La directiva ASSUME solo afecta en tiempo de ensamble. Sintaxis: ASSUME reg_seg:nombre_seg [, reg_seg:nombre_seg] ASSUME reg_seg:NOTHING ASSUME NOTHING Donde: nombre_seg: Es el nombre del segmento o GRUPO que ser asociado con el registro de segmento. Instrucciones subsecuentes que suponen un registro de default para referenciar etiquetas o variables en realidad estn referenciando el inicio del segmento.

Agosto Diciembre 2009

Pg. 50 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


El nombre_seg, puede se: * El nombre de un segmento definido en el cdigo fuente mediante la directiva SEGMENT. * El nombre de un GRUPO definido en el archivo fuente usando la directiva GROUP. * La palabra NOTHING. * Una expresin SEG. reg_seg: Puede ser; CS, DS, ES, SS (FS, GS para el 80386). La palabra NOTHING cancela la seleccin actual de los segmentos asociados con una directiva anterior ASSUME. La directiva ASSUME normalmente se usa al inicio del archivo fuente para asociar los 4 registros de segmento, sin embargo es posible usarla en cualquier parte del archivo fuente para cambiar la asociacin. El uso de la directiva ASSUME es equivalente a sobre-escribir un segmento usando el operador (:). El uso del operador (:) es conveniente cuando la sobre-escritura de un segmento se realiza solo una vez. La directiva ASSUME es ms conveniente cuando la sobre-escritura de un segmento se realiza ms de una vez.

2.4.2.4. Mtodo de ordenamiento de segmentos. El orden en que MASM escribe los segmentos al archivo objeto es secuencial o alfabtico. 1) Secuencial. Escribe los segmentos al archivo objeto en el orden en que fueron escritos en el archivo fuente. (Es el de default). 2) Alfabtico. Los segmentos son escritos al archivo objeto en orden alfabtico de acuerdo al nombre dado a cada uno de ellos.

Orden Secuencial Alfabtico

Lnea comandos /S /A

Dentro archivo fuente. .SEQ .ALPHA

Si usamos la directiva DOSSEG sobre-escribe a cualquier orden definido con anterioridad.

A continuacin se presentan 2 ejemplos, en los cuales se hace primero una comparacin entre el operador de sobre-escritura de segmento y el uso de la directiva ASSUME, y segundo se muestra el uso de la directiva ASSUME. Para el ejemplo se utiliza el microprocesador 80386, y los registros adicionales FS y GS. ;Programa ENSA08.ASM, Uso de Operador de sobre-escritura de segmento. .386 PILA SEGMENT PARA STACK 'MIPILA' DB 100H DUP (?) PILA ENDS DATO1 SEGMENT DWORD PUBLIC USE16 'DATA_A' a DB "Esta es una cadena" p DW a paf DD a DATO1 ENDS DATO2 SEGMENT DWORD PUBLIC USE16 'DATA_B' xa DD 10 DUP(0) DATO2 ENDS DATO3 SEGMENT DWORD PUBLIC USE16 'DATA_C' r DD 10.25 DATO3 ENDS

Agosto Diciembre 2009

Pg. 51 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


SEGCOD SEGMENT DWORD PUBLIC USE16 'MICODE' assume es:segcod, ss:pila inicio: mov ax, SEG dato1 mov ds, ax mov ax, SEG dato2 mov es, ax mov ax, SEG dato3 mov fs, ax mov bh, ds:a mov edx, ds:paf mov es:xa, edx mov eax, fs:r mov es:xa[4], eax mov ax, 4c00h int 21h SEGCOD ENDS END inicio

OBSERVACIONES. Se estn manejando 3 segmentos de datos, las instrucciones de manejo de datos solo hacen referencia a un segmento, utilizando la sobre-escritura de segmento, se puede forzar a las instrucciones a hacer referencia a un segmento en particular. Este procedimiento se usa cuando se hace referencia de manera espordica a otro segmento, que no sea el de default. El archivo ENSA08.MAP nos resulta: Start 00000H 00100H 00118H 00140H 00144H Stop 000FFH 00117H 0013FH 00143H 00170H Length 00100H 00018H 00028H 00004H 0002DH Name PILA DATO1 DATO2 DATO3 SEGCOD Class MIPILA DATA_A DATA_B DATA_C MICODE

Address Publics by Name Address Publics by Value Program entry point at 0014:0004

00170h SEGCOD CS, FS 3F55h ES 3F52h DATOS1 DS 3F51h PILA 00000h SS 3F41h PSP DS, ES 3F31h Figura 2.7 Mapa de Memoria de ENSA08.ASM. 00144h IP 0004h 00143h 00140h 0013Fh 00118h 00117h 00100h SP 0100h 000FFh

DATOS3 DATOS2

Agosto Diciembre 2009

Pg. 52 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


El siguiente programa muestra el uso de ASUMME en vez del operador (:). ; Programa ENSA09.ASM, uso de ASSUME .386 PILA SEGMENT PARA STACK 'MIPILA' DB 100H DUP(?) PILA ENDS DATO1 SEGMENT DWORD PUBLIC USE16 'DATA_A' a DB "Esta es una cadena" p DW a paf DD a DATO1 ENDS DATO2 SEGMENT DWORD PUBLIC USE16 'DATA_B' xa DD 10 DUP(0) DATO2 ENDS DATO3 SEGMENT DWORD PUBLIC USE16 'DATA_C' r DD 10.25 DATO3 ENDS SEGCOD SEGMENT DWORD PUBLIC USE16 'MICODE' ASSUME CS:SEGCOD, SS:PILA inicio: mov ax, SEG dato1 mov ds, ax mov ax, SEG dato2 mov es, ax mov ax, SEG dato3 mov fs, ax ASSUME DS:DATO1 mov bh, a mov edx, paf ASSUME ES:DATO2 mov xa, edx ASSUME FS:DATO3 mov eax, r ASSUME ES:DATO2 mov xa[4], eax mov ax, 4c00h int 21h SEGCOD ENDS END inicio OBSERVACIONES. El programa es idntico al ENSA08.ASM solo que ahora se muestra el uso del ASSUME, y como su nombre lo indica, las instrucciones que hacen referencia, como en este caso a un registro de segmento de datos, asumen un segmento de datos como al segmento al cual se hace referencia. Para completar el trabajo, dicho registro de segmento debe contener la direccin correcta del segmento, accin que se lleva a cabo mediante el par de instrucciones: mov ax, SEG dato1 mov ds, ax mov ax, SEG dato2 mov es, ax mov ax, SEG dato3 mov fs, ax Agosto Diciembre 2009 Pg. 53 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


2.4.2.5. Inicializando Registros de segmento. Los programas en lenguaje ENSAMBLADOR debern poner valores iniciales en cada uno de los registros de segmento, antes de que cualquier instruccin que haga referencia a un segmento de registro, pueda ser utilizada. Esta inicializacin se realiza mediante la sentencia ASSUME. Cada uno de los registros de segmento se inicializan de una manera diferente; por ejemplo CS e IP se inicializan al especificar una direccin de inicio en la directiva END. Sintaxis: END [dir_inicio] Donde: dir_inicio: Es una etiqueta que identifica la direccin donde se quiere iniciar la ejecucin del programa cuando es cargado a memoria. Entonces: El registro IP es inicializado al valor de dir_inicio. Si un programa consiste de un solo mdulo se debe incluir dir_inicio. Si un programa consta de varios mdulos, cada mdulo debe terminar con la directiva END y solamente en uno se deber definir dir_inicio. El registro de segmento DS deber inicializarse en la direccin del segmento que contiene los datos. La direccin del segmento o GRUPO para cargarse en el registro DS requiere de 2 sentencias: mov ax, DATA mov DS, ax El registro de segmento SS se inicializa automticamente al valor del ltimo segmento en el archivo fuente con el tipo de combinacin STACK. El registro SP tambin se inicializa automticamente al tamao de la pila (STACK). Los registros ES y DS, al cargar el programa se inicializan con la direccin de inicio del PSP. Ejemplo: ASSUME es:@fardata mov ax, @fardata mov es, ax ;Llama al ensamblador. ;Llama al procesador.

Ejemplo: En este programa usamos 2 registros de datos, uno es definido dentro de un GRUPO, al otro lo dejamos fuera. ; Programa ENSA10.ASM GRUPO GROUP DATA1, STACK ASSUME CS:CODE, DS:GRUPO, ES:DATA2, SS:STACK STACK SEGMENT PARA STACK 'STACK' DB 64 DUP (?) STACK ENDS DATA1 SEGMENT WORD 'DATA1' A DB 'A' DATA1 ENDS DATA2 SEGMENT WORD 'DATA2' B DB 'B' DATA2 ENDS CODE SEGMENT WORD PUBLIC 'CODE' inicio: mov ax, GRUPO mov ds, ax mov ax, DATA2 mov es, ax mov ah, A mov al, B mov ax, 4C00h int 21h CODE ENDS END inicio Agosto Diciembre 2009

;Inicializamos DS ;Inicializamos ES ;Asignamos el contenido de A a AH ;Asignamos el contenido de B a AL

Pg. 54 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


OBSERVACIONES. Si observamos el mapa de memoria vemos que se generaron 2 segmentos de datos y tambin nos muestra el nombre del grupo y su direccin de inicio. Start 00000H 00040H 00042H 00044H Stop 0003FH 00040H 00042H 0005AH Length 00040H 00001H 00001H 00017H Name STACK DATA1 DATA2 CODE Class STACK DATA1 DATA2 CODE

Origin Group 0000:0 GRUPO Program entry point at 0004:0004 Utilizando el DEBUG para observar el desarrollo del programa ENSA09.EXE veremos que cada segmento de datos tiene una direccin de inicio, y al momento de escribir en AH y AL se hace referencia a cada uno de los segmentos. NOTE que hay una sobre-escritura por el segmento ES.

-GCS:E AX=1228 BX=0000 CX=005B DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 DS=1224 ES=1228 SS=1224 CS=1228 IP=000E NV UP EI PL NZ NA PO NC 1228:000E 8A264000 MOV AH,[0040] DS:0040=41 -T AX=4128 BX=0000 CX=005B DS=1224 ES=1228 SS=1224 1228:0012 26 1228:0013 A00200 -T DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 CS=1228 IP=0012 NV UP EI PL NZ NA PO NC ES: MOV AL,[0002] ES:0002=42

AX=4142 BX=0000 CX=005B DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 DS=1224 ES=1228 SS=1224 CS=1228 IP=0016 NV UP EI PL NZ NA PO NC 1228:0016 B8004C MOV AX,4C00 -T AX=4C00 BX=0000 CX=005B DX=0000 SP=0040 BP=0000 SI=0000 DI=0000 DS=1224 ES=1228 SS=1224 CS=1228 IP=0019 NV UP EI PL NZ NA PO NC 1228:0019 CD21 INT 21 -Q
El contenido de los registros de segmento SS y DS, es el mismo, lo mismo sucede con los registros CS y ES. En el programa los segmentos de datos DATA1 y DATA2 son de 1 byte, como el tamao mnimo de segmento es de 16 bytes, el LINK tiene que sobreponer los segmentos para cumplir con la definicin del programa. El registro DS contiene la direccin de inicio del GRUPO, por lo tanto las referencias se hacen con respecto a dicho GRUPO Para DATA1, para DATA2 se hacen con referencia a ES ya que este segmento no forma parte del GRUPO.

Veamos el mapa de memoria del programa: Agosto Diciembre 2009 Pg. 55 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Direcciones de inicio de segmento.

CODE IP 0004h 00044h

DATA2

Segmento de 1 byte 00042h

DATA1 CS, ES 1228h STACK SS, DS 1224h PSP 1214h

Segmento de 1 byte 00040h SP 0040h Segmento de 40 bytes 00000h Inicio de GRUPO

Figura 2.8 Mapa de Memoria del programa ENSA10.ASM Por ltimo veamos el programa ENSA11.ASM, el cual es el mismo que el ENSA07.ASM pero ahora escrito usando la definicin estndar de segmentos. ;ENSA11.ASM. Este programa muestra: ; * El uso de RADIX ; * El uso de Constantes ; * El uso de las directivas de segmento simplificadas. DOSSEG DGROUP GROUP _DATA, CONST, STACK ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP STACK SEGMENT PARA STACK 'STACK' DB 400h DUP (?) STACK ENDS CONST SEGMENT WORD PUBLIC 'CONST' a DW 43690 b DW 0AaAaH c DW 1010101010101010b d DT 1234567890 e DT -1234567890 CONST ENDS _DATA SEGMENT WORD PUBLIC 'DATA' f DD 1.0 g DD 3F800000R h DQ 0.1E1 i DT 1000.0E-3 _DATA ENDS _TEXT SEGMENT WORD PUBLIC 'CODE' inicio: mov ax, DGROUP mov ds, ax mov ax, a mov bx, b mov cx, c mov ax, 4C00H int 21h _TEXT ENDS END inicio OBSERVACIONES. Agosto Diciembre 2009 Pg. 56 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


En este programa usamos la directiva DOSSEG, si observamos el mapa de memoria vemos que los segmentos fueron ordenados acorde a esta directiva. Sin embargo dentro del GRUPO no se respet el orden de los segmentos CONST y _DATA. Sin embargo el segmento _TEXT si va al inicio y el segmento STACK al final. Observe tambin el uso de la directiva GROUP para definir un GRUPO, en este caso le llamamos tambin DGROUP. Start 00000H 00026H 00040H 00060H Stop 00024H 0003FH 00059H 0045FH Length 00025H 0001AH 0001AH 00400H Name _TEXT CONST _DATA STACK Class CODE CONST DATA STACK

Origin Group 0002:0 DGROUP Program entry point at 0000:0010 En el mapa de memoria se observa la direccin de inicio de DGROUP. Haciendo el DEBUG al programa encontramos:

-r AX=0000 BX=0000 CX=005A DX=0000 SP=0400 BP=0000 SI=0000 DI=0000 DS=105C ES=105C SS=1072 CS=106C IP=0010 NV UP EI PL NZ NA PO NC 106C:0010 B86E10 MOV AX,106E -dds:0 L 40 106E:0000 106E:0010 106E:0020 106E:0030 -q

B8 12 00 00

00 00 00 00

4C 00 80 00

CD 00 3F 00

21 00 00 00

00 00 00 00

AA 90 80 00

AA-AA 78-56 3F-00 80-FF

AA 34 00 3F

AA 12 00 00

AA 00 00 00

90 00 00 00

78 00 00 00

56 00 F0 00

34 80 3F 00

SP 0400h STACK SS =1072h _DATA 00060h Segmento de 26 bytes 00040h CONST DS =106Eh IP = 0010h CS =106Ch Segmento de 26 bytes 00026h Inicio del GRUPO 00020h Segmento de 25 bytes 00000h PSP ES =105Ch

TEXT

Figura 2.9. Mapa de Memoria del programa ENSA11.ASM. Podemos observar que el inicio del cdigo esta en 106C:0010, esta direccin se defini en el mapa de memoria del programa, como se puede apreciar en el archivo ENSA11B.MAP. Note tambin que el grupo inicia dentro del segmento _TEXT y no como pudiramos pensar al inicio del segmento CONST.

Agosto Diciembre 2009

Pg. 57 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


2.4.3 Variables y Etiquetas. Especificacin de tipos.

Al especificar un tipo nos referimos a 2 aspectos: 1) Establecimiento del tamao de una variable u otro operando a memoria. Para establecer el tamao de la variable usamos los siguientes especificadores. Especificador BYTE WORD DWORD FWORD QWORD TBYTE # de bytes 1 2 4 6 8 10

2) Cuando se especifica la distancia de una etiqueta. Especificador FAR NEAR PROC # de bytes La etiqueta hace referencia a tanto al segmento como al OFFSET. La etiqueta solo requiere del OFFSET. Cuando se maneja usando la definicin simplificada, la etiqueta tiene el tipo predefinido (NEAR o FAR) dependiendo del modelo de memoria utilizado. * Cuando se usa la definicin estndar el tipo predefinido es NEAR. * Para modelo SMALL y COMPACT es NEAR. * Para modelo MEDIUM, LARGE y HUGE es FAR.

Una etiqueta se usa para acceder a una instruccin, la cual se encuentra a continuacin de ella. Sintaxis: nombre: Donde: nombre no deber haber sido usado dentro del mdulo, le deber seguir (:). Las etiquetas solo se pueden usar en segmentos asociados con el registro CS. Variables. Una variable consiste de un nombre y un especificador de tamao.

Sintaxis: [nombre] directiva inicializacin [,inicializacin].... Donde: nombre: Es el smbolo asociado con la variable. Si no se le asigna un nombre, el valor es almacenado en memoria, pero la direccin de la variable no tiene un nombre simblico. directiva: Determina el tamao de la variable, como sigue:

Directiva DB DW DD DF DQ DT

Significado Define Byte. Define Word Define Doble Word Define Farword Usado normalmente con el 80386 Define Quadword Define variable de 10 bytes

tamao en bytes 1 2 4 6 8 10

Todas estas directivas pueden ser utilizadas para nmeros enteros. Agosto Diciembre 2009 Pg. 58 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


La directiva DT nos permite definir nmeros empaquetados BCD. Para cadenas solo utilizamos la directiva DB. Para nmeros reales podemos usar las siguientes directivas. Directiva DD DQ DT Tamao

Almacena un nmero real corto de 32 bits. Sirve tanto para nmeros IEEE como para el formato de Microsoft. Almacena nmeros reales largos de 64 bits. Sirve tanto para nmeros IEEE como para el formato de Microsoft. (Temporal) Nos permite almacenar nmeros de 10 bytes, se defini este tipo de reales para que fueran manejados por los coprocesadores matemticos.

El estndar ms recomendable es el de IEEE ;Programa ENSA12.ASM. Tipos de Datos. .MODEL small .STACK 100h .DATA a DB 10h, 20h, 30h, 40h b DW 1122h c DD 11223344h d DF 112233445566h e DQ 1122334455667788h f DT 112233445566778899AAh g DT -9252851 .CODE inicio: mov ax, DGROUP mov ds, ax mov ah, a + 2 ;Almacena en AH el 30h mov bx, b ;Almacena en BX el valor de b mov ax, 4C00h int 21h END inicio OBSERVACIONES. En el segmento de datos estamos inicializando con valores enteros hexadecimales las variables de la a a la f, sin embargo, solo movemos a los registros el tipo BYTE y el tipo WORD, los dems tipos veremos luego como manejarlos. Si observamos los 30h primeros bits del segmento de datos, podemos ver que a inicia en el offset 0002, el tipo DT primero se maneja en hexadecimal, siendo respetada su estructura, posteriormente se almacena un nmero en decimal, ste se almacena en BCD empaquetado, y note el efecto ya comentado del signo, este nmero lo remarcamos para mayor claridad.

-d ds:0 L 30 317C:0000 317C:0010 317C:0020

CD 21 10 20 30 40 22 11-44 33 22 11 66 55 44 33 22 11 88 77 66 55 44 33-22 11 AA 99 88 77 66 55 44 33 22 11 51 28 25 09-00 00 00 00 00 80 00 00

Agosto Diciembre 2009

Pg. 59 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Variables puntero.

Estas variables contienen la direccin de un dato o cdigo, en vez del contenido de memoria en si mismo. Los apuntadores pueden ser NEAR o FAR. Los apuntadores NEAR solo contienen el offset de la direccin, stos pueden inicializarse con la directiva DW. Los apuntadores FAR contienen tanto la direccin del segmento como la del offset, stos se pueden inicializar mediante la directiva DD. El segmento y offset se almacenan en memoria de acuerdo al siguiente formato. Nmero de byte Ejemplo. cadena DB apuntaca DW fpuntacad DD "Hola muchachas",0 cadena cadena ;Cadena terminada en nulo ;Apuntador NEAR a cadena ;Apuntador FAR a cadena 0 Offset 1 2 3 Segmento

Etiquetando variables.

La directiva label puede usarse para definir una variable de un cierto tamao, en una localidad de memoria especfica. Es til cuando se desea hacer referencia a una misma variable, en diferentes tamaos. Sintaxis: nombre LABEL tipo Donde: nombre: Es el smbolo asignado a la variable. tipo: Especifica el tamao de la variable. Puede ser cualquiera de los tipos definidos; BYTE, WORD, DWORD, QWORD, TBYTE, tambin podemos usar el nombre de una estructura previamente definida. Ejemplo: ;Programa ENSA13.ASM, Uso de la directiva LABEL .386 STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK ENDS DATA SEGMENT PARA PUBLIC 'DATA' a label WORD b label DWORD ar DB 10h, 20h, 30h, 40h DATA ENDS CODE SEGMENT PARA PUBLIC USE16 'CODE' ASSUME CS:CODE, DS:DATA, SS:STACK inicio: mov ax, SEG DATA mov ds, ax mov bx, a mov cx, a + 2 mov eax, b mov ax, 4C00h int 21h CODE ENDS END inicio

;Usamos la directiva para habilitar los registros de 32 bits.

;a va a manejar de 2 en 2 bytes ;b va a manejar los 4 bytes ;Valores almacenados

;Cargamos en BX el valor de a ;Cargamos en CX el valor de a + 2 ;Cargamos en el registro EAX el valor de b

OBSERVACIONES. En el programa definimos dos variables etiquetadas a y b, la primera de tipo WORD y la segunda de tipo DWORD, estas variables deben ser declaradas antes de la variable que maneja los datos, en este caso el arreglo ar, que contiene 4 datos. Luego de cargar el registro DS con la direccin del segmento de datos, la instruccin que sigue: mov bx, a. Nos va a transferir al registro BX, el contenido de a, que en este caso es 2010h. La siguiente instruccin: Agosto Diciembre 2009 mov cx, a + 2, transferir al registro CX el valor 4030h. Pg. 60 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Por ltimo la instruccin: mov eax, b, transferir al registro de 32 bits EAX el contenido de b, que en este caso sern los 32 bits de 40302010h. Usamos el micro 80386 para demostrar la operacin de un tipo DWORD manejado en una variable etiquetada. En el microprocesador 80386 podemos usar el modo de 32 bits, (USE32) mediante el cual tenemos acceso a los 4 GB. por segmento, o bien el modo de 16 bits con el cual el segmento va a ser hasta de 64 KB, como en el 8086/8088/80286, (USE16). Mediante la directiva (.386) habilitamos los registros de 32 bits del 80386, sin embargo los podemos usar como registros de 8, 16 y 32 bits. 2.4.4. Operandos Los operandos son argumentos que definen un valor el cual es manejado por la instruccin o la directiva. Un operando puede ser una constante, variable, expresin o palabra reservada, dependiendo de la instruccin o directiva y el contexto de la sentencia. Una expresin, por ejemplo, es un operando la cual consiste de varios operandos que son combinados para describir un VALOR o una localidad de memoria. Los operadores nos indican las operaciones a realizar con los operandos en una expresin. Las expresiones son evaluadas en tiempo de ensamblado. Usando expresiones se nos facilita el trabajo de evaluacin cuando se esta escribiendo el archivo fuente.

2.4.5. Operadores. El ensamblador nos proporciona una gran variedad de operadores para combinar, comparar, cambiar y analizar operandos. Algunos operadores trabajan constantes enteras, otros con valores en memoria y algunos con ambos. Es importante entender la diferencia entre operadores e instrucciones: Los Operadores manejan clculos de valores constantes los cuales se conocen en tiempo de ensamble. Las Instrucciones manejan clculos de valores los cuales pueden no conocerse sino hasta en tiempo de ejecucin. Los tipos de operadores son los siguientes: 1) Aritmticos. 2) Relacionales. 3) Lgicos a nivel de bit. 4) Corrimiento. 5) Especiales. 6) Operadores de tipo. 1) Operadores Aritmticos. Operador + * / MOD + Sintaxis + expresin - expresin exp1 * exp2 exp1 / exp2 exp1 MOD exp2 exp1 + exp2 exp1 - exp2 Significado ms monario menos monario multiplicacin divisin mdulo suma resta

A excepcin de (suma) y (resta) los dems operadores solo pueden usarse con constantes enteras. La (suma) y la (resta) pueden usarse con una constante entera y un operando a memoria, el resultado es un operando a memoria. 2) Relacionales. Comparan 2 expresiones y regresan: TRUE FALSE (0) (-1) (FFFFh) (0000h)

Las expresiones deben ser valores constantes.

Agosto Diciembre 2009

Pg. 61 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Operador EQ NE LT LE GT GE Sintaxis exp1 EQ exp2 exp1 NE exp2 exp1 LT exp2 exp1 LE exp2 exp1 GT exp2 exp1 GE exp2 Valor regresado True si exp1 = exp2 True si exp1 <> exp2 True si exp1 < exp2 True si exp1 <= exp2 True si exp1 > exp2 True si exp1 >= exp2

NOTA: EQ y NE tratan sus argumentos como de 16 bits. Ejemplo: -1 EQ 0FFFFh (True) -1 NE 0FFFFh (False) LT, LE, GT y GE tratan sus argumentos como de 17 bits. Donde el bit 17 especifica el signo. Ejemplo: 1 GT -1 1 GT 0FFFFh) (True) (False)

3) Lgicos a nivel de bit Estos operadores realizan operaciones lgicas sobre expresiones con valores constantes. Operador NOT AND OR XOR Sintaxis NOT expresin exp1 AND exp2 exp1 OR exp2 exp1 XOR exp2 Significado Complemento a uno Y O OR exclusivo

NOTA: No hay que confundir estos operadores con las instrucciones lgicas con el mismo nombre. Los operadores trabajan con constantes enteras en tiempo de ensamblado. Las instrucciones trabajan sobre registros o localidades de memoria en tiempo de ejecucin. 4) Corrimiento. Operador SHR SHL Sintaxis exp SHR nbits exp SHL nbits Significado Corrimiento a la derecha nbits Corrimiento a la izq. nbits.

Veamos el siguiente programa. ;Programa ENSA14.ASM, Uso de Operadores INT21 EQU 21h ;Se define una constante para 21h

STACK SEGMENT PARA STACK 'STACK' DB 100 DUP (?) STACK ENDS DATA SEGMENT PARA PUBLIC 'DATA' x DB 0AAh, 0BBh, 0CCh, 0DDh, 0EEh, 0FFh a EQU x + 4 ;a es el contenido de direccin x + 4 (0004) b EQU a 2 ;b es el contenido de direccin x + 4 - 2 (0002) c EQU 50 MOD 9 ;c = 5 d EQU NOT 0F0h ;d = 0Fh DATA ENDS Agosto Diciembre 2009 Pg. 62 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


CODE SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CODE, DS:DATA, SS:STACK inicio: mov ax, SEG DATA mov ds, ax mov ch, c SHL 1 mov cl, 4 SHL x[2], cl mov cl, b mov ax, d AND 0Afh mov ch, a add ch, c mov bx, 4 EQ 3 mov si, 4 NE 3 mov ax, 4C00h int INT21 CODE ENDS END inicio OBSERVACIONES. Vamos a aprovechar esta seccin para explicar el uso de la igualdad EQU. EQU es una igualdad no redefinible usada para asignar una constante numrica a un smbolo. El valor del smbolo no puede ser redefinido. EQU se usa normalmente para asignar a una constante un nombre, lo que hace ms legible el cdigo, tambin nos facilita el cambio de un valor constante l cual es usado en varias partes del archivo fuente. Sintaxis: nombre EQU expresin. Note que el smbolo a y b son smbolos que nos representan una direccin. (0004h) y (0002h) respectivamente. Los smbolos de a a la d son definidos en tiempo de ensamble. No hay que confundir el operador SHL con la instruccin SHL, el primero es resuelto en tiempo de ensamble y el segundo en tiempo de ejecucin, ambos hacen un corrimiento, el primero de expresiones constantes y el segundo de una variable, el resultado es colocado en la misma variable. La sintaxis de la instruccin SHL es: SHL mem, CL 5) Operadores Especiales. Operador . [] : Sintaxis variable.campo [[exp1]][exp2] segment:expresin Significado Operador de campo de estructura. Operador de indice. Sobre-escritura de segmento. ;ch almacena 0Ah ;x[2] almacena C0h ;cl almacena [0002] = C0h ;ax almacena 000Fh ;ch almacena [0004] = EEh ;ch almacena F3h ;bx almacena FALSE (0) ;si almacena TRUE (-1)

Tambin existe el operador ($), se le llama contador de localidad, nos permite poner en una CONSTANTE la direccin de la localidad actual de memoria de la sentencia en ensamble. Tiene los atributos de una etiqueta near, representa un offset relativo al segmento actual, es igual al nmero de bits generados por el segmento en ese punto. Ejemplo: var1 EQU $ var1 almacena el offset en ese punto del segmento. Una aplicacin de este operador sera el clculo de la longitud de una cadena, por ejemplo: .DATA cad DB 'Hola muchachas' lcad EQU $ - cad ;a partir de la direccin regresada por $ restamos la direccin de cad. El resultado es ;la longitud de la cadena cad. cad, en esta ocasin representa una direccin. Agosto Diciembre 2009 Pg. 63 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Consideremos el siguiente programa. TITLE Programa ENSA15.ASM Muestra uso de $ y la igualdad EQU DOSSEG .MODEL Small .STACK 100h ;Aloja el stack 256 bytes .DATA a DB "Hola Muchachas.",13,10 ;Mensaje a ser escrito la EQU $ - a ;Calcula longitud del mensaje .CODE start: mov ax, @DATA mov ds, ax mov bx,1 mov cx,la lea dx,a mov ah,40h int 21h mov ax,4C00h int 21h END start ;Carga localidad de segmento en el registro DS ;Carga 1 para archivo estndar de salida. ;Carga longitud del mensaje en CX ;Carga la direccin del mensaje ;Nmero de funcin de escritura ;Interrupcin del DOS

OBSERVACIONES. En este programa el calculo de la longitud de la cadena nos sirve para el uso de la funcin 40h de la interrupcin 21h. Sintaxis: INT 21h Funcin 40h Escribe a un archivo o dispositivo. Para usar esta funcin cargue el nmero de bytes a escribir en DX. AX regresa el nmero de bytes que fueron realmente escritos en el archivo o dispositivo. Entrada: AH = 40h BX = Archivo a manejar. CX = Nmero de bytes a escribir. DS:DX = Direccin del buffer de datos. Salida: Carry Flag = 0 (Se realiz satisfactoriamente) AX = Nmero de bytes escritos. Carry flag = 1 AL = 5 Acceso negado = 6 Manejo invlido

Manejador 0 1 2 3 4

Uso Entrada Estndar Salida Estndar Salida estndar de error Salida auxiliar COM1 Impresin Estndar PRN

Dispositivo CON CON CON AUX PRN

Agosto Diciembre 2009

Pg. 64 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


6) Operadores de tipo. Estos operadores especifican o analizan el tipo de operando de memoria. 6.a) El operador PTR. Este operador especifica el tipo de una variable o etiqueta. Forza a la expresin a ser tratada como del tipo especificado. Se usa para permitir que ciertas instrucciones acepten variables que de otra forma generaran error. Sintaxis: tipo PTR expresin Donde: expresin: Es cualquier operando. tipo: Para operandos a memoria puede ser BYTE, WORD, DWORD, FWORD, QWORD TBYTE y para etiquetas puede ser NEAR, FAR PROC Veamos el siguiente programa. ;Programa ENSA16.ASM ;Uso de Operadores, segundo programa. STACK SEGMENT PARA STACK 'STACK' DB 64 DUP (?) STACK ENDS DATA SEGMENT PARA PUBLIC 'DATA' a DB 10h, 20h, 30h, 40h, 50h b DW 6070h, 8090h c DD ? d EQU 0AABBh DATA ENDS CSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG, DS:DATA, SS:STACK inicio: mov ax, SEG DATA mov ds, ax mov ax, WORD PTR a ;Carga en AX los 2 primeros bytes de A mov WORD PTR c[0], ax ;Carga en c los primeros 2 bytes de A mov ax, WORD PTR a[2] ;Carga en AX los 2 bytes sig. de A mov WORD PTR c[2], ax ;Carga en c los 2 bytes sig. de A mov ax, b ;Vamos a realizar una suma de 32 bits add WORD PTR c[0], ax ;c = c + 80906070, sto es, mov ax, b[2] ;c = 40302010h + 80906070h = C0C08080h adc WORD PTR c[2], ax ;usamos ADC para sumar el Carry mov bh, HIGH d ;Cargamos en BH la parte alta de D mov bl, LOW d ;Cargamos en BL la parte baja de D mov ax, 4C00h int 21h CSEG ENDS END inicio OBSERVACIONES. En este programa tratamos de ejemplificar el uso del operador PTR, en su aplicacin ms comn, el modificar el tamao de variables. Lo primero que hacemos es pasar a c que esta definido como Doble WORD de menos significativo a ms significativo los primeros 4 bytes de a la cual fu definida como un arreglo de tipo BYTE. para ello usamos el operador PTR, en donde cuando a a le sobreponemos un tipo WORD el ensamblador toma 2 bytes de a en vez de uno. Pasamos de 2 en 2 bytes ya que es lo mximo que nos puede manejar un registro del 8088/8086/80286. Como ya c tiene un valor, en la siguiente parte del programa hacemos una suma de 32 bits; c = c + b, para ello usamos 2 instrucciones ADD para la parte menos significativa del nmero y ADC para sumar con carry la parte ms significativa del nmero. Note que b es un arreglo de tipo WORD. Por ltimo en la tercera parte del programa de la constante d usando los operadores HIGH y LOW pasamos al registro BX primero la parte alta de la constante, luego su parte baja; d EQU 0 AABBh A continuacin se presenta el mismo programa pero para correr en 80386, vea que los pasos se reducen considerablemente debido a los registros de 32 bits de este procesador.

Agosto Diciembre 2009

Pg. 65 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


;Programa ENSA16A.ASM ;Uso de Operadores, segundo programa. .386 STACK SEGMENT PARA STACK 'STACK' DB 64 DUP (?) STACK ENDS DATA SEGMENT PARA PUBLIC 'DATA' a DB 10h, 20h, 30h, 40h, 50h b DW 6070h, 8090h c DD ? d EQU 0AABBh DATA ENDS CSEG SEGMENT PARA PUBLIC USE16 'CODE' ASSUME CS:CSEG, DS:DATA, SS:STACK inicio: mov ax, SEG DATA mov ds, ax mov eax, DWORD PTR a ;Carga en eax los 4 primeros bytes de A mov c, eax mov eax, DWORD PTR b ;Vamos a realizar una suma de 32 bits add c, eax ;c = c + 80906070, esto es, c = 40302010h + 80906070h = C0C08080h mov bh, HIGH d ;Cargamos en BH la parte alta de D mov bl, LOW d ;Cargamos en BL la parte baja de D mov ax, 4C00h int 21h CSEG ENDS END inicio OBSERVACIONES. En el inicio del programa se incluye la directiva (.386). En la declaracin del segmento de cdigo, note el uso de la seccin de use (USE16), el predefinido es USE32, vea que tambin es posible en este micro utilizar registros de 8, 16, y 32 bits. Nota: Para analizar este programa no se puede usar el DEBUG del Sistema Operativo, es necesario usar el CV, en donde tambin se pueden observar los registros de 32 bits del 80386.

6.b) Operador SHORT. Este operador especifica que la etiqueta tiene un alcance corto, (< a 128 bytes). Sintaxis: SHORT etiqueta Ejemplos: jump uno jump SHORT uno

;Salta 128 bytes o ms. ;Salta menos de 128 bytes.

6.c) Operador THIS. Este operador crea un operando cuyo valor de su OFFSET y segmento es igual a la posicin actual del operador y cuyo tipo es el especificado en la sintaxis del operador. Sintaxis: THIS tipo Donde: tipo: * Para operandos a memoria. Puede ser BYTE, WORD, DWORD, FWORD, QWORD TBYTE * Para etiquetas. Puede ser NEAR, FAR PROC El operador THIS se usa tpicamente con la directiva EQU para crear etiquetas o variables.

6.d) Los operadores HIGH y LOW. El operador HIGH regresa el byte ms significativo de la expresin y el operador LOW regresa el byte menos significativo de la expresin. La expresin deber ser una constante de 2 bytes. Sintaxis: HIGH expresin LOW expresin Agosto Diciembre 2009 Pg. 66 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


6.e) El operador SEG. Regresa la direccin del segmento de una expresin. Sintaxis: SEG expresin Donde: expresin: Puede ser una etiqueta, variable, nombre de segmento, nombre de grupo, o cualquier operando de memoria. El valor regresado se puede utilizar como un operando de memoria.

6.f) El operador OFFSET. Regresa la direccin del OFFSET de una expresin. Sintaxis: OFFSET expresin Donde: expresin: Puede ser cualquier etiqueta, variable, o un operando directo a memoria. El valor regresado por OFFSET es una constante (operando inmediato). Cuando se maneja la estructura simplificada, el valor regresado puede ser: 1. Si se maneja un segmento de datos NEAR, el valor regresado es el nmero de bytes entre el item y el inicio del grupo (DGROUP). 2. Si el item es declarado dentro de un segmento FAR el valor regresado es el nmero de bytes entre el item y el inicio del segmento. 3. Si se usa en la declaracin estndar de segmento, el valor regresado es un operando a memoria igual al nmero de bytes entre el item y el inicio del segmento dentro del cual fue declarado. El operador de sobre-escritura de segmento se puede usar para forzar a OFFSET a regresar el nmero de bytes entre el item en expresin y el inicio de un nombre de segmento o grupo. Ejemplo: mov bx, OFFSET DGROUP:arreglo No es lo mismo que: mov bx, OFFSET arreglo Cuando el segmento donde se defini arreglo no es el primer segmento del grupo.

6.g) El operador TYPE. Sintaxis: TYPE expresin

Este operador regresa un nmero que representa el tipo de una expresin.

Cuando expresin evala a una variable, el operador regresa el nmero de bytes en cada dato de la variable. Cuando se manejan cadenas cada carcter es considerado como un dato separado, por lo tanto, al evaluar una cadena TYPE regresa 1. Cuando se evala una constante regresa CERO. Si estamos evaluando una estructura, regresa el # de bytes en la estructura.

6.h) El operador LENGHT. Este operador regresa el nmero de elementos de un dato en un arreglo u otra variable definida con el operador DUP. Sintaxis: LENGHT variable

6.i) El operador SIZE. El operador SIZE regresa el nmero total de bytes proporcionados a un arreglo u otro tipo de variable definida con el operador DUP. Sintaxis: SIZE variable

Agosto Diciembre 2009

Pg. 67 -

Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.


Veamos un ejemplo de uso de algunos de estos operadores. TITLE Programa ENSA17.ASM COMMENT $ Este programa ejemplifica el uso de: 1) Un puntero. $ 2) Operadores de tipo. .MODEL Small .STACK 100h .DATA a DB "Esta es una cadena" pa DW a b EQU THIS WORD c DD 1887473824 d DW 16 DUP (?) e label WORD f DB 10h, 20h, 30h, 40h .CODE inicio: mov ax, DGROUP mov ds, ax mov ax, SEG pa mov bx, pa mov cx, OFFSET a mov dx, b mov di, e mov ax, SIZE d mov bx, TYPE d mov cx, LENGTH d mov ax, 4C00h int 21h END inicio OBSERVACIONES. a es una variable tipo byte, en la siguiente declaracin lo que hacemos es asignarle a pa la direccin de inicio de la cadena a, entonces la direccin se va a guardar en una localidad de memoria de 2 bytes. b es una constante que contiene la direccin de la localidad de memoria donde se declar THIS, (localidad de 2 bytes), sto es, esta localidad corresponde a los 2 bytes menos significativos de cc. Como lo veremos en la corrida. d nos sirve para ver como trabajan los operadores, SIZE, TYPE y LENGTH. Incluimos una variable etiquetada e la cual se declara de 2 bytes y toma el valor de los primeros 2 bytes de la variable f. Podemos ver que THIS y LABEL tiene un comportamiento idntico. Si vemos el DEBUG podemos comprobar lo que hemos dicho. ;Ponemos en AX el valor del segmento de pa ;Ponemos en BX el valor de pa ;Corresponde al mismo que OFFSET de a ;Ponemos en dx el valor de b 90A0h ;Observe la similitud con THIS ;Regresa 20 ;Regresa 2 ;Regresa 10

;Definimos una cadena ;En el puntero pa guardamos el OFFSET de a ;Definimos b como una variable tipo WORD para accesar los primeros 2 bytes de c

;a e la definimos como una variable ;etiquetada que hace referencia a f

AX=106E BX=0000 CX=0062 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=105C ES=105C SS=1073 CS=106C IP=0003 NV UP EI PL NZ NA PO NC 106C:0003 8ED8 MOV DS,AX -t 2 AX=106E BX=0000 CX=0062 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=106E ES=105C SS=1073 CS=106C IP=0008 NV UP EI PL NZ NA PO NC 106C:0008 8B1E1800 MOV BX,[0018] -t DS:0018=0006 AX=106E BX=0006 CX=0062 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=106E ES=105C SS=1073 CS=106C IP=000C NV UP EI PL NZ NA PO NC 106C:000C B90600 MOV CX,0006 -t
Agosto Diciembre 2009 Pg. 68 Ing. Claudia E. Carrillo R

Lenguaje Ensamblador. Ingeniera en Sistemas Computacionales. I T LALAGUNA.

AX=106E BX=0006 CX=0006 DX=0000 SP=0100 BP=0000 SI=0000 DI=0000 DS=106E ES=105C SS=1073 CS=106C IP=000F NV UP EI PL NZ NA PO NC 106C:000F 8B161A00 MOV DX,[001A] -t DS:001A=90A0 AX=106E BX=0006 CX=0006 DX=90A0 SP=0100 BP=0000 SI=0000 DI=0000 DS=106E ES=105C SS=1073 CS=106C IP=0013 NV UP EI PL NZ NA PO NC 106C:0013 8B3E3E00 MOV DI,[003E] -t DS:003E=2010 AX=106E BX=0006 CX=0006 DX=90A0 SP=0100 BP=0000 SI=0000 DI=2010 DS=106E ES=105C SS=1073 CS=106C IP=0017 NV UP EI PL NZ NA PO NC 106C:0017 B82000 MOV AX,0020 -t AX=0020 BX=0006 CX=0006 DX=90A0 SP=0100 BP=0000 SI=0000 DI=2010 DS=106E ES=105C SS=1073 CS=106C IP=001A NV UP EI PL NZ NA PO NC 106C:001A BB0200 MOV BX,0002 -t AX=0020 BX=0002 CX=0006 DX=90A0 SP=0100 BP=0000 SI=0000 DI=2010 DS=106E ES=105C SS=1073 CS=106C IP=001D NV UP EI PL NZ NA PO NC 106C:001D B91000 MOV CX,0010 -dds:0 106E:0000 106E:0010 106E:0020 106E:0030 106E:0040 -q B8 61 00 00 30 00 20 00 00 40 4C 63 00 00 00 CD 61 00 00 00 21 64 00 00 00 00 65 00 00 00 45 6E 00 00 00 73-74 61-06 00-00 00-00 00-00 61 00 00 00 00 20 A0 00 00 F1 65 90 00 00 00 73 80 00 00 FF 20 70 00 00 00 75 00 00 10 28 6E ..L... 00 a ca.. 00 20 01

El rea subrayada es parte del cdigo del programa. La parte ms negra del mapa de memoria corresponde al espacio reservado por d

Precedencia de Operadores.

Precedencia (Alta)

Operadores. LENGHT, SIZE, (), [], <> . (operador de campo de estructura) : PTR, OFFSET, SEG, TYPE, THIS HIGH, LOW +, - (monario) *, /, MOD, SHL, SHR +, - (binario) EQ, NE, LT, LE, GT, GE NOT AND OR, XOR SHORT

(baja)

Agosto Diciembre 2009

Pg. 69 -

Ing. Claudia E. Carrillo R