Professional Documents
Culture Documents
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
Pg. 15 -
0FFFEH 0FFFEH
00 00 SP
00100H 000FFh
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.
Pg. 16 -
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
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.
Pg. 18 -
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.
CS:IP
PSP
DS, ES
Figura 2.2 Mapa de memoria de un programa .EXE Agosto Diciembre 2009 Pg. 19 Ing. Claudia E. Carrillo R
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
'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.
Pg. 21 -
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 $.
;Asigna el segmento CS a DS ;el programa solo tiene dos segmentos. Pg. 22 Ing. Claudia E. Carrillo R
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.
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
Pg. 24 -
;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
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
;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.
Pg. 25 -
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.
2.
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
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
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
;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.
Pg. 28 -
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
Pg. 30 -
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
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
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.
Pg. 33 -
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
-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.
Pg. 35 -
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
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
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.
Pg. 38 -
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
: ; = ? [] / () + * . .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
Pg. 40 -
;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 -
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
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
Pg. 43 -
-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
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
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
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 -
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
STACK
BEGDATA
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
En esta seccin analizaremos solo los correspondientes al modelo Small. Segmentos y tipos para el Modelo de Memoria SMALL
Modelo Small
Grupo
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.
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.
Pg. 49 -
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.
Pg. 50 -
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.
Lnea comandos /S /A
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
Pg. 51 -
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
Pg. 52 -
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
Pg. 54 -
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
DATA2
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
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 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.
Pg. 57 -
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
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.
Pg. 59 -
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
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
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)
Pg. 61 -
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
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
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
Pg. 64 -
Pg. 65 -
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
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
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.
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
Pg. 67 -
;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
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
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)
Pg. 69 -