17
INTRODUCCION AL ENSAMBLADOR .MODEL SMALL .STACK .DATA ; Mensajes a mostrar datoMio db "Mi letra favorita es: $" pregunta db "Cual es tu letra favorita? $" ; Varibles a utilizar miLetra db 'C' tuLetra db ? .CODE inicio: ; Aqui empieza el programa ; para que encuentre las variables mov ax, @DATA ; Carga la dirección del segmento de datos a AX mov ds, ax ; e inicializa ds ; borro la pantalla mov ah, 06h mov al, 0 ; borrar toda la pantalla mov bh, 6 ; letras blancas fondo negro mov ch, 5 ; esquina izquierda 0,0 mov cl, 10 mov dh,24; esquina derecha 24, 80 mov dl,80 int 10h ; hacerlo ; me posiciono para mostrar mi mensaje mov ah, 2 mov bh, 0 ; pagina 0 mov dh, 2 ; posición 2, 1 mov dl, 1 int 10h ; escribo mi mensaje "Mi letra favorita es:" mov ah, 9 ; ds:dx dirección del mensaje ; ds ya apunta al segmento de datos solo falta dx mov dx, OFFSET datoMio ; cargo la dirección del mensaje int 21h ; mostrar el mensaje ; pongo mi letra favorita "C" mov ah, 2 mov dl, miLetra int 21h ; me cambio de posición para preguntarte a ti mov ah, 2 mov bh, 0; pagina 0 mov dh, 3 ; posicion 3, 1 mov dl, 1 int 10h ; pongo la pregunta "Cual es tu letra favorita?" mov ah, 9 mov dx, OFFSET pregunta int 21h ; leo tu letra favorita mov ah, 1 int 21h

curso assemblerParte1.pdf

Embed Size (px)

Citation preview

  • INTRODUCCION AL ENSAMBLADOR .MODEL SMALL .STACK .DATA ; Mensajes a mostrar datoMio db "Mi letra favorita es: $" pregunta db "Cual es tu letra favorita? $" ; Varibles a utilizar miLetra db 'C' tuLetra db ? .CODE inicio: ; Aqui empieza el programa ; para que encuentre las variables mov ax, @DATA ; Carga la direccin del segmento de datos a AX mov ds, ax ; e inicializa ds ; borro la pantalla mov ah, 06h mov al, 0 ; borrar toda la pantalla mov bh, 6 ; letras blancas fondo negro mov ch, 5 ; esquina izquierda 0,0 mov cl, 10 mov dh,24; esquina derecha 24, 80 mov dl,80 int 10h ; hacerlo ; me posiciono para mostrar mi mensaje mov ah, 2 mov bh, 0 ; pagina 0 mov dh, 2 ; posicin 2, 1 mov dl, 1 int 10h ; escribo mi mensaje "Mi letra favorita es:" mov ah, 9 ; ds:dx direccin del mensaje ; ds ya apunta al segmento de datos solo falta dx mov dx, OFFSET datoMio ; cargo la direccin del mensaje int 21h ; mostrar el mensaje ; pongo mi letra favorita "C" mov ah, 2 mov dl, miLetra int 21h ; me cambio de posicin para preguntarte a ti mov ah, 2 mov bh, 0; pagina 0 mov dh, 3 ; posicion 3, 1 mov dl, 1 int 10h ; pongo la pregunta "Cual es tu letra favorita?" mov ah, 9 mov dx, OFFSET pregunta int 21h ; leo tu letra favorita mov ah, 1 int 21h

  • ; guardo tu letra favorita en tuLetra mov tuLetra, al ; termina el programa mov ax, 4c00h int 21h End inicio

    LA INSTRUCCIN "mov"

    La instuccin "mov" se utiliza para mover datos de un lado a otro entre memoria y los registros

    del microprocesador.

    "mov" necesita dos operandos y tiene la siguiente sintaxis:

    mov destino, fuente

    La instruccin "mov" permite muchas combinaciones de "destino" y "fuente" sin embargo, tiene

    las siguientes restricciones:

    - El destino no puede ser CS.

    - La fuente y el destino no pueden ser operandos de memoria.

    - Si la fuente es un valor inmediato, el destino no puede ser un registro de segmento.

    - El destino no puede ser un operando inmediato.

    - La fuente y el destino deben ser del mismo tamao.

    DECLARACIN DE VARIABLES

    La declaracin de variables se hace en el segmento de datos. Para esto se debe incluir la

    directiva .DATA en el cdigo fuente en el lugar donde se declaran la variables.

    Para declarar un variable se recomienda especificar el nombre de la variable, el tamao de la

    variable y el valor inicial que esta tendr. La tabla 1.1 muestra algunas de las directivas

    utilizadas para especificar el tamao de una variable.

    Directiva Tamao Ejemplo DB byte valor1 db ?

    valor2 db 5 mensaje db "hola"

    DW palabra contador dw 345Fh DD doble palabra (32 bits) direccion dd 123FA4C1h

    Tabla 1.1 Tamaos de variables

    Si no se inicializa una variable se utiliza el smbolo ? y entonces la variable tendr un valor

    indeterminado.

  • SEVICIOS DEL BIOS Y DOS PARA EL MANEJO DE ENTRADA Y SALIDA.

    Los servicios del BIOS y DOS son funciones proporcionadas por cada uno de los sistemas. El

    uso de estos servicios evita que el programador este obligado a conocer la arquitectura de los

    diferentes subsistemas de la microcomputadora.

    Servicios del BIOS (int 10h)

    ESTABLECER LA POSICIN DEL CURSOR DATOS DE ENTRADA

    AH 02H

    BH nmero de pgina, de 0 a 7 dependiendo del modo

    DH nmero de fila

    DL nmero de columna RECORRER PGINA HACIA ARRIBA (BORRAR PANTALLA) Datos de Entrada

    AH 06H

    AL cantidad de lneas a recorrer, 0 si es toda la pantalla

    BH atributo de las lneas en blanco

    CH rengln de la esquina superior izquierda

    CL columna de la esquina superior izquierda

    DH rengln de la esquina inferior derecha

    DL columna de la esquina inferior derecha Servicios del DOS (int 21h) LEER UN CARACTER CON ECHO Datos de Entrada

    AH 01H Datos de Salida

    Si AL > 0, AL ASCII del carcter ledo Si AL = 0, Ejecutar el servicio de nuevo para tener en AL el carcter extendido

    MOSTRAR UN CARCTER EN PANTALLA Datos de Entrada

    AH 02H

    DL ASCII del carcter a mostrar Datos de Salida Ninguno LEER UN CARCTER SIN ECHO Datos de Entrada

    AH 07H Datos de Salida

    AL ASCII del carcter ledo MOSTRAR UNA CADENA Datos de Entrada

    AH 09H

    DS:DX direccin de la cadena terminada en "$"

  • Datos de Salida Ninguno EJERCICIOS 1. Escribir el programa el siguiente programa en un editor de texto y grbalo con el nombre PRACT1A.ASM

    .MODEL SMALL ; especifica un modelo de memoria

    .CODE ; comienzo de segmento CODE

    .STACK ;los programas EXE necesitan un stack

    .DATA ;comienzo del segmento DATA

    Msg DBHola a todos$ ;define el string

    Start:

    mov ax, @data ; copia direcciones de DATA

    mov ds, ax ; segmento en DS

    mov dx, OFFSET Msg ; offset de "Msg" a DX

    mov ah, 9 ; funcin nmero 9 de DOS

    int int 21h ; llama al DOS

    mov ax, 4c00h ; usa funcin de DOS

    int 21h ;4Ch para salir

    END Start ;indica donde empieza la ejecucin

    2. Para enlazar y ensamblar el programa utiliza las siguientes instrucciones en el prompt del sistema. 3. ml /Zi /Sn test.asm /link /CO

    4. Carga el programa PRACT1A.EXE en CODEVIEW ( cv test )y ejecuta el programa con F5. 5. Ve al menu de run y restaura el programa en la opcin restart. Vuelve a correr el programa solo hasta la impresin del mensaje. Para esto pon el cursor en la lnea 9 y corre el programa con F7. Cual fue el funcionamiento de la tecla F7 ?. 6. Restaura el programa y ejectalo paso por paso . Como se hace esto ? 7. Cual es la diferencia entre las tres presentacin es que puede tomar el cdigo fuente al presionar F3 ? 8. Para que se utilizan las teclas F2, F4, F8 y F10 en CODEVIEW? 9. Agrega la variable de Msg a la ventana de watch. 10. Como se modifica el tamao y la posicin de las ventanas ? 11. Marca un breakpoint y explica como se hace y para que se utiliza. 12. Modifica el programa para que muestre en lugar de HOLA A TODOS tu nombre. Para esto tienes que utilizar la ventana donde te muestra las direcciones de memoria. Ve al men de VIEW a la opcin de memory y tienes que modificar los datos de la direccin que tiene el registro DS. 13. Escribe el siguiente programa en el editor del DOS, grbalo como PRACT1B.ASM, ensmblalo, crgalo en el programa CODEVIEW ah ejectalo y verifica que se dibuja .MODEL SMALL ;Especificar el modelo de memoria .STACK ;los programas EXE necesitan una pila .CODE ;Inicio del segmento de CODE Inicio: ;Aqu se escribe el cdigo del programa ;por ejemplo

  • mov ah, 2 ;Mostrar un carcter en pantalla mov dl, 1 int 21h ;hacerlo ;Todo programa debe terminar con esta rutina mov ax, 4c00h ;Terminar un programa int 21h ;hacerlo END Inicio ;Indica en donde empieza la ejecucin

    14. Modifica el valor del registro para que dibuje la letra .

    15. Escribe el programa fuente de la figura 1 - 1 grbalo con el nombre PRACT1C.ASM , ensmblalo , enlzalo y ejectalo. 16. Elabora un programa que escriba tu nombre en una lnea y tu matricula en otra lnea . grbalo con el nombre PRACT1D.ASM. Ensmblalo, enlzalo, crrelo y genera un archivo .LST que incluya la tabla de smbolos. 17. Escribe un programa que se llame PRACT1E.ASM que muestre una descripcin breve del funcionamiento del programa en las primeras 3 lneas de la pantalla. El programa debe hacer lo siguiente: Leer un carcter. Muestre tu nombre en un cuadro centrado en la pantalla. El contorno del cuadro se dibujar con el carcter que se escribi. Borre la pantalla cuando se vuelva a presionar una tecla para terminar el programa.

    MOVIMIENTO DE DATOS

    Objetivo: El alumno practicar el uso de las instrucciones de transferencia de datos en

    memoria y demostrar su comprensin

    LENGUAJE ENSAMBLADOR Los programadores que escriben en un lenguaje ensamblador de bajo nivel codifican

    instrucciones simblicas, cada una de las cuales genera una instruccin lenguaje

    mquina. A pesar del hecho de que codificar en un lenguaje de alto nivel es ms

    productivo, algunas ventajas de codificar en lenguaje ensamblador son:

    Proporciona ms control sobre el manejo particular de los requerimientos de

    hardware.

    Genera mdulos ejecutables ms pequeos y ms compactos.

    Con mayor probabilidad tiene una ejecucin ms rpida.

    Una prctica comn es combinar los beneficios de ambos niveles de programacin:

    codificar el grueso del proyecto en lenguaje de alto nivel y los mdulos crticos

    (aquellos que provocan notables retardos) en lenguaje ensamblador.

    COMENTARIOS EN LENGUAJE ENSAMBLADOR

    El uso de comentarios a lo largo de un programa puede mejorar su claridad, en

    especial en lenguaje ensamblador, donde el propsito de un conjunto de instrucciones

    con frecuencia no es claro. Un comentario empieza con punto y coma (;) y, en

    dondequiera que lo codifique, el ensamblador supone que todos los caracteres a la

    derecha en esa lnea son comentarios. Un comentario puede contener cualquier

    carcter imprimible, incluyendo espacio en blanco.

  • IDENTIFICADORES

    Un identificador es un nombre que se aplica a elementos en el programa. Los dos

    tipos de identificadores son: nombre, que se refiere a la direccin de un elemento de

    dato, y etiqueta, que se refiere a la direccin de una instruccin. Las mismas reglas se

    aplican tanto para los nombres como para las etiquetas. Un identificador puede utilizar

    los siguientes caracteres:

    Letras del alfabeto: desde la A hasta la Z

    Dgitos: desde el 0 hasta 9 (no puede ser el primer carcter)

    Caracteres especiales: signo de interrogacin (?)

    Subrayado ( _ )

    Signo de pesos ( $ )

    Arroba ( @ )

    Punto ( . )(no puede ser el primer carcter)

    El primer carcter de un identificador debe ser una letra o un carcter especial,

    excepto el punto. El ensamblador trata a las letras maysculas y minsculas como

    iguales. La longitud mxima de un identificador es de 31 caracteres (247 desde la

    versin 6.0).

    INSTRUCCIONES

    Un programa en lenguaje ensamblador consiste en un conjunto de enunciados. Los

    dos tipos de enunciados son:

    1. Instrucciones, tal como MOV y ADD, que el ensamblador traduce a cdigo objeto; y

    2. Directivas, que indican al ensamblador que realice una accin especfica, como

    definir un elemento de dato.

    A continuacin est el formato general de un enunciado, en donde los corchetes

    indican una entrada opcional:

    [ identificador ] Operacin [ operando ( s ) ] [ ; comentario ]

    La operacin, que debe ser codificada es, con mayor frecuencia usada para la

    definicin de reas de datos y codificacin de instrucciones. Para un elemento de

    datos, una operacin tal como DB o DW define un campo, rea de trabajo constante.

    Para una instruccin, una operacin como MOV o ADD indica una accin a realizar.

    El operando (si existe) proporciona informacin para la operacin que acta sobre l,

    Para un elemento de datos, el operando identifica su valor inicial.

    Para una instruccin, un operando indica en dnde realizar la accin. Una operacin

    de una instruccin puede tener una, dos o tal vez ninguna entrada. Aqu estn tres

    ejemplos:

    RET ;regresa

    INC CX ;incrementa el registro CX

    ADD AX , 12 ;suma 12 al registro AX

  • DIRECTIVAS

    El lenguaje ensamblador permite usar diferentes enunciados que permiten controlar la

    manera en que un programa ensambla y lista. Estos enunciados, llamados directivas,

    actan slo durante el ensamble de un programa y no generan cdigo ejecutable de

    mquina.

    CMO TERMINAR LA EJECUCIN DE UN PROGRAMA

    INT 21H es una operacin de interrupcin comn del DOS que utiliza un cdigo de

    funcin en el registro AH para especificar una accin que ser realizada. Las

    diferentes funciones de INT 21H incluyen entrada desde el teclado, manejo de

    pantalla, E/S de disco y salida a impresora. La funcin que nos interesa aqu es la

    4CH, que INT 21H reconoce como una peticin para la terminacin de la ejecucin de

    un programa.

    DIRECTIVAS SIMPLIFICADAS DE SEGMENTOS

    El ensamblador de Microsoft proporciona algunas formas abreviadas para definir

    segmentos. Para usar estas abreviaturas, inicialice el modelo de memoria antes de

    definir algn segmento. El formato general es:

    . MODEL modelo de memoria

    El modelo de memoria puede ser TINY, SMALL, MEDIUM, COMPACT o LARGE. Los

    requisitos para cada modelo son:

    Modelo Nmero de segmentos de cdigo Nmero de segmentos de datos

    TINY * *

    SMALL 1 1

    MEDIUM mas de 1 1

    COMPACT 1 mas de 1

    LARGE mas de 1 mas de 1

    La directiva .MODEL genera de forma automtica el enunciado ASSUME necesario.

    Los formatos generales (incluyendo el punto) para las directivas que define los

    segmentos de pila, de datos y de cdigo son:

    .STACK [tamao }

    .DATA

    .CODE[nombre ]

    Cada una de estas directivas hacen que el ensamblador genere el enunciado

    SEGMENT necesario y su correspondiente ENDS. Los nombres por omisin de los

    segmentos ( que usted no tiene que definir ) son STACK, DATA y TEXT (para el

    segmento de cdigo). Cuando el formato codificado lo indica, puede no hacer caso al

    nombre por omisin del segmento de cdigo. El tamao, por omisin, de la pila es de

  • 1,024 bytes, el cual tambin puede pasar por alto. Se utilizan estas directivas para

    identificar en donde, en el programa estn ubicados los tres segmentos.

    DEFINICION DE DATOS (DECLARACION DE VARIABLES )

    Como ya se estudio, el propsito del segmento de datos en un programa .EXE es

    definir constantes, reas de trabajo y reas de entrada/salida. El ensamblador permite

    la definicin de elementos de varias longitudes de acuerdo con el conjunto de

    directivas que definan datos. Por ejemplo, DB define un byte y DW define una palabra.

    Un elemento de datos puede contener un valor indefinido (esto es no inicializado) o

    una constante, definida como una cadena de caracteres o como un valor numrico. Su

    formato general es:

    [nombre] Dn expresin

    Un programa que hace referencia a un elemento de dato lo hace por medio de un

    nombre. Dn define los elementos de datos como DB (byte), DW (Palabra), DD

    (Palabra doble), DF(palabra larga), DQ( palabra cudruple) y DT (diez bytes), cada

    una indica de manera explcita la longitud del elemento definido. La expresin es un

    operando que puede contener un signo de interrogacin para indicar un elemento no

    utilizado.

    INSTRUCCIONES Y DIRECCIONAMIENTO DEL PROCESADOR

    OPERANDOS

    Un operando es una fuente de datos para una instruccin. Algunas instrucciones,

    como CLC y RET, no necesitan un operando, mientras que otras pueden tener uno o

    dos operandos. Donde existan dos operandos, el segundo es el fuente, que contiene

    ya sea datos que sern entregados (inmediatos) o bien la direccin (de un registro o

    en memoria) de los datos. El dato fuente no es cambiado por la operacin. El primer

    operando es el destino, que contiene datos en un registro o en memoria y que ser

    procesado.

    Operacin operando1, operando2

    Operandos Registro. Para este tipo, el registro proporciona el nombre de alguno de

    los registros de 8, 16 32 bits. Dependiendo de la instruccin, el registro puede

    codificarse en el primero o segundo operandos, o en ambos:

    WORD DW ?

    ..

    MOV CX , WORDX ;registro en el primer operando

    MOV WORDX , BX ;registro en el segundo operando

    MOV CL , AH ;registros en ambos operandos

    El procesamiento de datos entre registros es el tipo de operacin ms rpida, ya que

    no existe referencia a memoria.

  • Operandos Inmediatos. En formato inmediato, el segundo operando contiene un

    valor constante o una expresin constante. El campo destino en el primer operando

    define la longitud de los datos y puede ser un registro o una localidad de memoria. A

    continuacin se dan algunos ejemplos:

    SAVE DB ?

    ..

    ADD CX , 12 ;Suma 12 al CX

    MOV SAVE , 25 ;Mueve 25 a SAVE

    Operandos de memoria directa. En este formato, uno de los dos operandos hace

    referencia a una localidad de memoria y el otro a un registro. Note que no existen

    instrucciones que permite que ambos operandos sean direcciones de memoria. Para

    el direccionamiento de datos de memoria, el registro DS es el registro por omisin.

    Aqu estn algunos ejemplos:

    WORD1DW 0

    BYTE1 DB 0

    ..

    MOV AX , WORD1 ;Carga WORD1 en AX

    ADD BYTE1 , CL ;Suma CL a BYTE1

    MOV BX , DS : [38B0H];Mueve una palabra desde la memoria al desplazamiento 38B0H

    INC BYTE PTR [2F0H];Incrementa el byte en el desplazamiento 2f0h

    Los ltimos dos ejemplos utilizan corchetes como especificadores de ndice para

    indicar una referencia a memoria ( el desplazamiento es combinado con la direccin

    en el DS ). La omisin de los corchetes, como en MOV BX , 38B0H, indica un valor

    inmediato. El ltimo ejemplo incrementa el byte en memoria en el desplazamiento

    2F0H ( el desplazamiento combinado con la direccin DS). Ya que el operando slo

    indica la localidad inicial de memoria, aqu necesitamos el modificador BYTE PTR para

    definir la longitud. A continuacin, un elemento de dato acta como una direccin de

    desplazamiento en un operando de instruccin:

    TABLEXDB 25DUP (?)

    ..

    MOV AL , TABLEX[4] ;obtiene el cuarto byte de TABLEX

    MOV AL , TABLEX+4 ;la misma operacin

    El primer MOV usa un especificador de ndice para accesar el cuarto byte de TABLEX.

    El segundo MOV usa un operador + para tener exactamente el mismo efecto.

    Operandos de memoria indirecta. Direccionamiento indirecto es una tcnica

    sofisticada que hace uso de las capacidades de la computadora para el

    direccionamiento de un segmento: desplazamiento. Los registros utilizados para este

    propsito son BX, DI, SI y BP, codificados con corchetes como un operador de ndice.

    BX, DI y SI estn asociados con el registro DS como DS:BX, DS:DI y DS:SI, para

    procesamiento de datos en el segmento de datos. El BP est asociado con el registro

  • SS como SS:BP, para manejo de datos en la pila, lo cual haremos cuando llamemos

    subprogramas y pasemos parmetros.

    Cuando el primer operando contiene una direccin indirecta, el segmento se refiere a

    un registro o a un valor inmediato; cuando el segundo operando contiene una direccin

    indirecta, el primero se refiere a un registro. Una direccin indirecta tal como [BX] le

    indica al ensamblador que la direccin que la direccin de memoria a usar estar en el

    registro BX cuando el programa la ejecute posteriormente.

    Note que cualquier referencia en corchetes a los registros BX, DI, SI o BP implican un

    operando indirecto, y el sistema trata los contenidos de los registros como un

    desplazamiento de direccin.

    DESPLAZAMIENTO DE DIRECCIN.

    Este mtodo utiliza un desplazamiento de direccin para un operando. El cdigo

    siguiente mueve el contenido de CL a TABLEX (una tabla de 26 bytes ); exactamente

    en donde TABLEX est determinada por el contenido de DI cuando el programa est

    en ejecucin:

    TABLEX DB 25 DUP(?)

    ..

    MOV TABLEX[DI] , CL

    INDEXACIN EN EL 80386 Y PROCESADORES POSTERIORES.

    Estos procesadores permiten una direccin que sea generada a partir de cualquier

    combinacin de uno o ms registros generales, un desplazamiento y un factor de

    escala (1, 2, 4 u 8) asociados con el contenido de uno de los registros. Por ejemplo, la

    instruccin

    MOV EBX , [ECX*2+ESP+4]

    mueve una direccin al EBX, la direccin consiste en el contenido de ( el ECX por 2 )

    ms contenido de ( el ESP ms 4 ).

    LA INSTRUCCIN MOV.

    La instruccin MOV transfiere (esto es, copia) los datos referenciados por la direccin

    del segundo operando a la direccin del perimer operando. El campo que se envia

    permanece sin cambios. Los operandos que hacen referencia a memoria o registros

    deben coincidir en tamao (es decir, ambos deben ser bytes, ambos deben ser

    palabras o ambos deben ser palabras dobles). El formato general para MOV es:

    [etiqueta:] MOV {registro/memoria} , {registro/memoria/inmediato}

    Puede mover a un registro un byte, una palabra o una palabra doble. El operando slo

    afecta la parte del registro referenciado; por ejemplo mover un byte al AL no afecta el

    AL. Las operaciones MOV que no son permitidas son de memoria a memoria,

    inmediato a registro de segmento y de registro de segmento a registro de

    segmento.Para manejar estas operaciones, tiene que codificar ms instrucciones.

  • INSTRUCCIONES PARA MOVER Y LLENAR.

    Una limitacin de la instruccin MOV es que el destino debe ser de la misma longitud

    que el fuente, tal como un byte a byte y una palabra a una palabra. En el 80386 y

    procesadores posteriores, las instrucciones MOVSX y MOVZX (mover y llenar )

    facilitan la transferencia de datos de un byte o palabra fuente a una palabra o palabra

    doble de destino. Aqu est el formato general de MOVSX y MOVZX:

    [etiqueta]MOVSX / MOVZX{registro/memoria} , {registro/memoria/inmediato}

    MOVSX, para uso con valores aritmticos con signo, mueve un byte o palabra a una

    palabra o palabra doble de destino y llena con el bit de signo (el ultimo bit a la

    izquierda del origen) los bits de ms a la izquierda del destino. MOVZX, para uso con

    valores numricos sin signo, mueve un byte o palabra a una palabra o palabra doble

    de destino y llena con bits cero los bits de mas a la izquierda del destino.

    LA INSTRUCCIN XCHG

    La instruccin XCHG realiza otro tipo de transferencia de datos, pero en lugar de

    copiar los datos de una localidad a otra, XCHG intercambia los datos. El formato

    general para XCHG es:

    [etiqueta:]XCHG{registro/memoria} , {registro/inmediato}

    Opciones validas con XCHG implican intercambio de datos entre dos registros y entre

    un registro y la memoria.

    LA INSTRUCCIN LEA.

    La instruccin LEA es til para inicializar un registro con una direccin de

    desplazamiento. De hecho, un nombre ms descriptivo para esta instruccin sera

    "Load Offset Address, carga una direccin de desplazamiento". El formato general

    para LEA es:

    [etiqueta:]LEA{registro/memoria}

    El uso comn para LEA es para inicializar un desplazamiento en el registro BX, DI o SI

    para indexar una direccin de memoria.

    LAS INSTRUCCIONES INC Y DEC.

    INC y DEC son instrucciones adecuadas para aumentar y disminuir en 1 los

    contenidos de registros y localidades de memoria. El formato general para INC y DEC

    es:

    [etiqueta:]INC / DEC{registro/memoria}

  • Note que estas instrucciones slo necesitan de un operando. Dependiendo del

    resultado, la operacin apaga o prende las banderas OF, SF y ZF, a las que las

    instrucciones de salto condicional puede verificar para menos, cero o ms.

    EJERCICIOS:

    Hacer un programa que lea un caracter y que muestre en la pantalla tu nombre con

    un recuadro con el caracter que se leyo, ademas, el fondo debe ser azul y la letra

    blaca. El programa debe explicar su funcionamiento al principio en fondo negro y letras

    blancas , y despus leer un entery ejecutarse. Grbalo como PRACT2A.ASM.

    Hacer un programa que dibuje un letrero de la UCCI utilizando un color diferente para

    cada letra. El programa debe explicar su funcionamiento al principio en fondo negro y

    letras blancas , y despus leer un entero y ejecutarse. Grbalo como PRACT2B.ASM.

    Hacer un programa que declare dos matrices de 2x2. La primera matriz debe estar

    inicializada con los valores del 0 al 3. La segunda matriz no debe estar inicializada. El

    programa debe incrementar los elementos del pimer renglon de la matriz inicializada y

    copiarlos a la primera columna de la segunda matriz.El programa debe decrementar

    los elementos del segundo renglon de la matriz inicializada y copiarlos a la segunda

    columna de la segunda matriz. El programa debe explicar su funcionamiento al

    principio en fondo negro y letras blancas , y despus leer un entery ejecutarse.

    LGICA Y CONTROL DE PROGRAMAS Ciertas instrucciones pueden transferir el control fuera del flujo secuencial normal aadiendo un valor de desplazamiento al IP. ETIQUETAS DE INSTRUCCIONES Las instrucciones JMP, Jnnn (salto condicional) y LOOP requieren un operando que se refiere a la etiqueta de una instruccin. JMP Una instruccin usada comnmente para la transferencia de control es la instruccin JMP (jump, salto, bifurcacin). Un salto es incondicional, ya que la operacin transfiere el control bajo cualquier circunstancia. Tambin, JMP vaca el resultado de la instrucciones previamente procesada; por lo que, un programa con muchas operaciones de salto puede perder velocidad de procesamiento. El formato general para JMP es: [etiqueta:] JMP direccin corta, cercana o lejana INSTRUCCION LOOP Como se menciona anteriormente, la instruccin JMP provoca un ciclo infinito. Pero es ms probable que una rutina realice un ciclo un nmero especfico de veces o hasta que se alcance una condicin particular. La instruccin LOOP, que sirve para este propsito, requiere un valor inicial en el registro CX. En

  • cada iteracin, LOOP de forma automtica disminuye 1 de CX. Si el valor de CX es cero, el control pasa a la instruccin que sigue; si el valor en el CX no es cero, el control pasa a la direccin del operando. El formato general para LOOP es : [etiqueta:] LOOP direccin corta Existen dos variaciones de la instruccin LOOP, ambas tambin decrementan el CX en 1. LOOPE/LOOPZ (repite el ciclo mientras sea igual o repite el ciclo mientras sea cero) contina el ciclo mientras que el valor en el CX es cero o la condicin de cero est establecida. LOOPNE/LOOPNZ (repite el ciclo mientras no sea igual o repite el ciclo mientras sea cero) contina el ciclo mientras el valor en el CX no es cero o la condicin de cero no est establecida. Ni LOOP ni sus variantes LOOPxx afectan ninguna bandera en el registro de banderas, que seran cambiados por otras instrucciones dentro de la rutina del ciclo. Como consecuencia, si la rutina no tiene instrucciones que afecten la bandera ZF (cero) entonces el uso de LOOPNE/LOOPNZ sera equivalente a usar LOOP. REGISTRO DE BANDERA El registro de bandera tiene 16 bits, los cuales varias instrucciones ponen a 1 para indicar el estado de una operacin. En todos los casos, una bandera permanece en 1 hasta que otra instruccin lo cambia. El registro de bandera para modo real tiene los siguientes bits usados comnmente: Bit no. : 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Sealizador : ODIT S ZA P C CF (Bandera de acarreo). Contiene un acarreo ((0,1) de un bit de orden alto (el ms a la izquierda) despus de operaciones aritmticas y algunas operaciones de corrimiento y rotacin. PF (Bandera de paridad). Contiene una verificacin de los ocho bits de orden bajo de operaciones de datos. La bandera de paridad no debe ser confundida con el bit de paridad y rara vez interesa en programacin convencional. Un nmero impar de bits en 1 limpian la bandera a cero (lo ponen en 0), y un nmero par de bits en 1 lo establecen en 1 (lo ponen en 1). AF (Bandera de acarreo auxiliar). Tiene que ver con aritmtica en campos ASCII y BCD empacados. Una operacin que provoca un acarreo externo en el bit 3 ( el cuarto bit desde la derecha) de un registro de un byte pone en 1 esta bandera. ZF (Bandera de cero). Como resultado de una operacin aritmtica o de comparacin, esta bandera se pone en 1 o en 0. De modo inesperado, un resultado no cero pone en 0 la bandera y un resultado cero lo pone en 1. Sin embargo, la configuracin, que en apariencia no es correcta, es correcta lgicamente: 0 significa no (el resultado no es igual a cero) y 1 significa s (el resultado es igual a cero). JE y JZ prueban esta bandera.

  • SF (Bandera de signo). Se establece de acuerdo con el signo (el bit de orden ms alto o de ms a la izquierda) despus de una operacin aritmtica: Positivo pone la bandera en 0 y negativo la pone en 1. JG y JL prueban esta bandera. TF (Bandera de trampa). Cuando est en 1, hace que el procesador ejecute en modo de un solo paso, esto es, una instruccin a la vez bajo el control del usuario. IF (Bandera de interrupcin). No permite interrupcin cuando est en 1. En programacin convencional, esta bandera rara vez es utilizada. OF (Bandera de desbordamiento). Indica un acarreo interno y uno externo en el bit de signo de alto orden ( de ms a la izquierda) despus de una operacin aritmtica con signo. INSTRUCCION CMP La instruccin CMP por lo comn es utilizada para comparar dos campos de datos, uno o ambos de los cuales estn contenidos en un registro. El formato general para CMP es: [etiqueta:] CMP {registro/memoria} , {registro/memoria/inmediato} El resultado de una operacin CMP afecta las banderas AF, CF, OF, PF, SF y ZF, aunque no tiene que probar estas banderas de forma individual.

    compare

    INSTRUCCIONES DE SALTO CONDICIONAL El ensamblador permite usar una variedad de instrucciones de salto condicional que transfieren el control dependiendo de las configuraciones en el registro de banderas. Por ejemplo, puede comparar dos campos y despus saltar de acuerdo con los valores de las banderas que la comparacin establece. El formato general para el salto condicional es: [etiqueta:] Jnnn direccin corta La instruccin LOOP disminuye el registro CX; si es diferente de cero, transfiere el control a la direccin del operando. Datos con signo y sin signo

  • Distinguir el propsito de los saltos condicionales debe clarificar su uso. El tipo de datos (sin signo o con signo) sobre los que se realizan las comparaciones o la aritmtica puede determinar cul es la instruccin a utilizar. Un dato sin signo trata todos los bits como bits de datos; ejemplos tpicos son las cadenas de caracteres, tal como nombres o direcciones, y valores numricos tal como nmeros de cliente. Un dato con signo trata el bit de ms a la izquierda como un signo, en donde 0 es positivo y 1 es negativo. Muchos valores numricos pueden ser positivo o negativo. Saltos con base en datos sin signo Las instrucciones siguientes de salto condicional se aplican a datos sin signo: Smbolo DESCRIPCION BANDERA EXAMINADA JE/JZ Salta si es igual o salta si es cero ZF JNE/JNZ Salta si no es igual o salta si no es cero ZF JA/JNBE Bifurca si es mayor o salta si no es menor o igual CF , ZF JAE/JNB Salta si es mayor o igual o salta si no es menor CF JB/JNAE Salta si es menor o salta si no es mayor o igual CF JBE/JNA Salta si es menor o igual o salta si no es mayor CF , AF

    Saltos con base en datos con signo Las instrucciones siguientes de salto condicional se aplican a datos con signo: Smbolo DESCRIPCION BANDERA EXAMINADA JE/JZ Salta si es igual o salta si es cero ZF JNE/JNZ Salta si no es igual o salta si no es cero ZF JG/JNLE Salta si es mayor o salta si no es menor o igual ZF , SF , OF JGE/JNL Salta si es mayor o igual o salta si no es menor SF, OF JL/JNGE Salta si es menor o salta si no es mayor o igual SF , OF JLE/JNG Salta si es menor o igual o salta si no es mayor ZF , SF , OF

    Los saltos para prueba de igual o cero (JE/JZ) y para la prueba de no igual o cero (JNE/JNZ) estn incluidos en las listas de datos sin signo y datos con signo, ya que una condicin de igual o cero ocurre sin importar la presencia de signo. Pruebas aritmticas especiales Las siguientes instrucciones de salto condicional tienen usos especiales: SMBOLO DESCRIPCION BANDERA PROBADA JS Salta si el signo es necesario SF JNS Salta si el signo es positivo SF JC Salta si hay acarreo (igual que JB) CF JNC Salta si no hay acarreo CF JOSalta si hay desbordamiento OF JNO Salta si no hay desbordamiento OF JP/JPE Salta si hay paridad o salta si la paridad es par PF JNP/JPO Salta si no hay paridad o salta si la paridad es impar PF

  • JC y JNC con frecuencia son usados para probar el xito de operaciones en disco. Otro salto condicional, JCXZ, prueba el contenido del registro CX contra cero. Esta instruccin no necesita ser colocada inmediatamente despus de una operacin aritmtica o de comparacin. Un uso de JCXZ podra ser al inicio de un ciclo, para asegurarse de que en realidad CX contiene un valor diferente de cerro. Como recordatorio note que un salto para datos sin signo es igual, superior o inferior, mientras que un salto para datos con signo es igual, mayor que o menor. Los saltos que prueban las banderas de acarreo, de desbordamiento y de paridad tienen propsitos nicos. El ensamblador traduce el cdigo simblico en cdigo objeto, sin importar qu instruccin utilice, pero, por ejemplo JAE y JGE aunque en apariencia son similares, no prueban las mismas banderas. El 80386 y posteriores permiten saltos condicionales lejanos. OPERACIONES BOOLEANAS La lgica es importante en el diseo de circuitos y tiene un paralelo en lgica de programacin. Las instrucciones para lgica boleana son AND, OR, XOR, TEST y NOT, que pueden usarse para poner bits en 0 o 1 y para manejar datos ASCII con propsitos aritmticos. El formato general para operaciones boleanas es: [etiqueta:] operacin {registro/memoria} , {registro/memoria/inmediato} El primer operando se refiere a un byte o palabra en un registro o memoria y es el nico valor que es cambiado. El segundo operando hace referencia y de acuerdo con esto establece las banderas CF, OF, PF, SF y ZF (AF est indefinido).

    AND. Si ambos bits comparados son 1, establece el resultado en 1. Las demas condiciones dan como resultado 0.

    OR. Si cualquiera (o ambos) de los bits comparados es 1, el resultado es 1. Si ambos bits estn en 0, el resultado es 0.

    XOR. Si uno de los bits comparados es 0 y el otro 1, el resultado es 1. Si ambos bits comparados son iguales (ambos 0 o ambos 1), el resultado es 0.

    TEST. Establece las banderas igual que lo hace AND, pero no cambia los bits de los operandos. La instruccin NOT. La instruccin NOT slo invierte los bits en un byte o palabra en un registro o memoria: esto es, convierte los ceros en unos y los unos en ceros. El formato general para NOT es : [etiqueta:] NOT {registro/memoria}

  • Las banderas no son afectadas. NOT no es lo mismo que NEG, que cambia un valor binario de positivo a negativo y viceversa, invirtiendo los bits y sumando 1.