Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Dialnet CuadernosDePracticasDeInformaticaIndustrial 267943 PDF
Dialnet CuadernosDePracticasDeInformaticaIndustrial 267943 PDF
DE
INFORMÁTICA INDUSTRIAL
MÓDULO 1:
ENUNCIADOS DE PRÁCTICAS DE
PROGRAMACIÓN EN ENSAMBLADOR
MATERIAL DIDÁCTICO
Ingenierías
nº 20
Francisco Javier Martínez de Pisón Ascacíbar
Joaquín Ordieres Meré
Manuel Castejón Limas
Francisco Javier de Cos Juez
Montserrat Gil Martínez
CUADERNOS DE PRÁCTICAS
DE
INFORMÁTICA INDUSTRIAL
MÓDULO 1:
ENUNCIADOS DE PRÁCTICAS DE
PROGRAMACIÓN EN ENSAMBLADOR
UNIVERSIDAD DE LA RIOJA
SERVICIO DE PUBLICACIONES
2001
Cuadernos de prácticas de informática industrial.
Módulo 1: enunciados de prácticas de programación en ensamblador
de Francisco Javier Martínez de Pisón Ascacíbar, Joaquín Ordieres Meré, Manuel Castejón Limas, Francisco Javier de
Cos Juez, Montserrat Gil Martínez (publicado por la Universidad de La Rioja) se encuentra bajo una Licencia
Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported.
Permisos que vayan más allá de lo cubierto por esta licencia pueden solicitarse a los titulares del copyright.
© Los autores
© Universidad de La Rioja, Servicio de Publicaciones, 2011
publicaciones.unirioja.es
E-mail: publicaciones@unirioja.es
ISBN: 978-84-694-0879-7
INTRODUCCIÓN
7
PRÁCTICA 1
1. MANEJO DE ENSAMBLADOR, LINKER Y DEBUGGER
1.1. COMPILACIÓN Y EJECUCIÓN PASO A PASO DE UN PROGRAMA EJEMPLO
Entender el funcionamiento del siguiente programa “PRACT1A.ASM”, ensamblarlo y
ejecutarlo paso a paso viendo como se modifican los registros y los flags:
11
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
que nos generará otro archivo con extensión OBJ: “Nombre.OBJ”. El comando “-zi” incluye
las etiquetas del código fuente para el depurador.
Usando “TLINK.EXE” se linkan (“une”) todos los OBJ que necesitemos (en este caso
sólo tenemos uno) y nos generará un ejecutable “.EXE”.
TLINK –v Nombre.OBJ
que nos generará un archivo “Nombre.exe”, que podemos ejecutar y comprobar. El comando
“-v” incluirá la tabla de contenidos con las etiquetas en el ejecutable.
Para depurar usaremos el programa “TD.EXE”.
Ejemplo:
EDIT PRACT1.ASM ;EDITAMOS PRACT1.ASM
12
PRÁCTICA 1. MANEJO DE ENSAMBLADOR, LINKADOR Y DEBUGGER
;PROGRAMA PRACT1B.ASM
;
;ESCRIBIR EN UNA POSICIÓN DE LA PANTALLA
;----------------------------------------
;
CR EQU 13 ;Retorno de carro
LF EQU 10 ;Salto de línea
POSX EQU 5 ;Posicion X (0 A 79)
POSY EQU 5 ;Posicion Y (0 A 24)
;
;--------------------------------------------------------
;
;Segmento de Datos
;---------
;
DATOS SEGMENT ;Comienzo segmento DATOS
TEXTO DB ‘ESTO ESTA ESCRITO EN LA POSICION (5,5)’,CR,LF
;TEXTO A IMPRIMIR
DB ‘$’ ;Delimitador de fin de texto
DATOS ENDS
;--------------------------------------------------------
;
;Segmento de Pila
;----------------
;
PILA SEGMENT STACK ;Comienzo segmento PILA
DB 128 DUP(‘PILA’) ;Inicialización PILA
PILA ENDS
;
;--------------------------------------------------------
;
;Segmento de Código
;------------------
;
CODIGO SEGMENT ;Comienzo segmento CODIGO
EJEMPLO1B PROC FAR
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
MOV AX,DATOS
MOV DS,AX
LEA DX,TEXTO
CALL ESCRIBIR ;SUBRUTINA DE ESCRIBIR TEXTO
13
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
RET ;RETORNA
EJEMPLO1B ENDP ;FIN DE PROCEDIMIENTO
; ##############################################
; # PROCEDIMIENTO POSICIONAR CURSOR ‘POSICION’ #
; ##############################################
; #################################################
; # PROCEDIMIENTO ESCRIBIR CARACTERES EN PANTALLA #
; #################################################
;
ESCRIBIR PROC ;PROCEDIMIENTO ‘ESCRIBIR’
PUSH AX ;GUARDA EN PILA AX
MOV AH,9 ;AH=9 FUN. NUM. 9 ‘SALIDA DE CARAC.’
INT 21H ;LLAMADA A INTERRUPCION DEL DOS, CON FUNCION 9
POP AX ;RECUPERA EL REGISTRO AX
RET ;RETORNAR
ESCRIBIR ENDP ;FIN DE PROCEDIMIENTO ESCRIBIR
CODIGO ENDS ;FIN DE SEGMENTO DE CODIGO
END EJEMPLO1B ;FIN DE PROGRAMA EJEMPLO
Figura 1-2. Programa que escribe una cadena de caracteres en una posición determinada.
14
PRÁCTICA 1. MANEJO DE ENSAMBLADOR, LINKADOR Y DEBUGGER
OPCIÓN 1
OPCIÓN 2
OPCIÓN 3
SALIR
10 caracteres
5 caracteres
15
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
16
PRÁCTICA 1. MANEJO DE ENSAMBLADOR, LINKADOR Y DEBUGGER
17
PRÁCTICA 2
2. USO DE MACROS
Una macro es una serie de funciones reunidas bajo un nombre y que tiene unos pará-
metros de salida y de entrada. El uso de la macro facilita el no tener que repetir la introduc-
ción de una serie de instrucciones que se repiten en diversas partes del programa. Usando la
macro, EL ENSAMBLADOR A LA HORA DE ENSAMBLAR, SUSTITUYE LA
PALABRA DE LA MACRO POR EL CÓDIGO DE ÉSTA EN TODOS LOS SITIOS
DONDE APARECE.
21
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
; CONSTANTES
TIEMP1 EQU 100
TIEMP2 EQU 1000
22
PRÁCTICA 2. USO DE MACROS
VENTY DB 5
DATOS ENDS
;
;---------------------------------------------------
;
;Segmento de Pila
;----------------
;
PILA SEGMENT STACK ;Comienzo segmento PILA
DB 128 DUP(‘PILA’) ;Inicialización PILA
PILA ENDS
;
;---------------------------------------------------
;
;Segmento de Código
;------------------
;
CODIGO SEGMENT ;Comienzo segmento CODIGO
EJEMPLO PROC FAR
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
MOV [VENTX],0
MOV [VENTY],5
IZQUIER:
CALL PONE_VENT
INC [VENTX]
CMP [VENTX],60
JNZ IZQUIER
DEREC:
CALL PONE_VENT
DEC [VENTX]
CMP [VENTX],0
JNZ DEREC
POP CX
DEC CX
CMP CX,00
JZ FIN2
JMP MOVER
23
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
; ################################################
; # PROCEDIMIENTO PONE LA VENTANA EN LA PANTALLA #
; ################################################
PONE_VENT PROC
PUSH BX
MOV BH,[VENTY]
PONTEXTO [VENTX],BH,TEXT1 ;PONE PRIMERA LINEA
INC BH
PONTEXTO [VENTX],BH,TEXT2 ;PONE SEGUNA LINEA
INC BH
PONTEXTO [VENTX],BH,TEXT3 ;PONE TERCERA LINEA
INC BH
PONTEXTO [VENTX],BH,TEXT4 ;PONE CUARTA LINEA
INC BH
PONTEXTO [VENTX],BH,TEXT5 ;PONE QUINTA LINEA
BUCLE TIEMP1,TIEMP2
POP BX
RET
PONE_VENT ENDP
; ##############################################
; # PROCEDIMIENTO POSICIONAR CURSOR ‘POSICION’ #
; ##############################################
; ##############################################
; # PROCEDIMIENTO ESCRIBIR CARACTERES CON BIOS #
; ##############################################
24
PRÁCTICA 2. USO DE MACROS
PUSH BX ;GUARDA BX
MOV BX,0 ;PAGINA 0
MOV AH,0EH ;FUNCION IMPRIMIR CARACTER DE LA BIOS
INT 10H ;LLAMADA A LA BIOS
POP BX
Figura 2-3. Programa ejemplo que dibuja una ventana y la desliza en pantalla de forma horizontal.
2.2. ENTRADA DE DATOS POR TECLADO. REALIZACIÓN DE UN INPUT MEDIANTE LAS FUNCIONES
DEL DOS.
;
;PROGRAMA EJEMPLO: EJEMPLO2B.ASM
;REALIZA UN INPUT EN PANTALLA MEDIANTE LA FUNCIÓN 0Ah del DOS
;---------------------------------------------------
CR EQU 13 ;Retorno de carro
LF EQU 10 ;Salto de línea
;
;###################################################
;
;Segmento de Datos
;-----------------
;
DATOS SEGMENT ;Comienzo segmento DATOS
CADENA DB 53 DUP(‘x’) ;DEFINE 50 CARACTERES DE ENTRADA + 3 NECESARIOS
DB ‘$’ ;PARA LA RUTINA INPUT DEL DOS
TEXTO1 DB ‘INTRODUCE CADENA:’,’$’
CAMBIF DB CR,LF,’$’
DATOS ENDS
;
;###################################################
;
;Segmento de Pila
;----------------
25
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
;
PILA SEGMENT STACK ;Comienzo segmento PILA
DB 128 DUP(‘PILA’) ;Inicialización PILA
PILA ENDS
;
; #######################################
; # MACRO REALIZA UN INPUT #
; #######################################
;-------------------------------------------------
;
; #######################################
; # PROCEDIMIENTO INICIAL #
; #######################################
;
;Segmento de Código
;------------------
;
CODIGO SEGMENT ;Comienzo segmento CODIGO
EJEMPLO PROC FAR
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
;
PUSH DS ;Guarda Segmento en pila (DS:AX dirección retorno)
SUB AX,AX ;Borrar registro AX=0
PUSH AX ;Guarda en Pila AX (IP=0)
;
MOV AX,DATOS ;AX=DATOS (SEGMENTO DE DIRECCION DATOS)
MOV DS,AX ;DS=AX
;
PRINT TEXTO1
INPUT CADENA,50 ;HACE UN INPUT EN CADENA
26
PRÁCTICA 2. USO DE MACROS
PRINT CAMBIF
PRINT CADENA+2 ;IMPRIME CADENA
PRINT CAMBIF
RET ;RETORNA
EJEMPLO ENDP ;FIN DE PROCEDIMIENTO
Figura 2-4. Programa ejemplo que realiza un INPUT mediante la función 0Ah del DOS.
2.3. PROGRAMAS PROPUESTOS PARA PROFUNDIZAR EN EL MANEJO DE LAS MACROS. USO DE INS-
TRUCCIONES BÁSICAS EN ENSAMBLADOR. REALIZACIÓN DE LA ENTRADA Y SALIDA DE DATOS.
27
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
Figura 2-6. Parámetros de entrada de una macro que dibuja una ventana con sus dimensiones definidas.
que dibuje una ventana de ANCH caracteres de ancho y ALTU caracteres de altura; en la posi-
ción X,Y; y con un texto centrado en la misma.
ANCH
ALTU
28
PRÁCTICA 3
3. MANEJO DEL TECLADO
3.1. FUNCIONES BIOS ASOCIADAS
Cada vez que se pulsa una tecla, se genera una interrupción Hardware (la interrupción
número 9) que ejecuta una rutina de interrupciones que se encarga de leer la tecla pulsada y
almacenarla en un buffer. Esta rutina almacena dos bytes: El primero es el código de la tecla
(ver Figura 3-3) y el segundo el código ASCII de ésta (si tiene).
Las funciones BIOS de uso de teclado, corresponden a la interrupción 16H de la BIOS y son:
• Función AH=00h: Lee del buffer de teclado los códigos asociados a una tecla o com-
binación de teclas y avanza el puntero del buffer al carácter siguiente. Si el buffer está
vacío, espera que se pulse una tecla. Devuelve:
En AH = Código de la tecla pulsada
En AL = Código ASCII del carácter.
• Función AH=01h: Devuelve el estado del buffer de teclado.
Si el buffer está vacío, ZF=1.
Si no está vacío:
ZF = 0
AH = Código de la tecla
AL = Código del carácter
31
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
Nota: Esta rutina no avanza el puntero de la tecla leída, de forma que si se pulsan
varias teclas, sólo nos devolverá el código de la primera tecla.
• Función AH=02h: Devuelve en AL el byte de estado del teclado (KB_FLAG). Esta
función nos permite conocer el estado de teclas especiales como el Bloqueo de
Mayúsculas, Insertar, Num-Lock, etc (ver la Figura 3-1).
Existen otras rutinas de lectura de teclado del DOS (interrupción 21h), que es conve-
niente conocer.
; #################################################################
; # TECLA: FUNCION QUE MIRA SI SE PULSA ESC #
; #################################################################
TECLA PROC
MOV AH,01 ; FUNCION 01H, MIRA ESTADO DEL BUFFER
INT 16H ; ¿VACIO? ZF=1 SI, ZF=0 NO
JZ SALTEC ; SI NO SE HA PULSADO TECLA SALTA A “SALTEC”
XOR AX,AX ; FUNCION AH=0
INT 16H ; COGE EL CARÁCTER PULSADO
CMP AH,01 ; ES LA TECLA ESCAPE?
JNE SALTEC ; SI NO ES LA TECLA “esc” SALTA A “SALTEC”
STC ; PON EL FLAG DE CARRY A UNO CF=1
RET ; VUELVE
SALTEC: CLC ; PON EL FLAG DE CARRY A CERO CF=0
RET ; VUELVE
TECLA ENDP
Figura 3-2. Programa que devuelve CF=1 si se pulsa la tecla ‘Escape’, en caso contrario devuelve CF=0.
32
PRÁCTICA 3. MANEJO DEL TECLADO
33
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
34
PRÁCTICA 3. MANEJO DEL TECLADO
Figura 3-4. Tarjeta con un microcontrolador donde es necesario convertir de ASCII a binario los números
introducidos (flecha 1) para poder operar con ellos y después los números de binario a ASCII para poder
visualizarlos en el display (flecha 2).
35
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
Vamos a ver dos métodos para convertir un número que tenemos almacenado en un regis-
tro a ASCII.
El primer método consiste en dividir por 10 elevado al número de dígitos máximo posible
del número a convertir y seguir con el resto dividiéndolo como se ve en la Figura 3-5. La ventaja
que tiene este método es que el cociente de la división nos va dando el dígito más significativo.
23076 10000
3076 2
3076 1000
076 3
076 100
76 0
76 10
6 7
Figura 3-5. División del número por 10000, 1000, 100, 10.
23076 10
6 2307
2307 10
7 230
230 10
0 23
23 10
3 2
36
PRÁCTICA 3. MANEJO DEL TECLADO
Una vez tenemos los números desempaquetados (es decir, cada dígito en un byte), le
sumamos a cada uno de ellos, antes de visualizarlo, el código ASCII del número “0” (valor 48)
para obtener su correspondiente código ASCII. Por ejemplo el código ASCII del número ‘3’ es
48+3=51.
Supongamos que tenemos el número 23076 formado por los códigos ASCII: “2”, “3”,
“0”, “7”, “6”. El algoritmo de conversión más práctico es el siguiente:
1. Inicializamos una variable donde vamos a almacenar el resultado. Ejemplo: SUMA=0.
2. Cogemos el primer dígito (en este caso el “2”). Ejemplo: VALOR= “2” = 50.
3. Multiplicamos SUMA por 10. Ejemplo: SUMA*10=0
4. Convertimos el dígito de ASCII a número desempaquetado restándole 48 (valor del
“0”). Ejemplo: VALOR-48=2
5. Se lo sumamos a la variable SUMA. Ejemplo: SUMA=SUMA+VALOR=2
6. Obtenemos el siguiente dígito y repetimos los pasos 3, 4 y 5; hasta que terminamos con
todos los dígitos. Es decir, multiplicamos SUMA por 10, (SUMA=20), cogemos el
segundo (“3”) le restamos 48 a su valor ASCII (51-48=3) y se lo sumamos a la varia-
ble SUMA (SUMA=20+3=23). Y así, con todos los dígitos...
Añadir al programa B.4 de la práctica anterior, el código necesario para que la ejecución
se pueda interrumpir cuando se pulse la tecla ‘ESC’.
37
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
Pista para calcular el tiempo: Se usará la interrupción 1Ah de la BIOS que incrementa
un contador 18.2 veces por segundo.
Figura 3-7. Manejo de la interrupción 1Ah de la BIOS para conteo del tiempo.
Realizar un programa que a medida que pulsemos teclas nos saque por pantalla en hexa-
decimal el código de la tecla pulsada, su código ASCII correspondiente (si lo tiene) y el carác-
ter ASCII (si lo tiene).
Menu
1.- Binario-Decimal
2.- Decimal-Binario
3.- Hexadecimal-Binario
4.- Binario-Hexadecimal
0.- Salir
De forma que si pulsamos el ‘1’ nos pedirá que le introduzcamos un número binario y
nos lo convertirá en decimal; si pulsamos el ‘2’ nos pedirá que le introduzcamos un número en
decimal y nos lo convertirán en binario; igualmente con las opciones ‘3’ y ‘4’.
38
PRÁCTICA 3. MANEJO DEL TECLADO
El programa nos pedirá que introduzcamos una dirección en hexadecimal, nos represen-
tará en pantalla el contenido de la memoria en esa dirección de dos formas: en Hexadecimal y
en ASCII (los símbolos que pueda).
Ejemplo:
39
PRÁCTICA 4
4. FUNCIONES EXTERNAS Y CREACIÓN DE LIBRERÍAS
4.1. PASO DE PARÁMETROS A UNA SUBRUTINA
El paso de argumentos (valores de entrada) a una función, lo podemos realizar de varias
formas. Los métodos más útiles son:
Ejemplo:
PUSH AX
MOV AX,0FF0h
CALL SUBRUTINA ;LA SUBRUTINA UTILIZA AX
POP AX
La desventaja mayor es que tenemos que saber qué registros utiliza la función pero, por
otro lado, es la más cómoda.
Ejemplo:
VALOR1: DW 0
—-
—-
MOV DX,0FF0h
MOV [VALOR1],DX
CALL SUBRUTINA
—-
—-
SUBRUTINA: MOV AX,[VALOR1]
43
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
Ejemplo:
PRINCIPAL:
PUSH AX ;PARÁMETRO1
PUSH BX ;PARÁMETRO2
PUSH CX ;PARÁMETRO3
CALL SUBRUTINA
POP CX ;SACAMOS LOS PARÁMETROS DE
POP BX ;LA PILA PARA DEJARLA COMO
POP AX ;ESTABA.
—-
—-
PUBLIC SUBRUTINA
SUBRUTINA: PROC FAR
PUSH BP ;GUARDA BP
MOV BP,SP ;BP=SP PUNTERO DE LA PILA
MOV DX,[BP+6] ;DX=PARAMETRO3
MOV AX,[BP+8] ;AX=PARÁMETRO2
MOV CX,[BP+10] ;CX=PARÁMETRO1
—-
POP BP
RET
La instrucción:
RET num
recupera de la pila la dirección de retorno, adelanta el puntero de pila (SP) num bytes y retor-
na. De esta forma podemos eliminar los ‘POP’ del programa principal. Veamos el ejemplo
anterior usando esta forma:
Ejemplo:
PRINCIPAL:
PUSH AX ;PARÁMETRO1
PUSH BX ;PARÁMETRO2
PUSH CX ;PARÁMETRO3
CALL SUBRUTINA
—- ;no hacemos POP AX, ni POP BX, ni POP CX
—-
—-
44
PRÁCTICA 4. FUNCIONES EXTERNAS Y CREACIÓN DE LIBRERÍAS
PUBLIC SUBRUTINA
SUBRUTINA: PROC FAR
PUSH BP ;GUARDA BP
MOV BP,SP ;BP=SP PUNTERO DE LA PILA
MOV DX,[BP+6] ;DX=PARAMETRO3
MOV AX,[BP+8] ;AX=PARÁMETRO2
MOV CX,[BP+10] ;CX=PARÁMETRO1
---
POP BP
RET 6 ;Recupera la dirección de retorno,
;adelanta la pila 6 bytes y retorna
Figura 4-5. Programa ejemplo donde se pasan los parámetros en la pila y se destruyen de ésta al salir del programa.
Podemos definir nuestras propias funciones, ensamblarlas por separado y después unir-
las mediante el “linkador” todas juntas. Cuando se realiza un programa de grandes dimensio-
nes es conveniente tener las funciones en “grupos de subrutinas”, cada grupo en un archivo
OBJ; de esta forma, si hay que modificar alguna función, solo hay que ensamblar el archivo
OBJ correspondiente a la misma.
El procedimiento de ensamblado y “linkado” es el siguiente.
1º. Se ensambla cada OBJ por separado. Por ejemplo:
TASM PRACT4A.ASM
TASM PRACT4B.ASM
2º. Se linkan los OBJs usando el operador ‘+’
TLINK PRACT4A.OBJ+PRACT4B.OBJ
Se generará un archivo “PRACT4A.EXE”.
A la hora de definir una función que se va a llamar desde una función de otro OBJ, se
define la primera con la Directiva PUBLIC.
45
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
;
EXTRN ESCRIBIR:FAR
CODIGO SEGMENT ;Comienzo segmento CODIGO
EJEMPLO PROC FAR
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
;
PUSH DS ;Guarda Segmento en pila (DS:AX dirección retorno)
SUB AX,AX ;Borrar registro AX=0
PUSH AX ;Guarda en Pila AX (IP=0)
;
MOV AX,DATOS ;AX=DATOS (SEGMENTO DE DIRECCION DATOS)
MOV DS,AX ;DS=AX
;
LEA DX,TEXTO1 ;DX=DESPLAZAMIENTO DE TEXTO1
PUSH DS ;GUARDAMOS DS
PUSH DX ;GUARDAMOS DX (PASAMOS EN PILA LA DIRECCIÓN
DEL TEXTO)
CALL ESCRIBIR ;SUBRUTINA (TIPO FAR) DE ESCRIBIR TEXTO1
RET ;RETORNA
EJEMPLO ENDP ;FIN DE PROCEDIMIENTO
CODIGO ENDS ;FIN DE SEGMENTO DE CÓDIGO
END EJEMPLO
POP BP ;RECUPERA BP
RET 4 ;RETORNAR
46
PRÁCTICA 4. FUNCIONES EXTERNAS Y CREACIÓN DE LIBRERÍAS
Realizar una función externa en “PRACT4D.ASM” que nos pida que le introduzcamos
por teclado una frase y la almacene en la dirección FAR que previamente le habrá sido intro-
ducida en la pila desde una función que la llama (incluida en “PRACT4C.ASM”).
47
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
Realizar una función que nos imprima en pantalla los números que le son introducidos
en la pila de la siguiente forma:
PUSH Num1
PUSH Num2
PUSH Num3
PUSH ---
PUSH NumN
PUSH Cantidad de Números Introducidos
CALL PONNUMEROS
POP ---
POP ---
POP ---
---
Realizar un programa que nos ordene mediante el método de la burbuja los números que
le son introducidos en la pila como en el programa D.2. Esta función nos devolverá en las mis-
mas posiciones de la pila los números ordenados. Se guardará en la librería “MI_LIB.LIB”.
Realizar un programa que tenga como parámetros de entrada (en la pila) el número de
filas y columnas de una matriz, devolviendo en la pila una dirección FAR que apunte a un buf-
fer lleno de ceros del tamaño de la matriz (de enteros).
Realizar una función que calcule el número primo número NUM que se le habrá pasado
en la pila y nos devuelva en la misma posición de la pila este número primo. Por ejemplo, si
se introduce en la pila un 1.000 nos encontrará el número primo 1000(empezando por el 1) y
nos lo devolverá en la pila en la misma posición.
48
PRÁCTICA 4. FUNCIONES EXTERNAS Y CREACIÓN DE LIBRERÍAS
Modificación= 49 Núm. 1º x 1
490 Núm. 2º x 10
5000 Núm. 3º x 100
50000 Núm. 4º x 1000
510000 Núm. 5º x 10000
+ 5100000 Núm. 6º x 100000
5665539
49
PRÁCTICA 5
5. USO DE INSTRUCCIONES DE MANEJO DE CADENAS
Escribir los programas siguientes, que utilizan las instrucciones de manejo de cadenas, y
comprender su funcionamiento.
DATOS SEGMENT
TEXTO DB 512 DUP (?)
CARAC DB ‘ ‘ , ‘,’ , ‘;’ , ‘.’ , ‘:’
DATOS ENDS
CODIGO SEGMENT
EJEMPLO PROC FAR
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATOS
MOV DS,AX
MOV [TEXTO],255
LEA DX,TEXTO
MOV AH,0Ah
INT 21h
XOR AX,AX
MOV AL,[TEXTO+1]
MOV DI,AX
MOV TEXTO[DI+2],’$’
PUSH DS
POP ES
LEA SI,TEXTO+2
LEA DI,TEXTO+256
BUC1: LODSB
CMP AL,’$’
JE FIN
53
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
PUSH DI
LEA DI,CARAC
MOV CX,5
REPNE SCASB
POP DI
JE BUC1
STOSB
JMP BUC1
MOV AH,0
MOV AL,3
INT 10H
LEA DX,TEXTO+256
MOV AH,09h
INT 21h
RET
EJEMPLO ENDP
CODIGO ENDS
END EJEMPLO
DATOS SEGMENT
TEXTO DB 256 DUP (?)
VOCAL DB ‘AaEeIiOoUu’
NUMVOCAL DW 0
TEXTO2 DB 13,10,13,10,’NUMERO DE VOCALES:$’
TEXTO3 DB 13,10,’$’
DATOS ENDS
CODIGO SEGMENT
EJEMPLO PROC FAR
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATOS
MOV DS,AX
MOV [TEXTO],253
LEA DX,TEXTO
54
PRÁCTICA 5. USO DE INSTRUCCIONES DE MANEJO DE CADENAS
MOV AH,0Ah
INT 21h
XOR AX,AX
MOV AL,[TEXTO+1]
MOV DI,AX
MOV TEXTO[DI+2],’$’
PUSH DS
POP ES
LEA SI,TEXTO+2
MOV CX,AX
CLD
BUC1: LODSB
PUSH CX
LEA DI,VOCAL
MOV CX,10
REPNE SCASB
JNZ BUC2
INC [NUMVOCAL]
BUC2: POP CX
LOOP BUC1
LEA DX,TEXTO2
MOV AH,09h
INT 21h
MOV AX,[NUMVOCAL]
MOV BL,10
DIV BL
ADD AX,3030H
MOV DX,AX
MOV AH,0EH
MOV AL,DL
MOV BH,0
MOV BL,47H
INT 10H
MOV AH,0EH
MOV AL,DH
MOV BH,0
MOV BL,47H
INT 10H
LEA DX,TEXTO3
MOV AH,09h
INT 21h
RET
EJEMPLO ENDP
CODIGO ENDS
END EJEMPLO
55
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
56
PRÁCTICA 5. USO DE INSTRUCCIONES DE MANEJO DE CADENAS
57
PRÁCTICA 6
6. LA PANTALLA EN MODO ALFANUMÉRICO
6.1. LA PANTALLA EN MODO ALFANUMÉRICO
MOV AH,00h
MOV AL,Modo ;Modo: AL=0 40x25, blanco y negro, alfanumérica.
; AL=1 40x25, color, alfanumérica.
; AL=2 80x25, blanco y negro, alfanumérica.
; AL=3 80x25, color, alfanumérica.
; AL=4 320x200, color, gráfica.
; AL=5 320x200, blanco y negro, gráfica.
; AL=6 640x200, blanco y negro, gráfica.
INT 10h
Figura 6-1. Organización de los dos bytes de cada dirección par de pantalla.
61
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
Tenemos por tanto 16 posibles colores (4 bits) para el carácter y 8 (3 bits) para el fondo.
Los colores que se obtienen son:
62
PRÁCTICA 6. LA PANTALLA EN MODO ALFANUMÉRICO
MOV AH,05h
MOV AL,Página
INT 10h
Figura 6-5. Uso de la función 05h de la BIOS para cambiar la página activa.
En la figura siguiente podemos ver el valor que hay que sumarle a la dirección B8000h
para acceder a cada página.
Figura 6-6. Direcciones de las cuatro páginas del modo texto de resolución 80x25.
63
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
ENDM
;
PILA SEGMENT STACK ;Comienzo segmento PILA
DB 128 DUP(‘PILA’) ;Inicialización PILA
PILA ENDS
;
MOV CX,23
VECES: PUSH CX
MOV CX,23
BUCLE: PUSH CX
MUEVE_FILA CX
POP CX
LOOP BUCLE
POP CX
PAUSA 300,20000
LOOP VECES
FINPROG: RET ;RETORNA
EJEMPLO ENDP ;FIN DE PROCEDIMIENTO
CODIGO ENDS ;FIN DE SEGMENTO DE CODIGO
END EJEMPLO ;FIN DE PROGRAMA EJEMPLO
; ######################################################
; USO DIRECTO DE LA MEMORIA DE PANTALLA EN MODO TEXTO
; ######################################################
; CONSTANTES Y VARIABLES
DIR_INICIAL EQU 0B800h ;SEGMENTO DE DIRECCIÓN DE PANTALLA
MODO EQU 3 ;MODO DE PANTALLA
X_IZQ EQU 0
Y_SUP EQU 0
X_DER EQU 30
64
PRÁCTICA 6. LA PANTALLA EN MODO ALFANUMÉRICO
Y_INF EQU 20
DATOS SEGMENT
TEXTO DB ‘ TEXTO A IMPRIMIR ‘
TEXTO2 DB ‘ ‘
FIL_TEXTO DB 0
COL_TEXTO DB 0
DATOS ENDS
PAUSA MACRO
LOCAL BUC,BUC2
MOV CX,10
BUC2: PUSH CX
MOV CX,0FFFFh
BUC: NOP
LOOP BUC
POP CX
LOOP BUC2
ENDM
;-------------------------------------------------
;
;Segmento de Pila
;----------------
;
PILA SEGMENT STACK ;Comienzo segmento PILA
DB 128 DUP(‘PILA’) ;Inicialización PILA
PILA ENDS
;
;-------------------------------------------------
;
;Segmento de Código
;------------------
;
CODIGO SEGMENT ;Comienzo segmento CODIGO
EJEMPLO PROC FAR
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
65
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
INC [FIL_TEXTO]
CMP [FIL_TEXTO],Y_INF
JL BAJA
CALL TECLA
JC FINPROG
INC [COL_TEXTO]
CMP [COL_TEXTO],X_DER
JL DERE
CALL TECLA
JC FINPROG
DEC [FIL_TEXTO]
CMP [FIL_TEXTO],Y_SUP
JG SUBE
CALL TECLA
JC FINPROG
DEC [COL_TEXTO]
CMP [COL_TEXTO],X_IZQ
JG IZQU
; #################################################################
; # TECLA: FUNCION QUE SALE AL DOS SI SE PULSA ESC #
; #################################################################
TECLA PROC
MOV AH,01
INT 16H
JZ SALTEC
XOR AX,AX
INT 16H
CMP AH,01
JNE SALTEC
STC
RET
SALTEC: CLC
RET
TECLA ENDP
66
PRÁCTICA 6. LA PANTALLA EN MODO ALFANUMÉRICO
; ###########################################################
; # P_TXT: FUNCION QUE LLAMA A PON_TEXTO #
; ###########################################################
P_TXT2 PROC
LEA BX,TEXTO2
JMP ETIQ1
P_TXT2 ENDP
P_TXT PROC
LEA BX,TEXTO ;DIRECCION TEXTO DS:BX
CALL PON_TEXTO
RET
P_TXT ENDP
; ###########################################################
; # PON_TEXTO: FUNCION QUE PONE DIRECTAMENTE UN #
; # TEXTO EN PANTALLA #
; # ENTRADAS: DL=COLUMNA #
; # DH=FILA #
; # DS:BX=TEXTO #
; # CL=NUMERO DE CARACTERES #
; # CH=ATRIBUTO #
; ###########################################################
PON_TEXTO PROC
CMP DL,80 ;SE MIRA SI ESTA DENTRO DE LAS COORDENADAS
JGE SALIDA ;DL=[0..79]
CMP DL,0 ;DH=[0..24]
JL SALIDA
CMP DH,25
JGE SALIDA
CMP DH,0
JL SALIDA
PUSH CX
PUSH DX
MOV AX,DIR_INICIAL
MOV ES,AX ;INICIALIZAMOS SEGMENTO DE DESTINO
POP DX
67
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
MOV DH,0
SHL DL,1 ;MULTIPLICA BL POR 2
ADD AX,DX
MOV DI,AX ;ES:DI ES EL DESTINO EN MEMORIA DE PANTALLA
POP CX
MOV AH,CH
MOV CH,0
PONCAD: MOV AL,[BX] ;MOVER UN BYTE DE LA CADENA DE CARACTERES
MOV ES:[DI],AL
INC DI
MOV ES:[DI],AH ;MOVER EL ATRIBUTO
INC DI ;INCREMENTA LA DIRECCION
INC BX
LOOP PONCAD ;BUCLE HASTA CX=0
SALIDA: RET
PON_TEXTO ENDP
CODIGO ENDS ;FIN DE SEGMENTO DE CODIGO
END EJEMPLO ;FIN DE PROGRAMA EJEMPLO
Figura 6-8. Programa “PRACT6B.ASM” que maneja directamente la memoria de video en modo texto.
Diseñar un programa que cambie los atributos de la pantalla (color de cada carácter): los
pares de color verde y los impares de color azul.
Realizar un programa que realice una OR EXCLUSIVA con 01010101b de todos los
caracteres de la pantalla.
68
PRÁCTICA 6. LA PANTALLA EN MODO ALFANUMÉRICO
Realizar una función que imprima directamente en la pantalla el texto enviándole los
siguientes datos en la pila:
1. El atributo del texto.
2. La coordenada X del texto.
3. La coordenada Y del texto.
4. La dirección del texto (SEGMENTO).
5. La dirección del texto (DESPLAZAMIENTO).
Realizar una función que realice un telón como el del programa F.4 de forma que se cie-
rre y se abra manteniendo el texto que tenía anteriormente. Para ello se realizará una copia de
toda la pantalla en otra página de la memoria de texto.
Realizar un programa que escriba en la esquina superior izquierda un smile sonriente :-),
si en la pantalla hay una palabra que ponga CONTENTO; o que ponga un smile triste :-(, si en
la pantalla hay una palabra que ponga TRISTE (pueden estar en mayúsculas o minúsculas).
Situar un cursor parpadeante en el centro de la pantalla (usando sólo los atributos) y que
se pueda mover con los cursores del teclado.
69
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
Realizar un programa que abra la pantalla desde el centro y desplace las columnas a
modo de telón.
70
PRÁCTICA 7
7. LAS INTERRUPCIONES HARDWARE. PROGRAMAS RESIDENTES
7.1. LAS INTERRUPCIONES HARDWARE
Una interrupción hardware ocurre habitualmente ante un evento externo que se ha pro-
ducido. Generalmente el ordenador tiene que realizar una determinada tarea cuando esto suce-
de: capturar o enviar una serie de datos, activar una serie de alarmas, etc.
En el programa ejemplo del punto siguiente se muestra un mecanismo muy utilizado de
captura de datos en un buffer cíclico con dos punteros: uno de escritura y otro de lectura. De
esta forma, a medida que se van produciendo interrupciones externas (en este caso la pulsación
de una tecla entre el “0” y el “9”), se van guardando los datos obtenidos.
Por otro lado, existe una función con el último dato al que apunta el puntero de lectura.
; Segmento DATOS
; ---------
; variables
; ---------
DATOS segment
ant_teclado_int equ this dword
ant_tec_ofs dw 0
ant_tec_seg dw 0
TEXTO_INICIO1 DB ‘ESCRIBE=TECLAS “0” AL “9” $’
TEXTO_INICIO2 DB ‘LEE=”ENTER”, SALIR=”ESC $’
;Segmento PILA
73
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
; -------------------
; segmento de código
; -------------------
codigo segment
assume cs:codigo, ds:DATOS, ss:PILA
;
; direccionar segmento interrupcs con es
;
instalar proc far
push ds
xor ax,ax
push ax
mov ax,DATOS
mov ds,ax ;INICIALIZAMOS ‘DS’ CON ‘DATOS’
74
PRÁCTICA 7. LAS INTERRUPCIONES HARDWARE. PROGRAMAS RESIDENTES
BUCF2: in al,60h
cmp al,1
jne BUCF
pop es
;DEJAMOS LA INT DE TECLADO COMO ESTABA ...
cli
mov di,09h*4
mov ax,[ant_tec_ofs] ; desplazamiento dir inicial
mov es:[di],ax
mov ax,[ant_tec_seg] ; segmento dir inicial
mov es:[di+2],ax
sti
ret
instalar endp
push ax
mov ax,’ ‘
call PONPUNTS ;Borramos los indicadores de los punteros
pop ax
mov di,[PUNT_LEC]
cmp di,[PUNT_ESC]
je NO_HAY_DATO ;SI P.LECTURA=P.ESCRITURA NO HAY DATO QUE DEVOLVER
75
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
;-------------------------------------------------------------------
;
; nueva rutina de interrupción de teclado
; ----------------------------------------
;
nue_teclado_int proc near
assume cs:codigo, ds:DATOS
cli
push ax ; salvar registros
push bx
push cx
push dx
push di
push si
push ds
push es
mov ax,40h
mov es,ax
mov bx,es:[1Ch] ;Cogemos el puntero de escritura de la BIOS
push es
push bx
in al,60h
cmp al,2h
76
PRÁCTICA 7. LAS INTERRUPCIONES HARDWARE. PROGRAMAS RESIDENTES
push ax
mov ax,’ ‘
call PONPUNTS ;Borramos los indicadores de los punteros
pop ax
mov di,[PUNT_ESC]
inc di
cmp di,50
jne NO_FINAL
mov di,0
NO_FINAL:
cmp di,[PUNT_LEC]
je NO_GUARDA ;MIRAMOS SI P.LECTURA=P.ESCRITURA NO GUARDA
NO_GUARDA:
lea si,BUFF_TEC ;IMPRIMIMOS LA LÖNEA EN PANTALLA
mov ax,pantalla
77
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
mov es,ax
mov di,160*10+(15*2) ;SEGUNDA LÍNEA CENTRADA
mov ah,47h ;ATRIBUTO=FONDO ROJO, TINTA BLANCA
BUC1: mov al,ds:[si]
cmp al,00
je salir
mov es:[di],ax
inc di
inc di
inc si
jmp BUC1
salir:
mov ax,’LW’
call PONPUNTS ;Ponemos los indicadores de los punteros
ret
proceso endp
;
;Ponemos la ‘L’ y la ‘E’ de los punteros de escritura y lectura
; o el espacio seg£n AL y AH
PONPUNTS proc
mov bx,pantalla
mov es,bx
mov di,160*9+(15*2)
mov bx,[PUNT_ESC]
shl bx,1 ;MULTIPLICAMOS POR DOS
mov es:[di+bx],al ;Pone el contenido de AL=’W’ o ‘ ‘
mov di,160*11+(15*2)
mov bx,[PUNT_LEC]
shl bx,1 ;MULTIPLICAMOS POR DOS
mov es:[di+bx],ah ;Pone el contenido de AL=’L’ o ‘ ‘
ret
PONPUNTS endp
;
codigo ends
end instalar
Antes de realizar los programas propuestos hay que tener en cuenta que si se cambia
una dirección de salto de una interrupción, antes de salir del programa hay que dejar la
antigua dirección que tenía. Esto es debido a que cuando salimos de un programa, éste se eli-
mina de la memoria de forma que, si no recuperamos la dirección antigua de la interrupción,
cuando se produzca ésta saltará a una zona de la memoria vacía, obteniéndose resultados ines-
perados (generalmente se colgará el ordenador).
78
PRÁCTICA 7. LAS INTERRUPCIONES HARDWARE. PROGRAMAS RESIDENTES
Cambiar la interrupción 00h Hardware (Error de división por cero), de forma que cuan-
do se realice una división incorrecta nos ponga en el centro de la pantalla en fondo rojo y par-
padeante “LA DIVISIÓN QUE HAS EFECTUADO ES INCORRECTA”.
NOTA: Cuando la CPU salta a esta interrupción, la dirección de retorno que almace-
na es la de la instrucción DIV (la que produce el error de división por cero), de forma que
si volvemos de la interrupción, volverá a ejecutarse la instrucción DIV generándola de
nuevo.
Cambiar la interrupción 03h (Breakpoint) para que salte a una rutina donde visualice el
contenido de todos los registros en hexadecimal y de los FLAGS cuando el procesador encuen-
tre la instrucción INT (código CCh).
Desviar la interrupción 1Ch para que salte a una rutina que incremente e imprima un con-
tador que vaya desde ‘00000000’ hasta ‘99999999’. Esta interrupción se activa 18.2 veces con
segundo.
;
;----------------------------------------------------------------------
;
; segmento principal
79
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
; ---------
;
codigo segment
assume cs:codigo
org 100h ; origen por ser fichero tipo COM
empezar:
jmp instalar ; bifurca a la rutina de inicialización
;
;--------------------------------------------------------------
;
; variables
; ---------
;
ant_teclado_int equ this dword
ant_tec_ofs dw 0
ant_tec_seg dw 0
;--------------------------------------------------------------
;
; nueva rutina de interrupción de teclado
; ----------------------------------------
;
nue_teclado_int proc near
assume cs:codigo
push ax ; salvar registros
push bx
push cx
push dx
push di
push si
push ds
push es
pushf ; salvar banderas
call ant_teclado_int ; llamada a la rutina de
in al,60h ; interrupción anterior
cmp al,19h
jne fin_nue ;MIRAMOS SI SE HA PULSADO LA ‘P’
mov ax,40h
mov es,ax
mov al,es:[17h] ;MIRAMOS SI SE HA PULSADO EL ‘ALT’
and al,00001111b
cmp al,00001000b
jne fin_nue
80
PRÁCTICA 7. LAS INTERRUPCIONES HARDWARE. PROGRAMAS RESIDENTES
81
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
; de interrupción de teclado
;
mov dx,offset instalar ; dx = última dirección + 1 respecto
; al segmento de la rutina de
; interrupción
int 27h ; terminar, pero quedar residente
instalar endp
;
;------------------------------------------------------------------------
;
codigo ends
end empezar
Figura 7-3. Fichero “.BAT” ejemplo que sirve para generar un archivo “.COM”.
• Cada vez que ejecutamos el programa de instalación, se instala en memoria (usar MEM
/D para ver los programas residentes en DOS), de forma que si hemos ejecutado 5 veces
el mismo programa tendremos 5 programas residentes en memoria que se llaman unos
a otros, debido a que el programa llama a la dirección anterior de la interrupción anti-
82
PRÁCTICA 7. LAS INTERRUPCIONES HARDWARE. PROGRAMAS RESIDENTES
gua. Para evitar esto, sería necesario detectar antes de instalar que el programa ya
está en memoria (se puede desviar la interrupción del multiplexor del DOS (int 2Fh)
para que nos devuelva un código que nos indique que ya está instalado y la dirección y
tamaño del programa para desinstalarlo).
• Otro punto a tener en cuenta es que cuando se produce el salto a un programa residente
pueden ocurrir en ese momento sucesos delicados como el acceso a disco o la ejecución
de una llamada al DOS (donde se usa tres pilas diferentes según la llamada que se haga).
Debido a esto, la llamada a una interrupción DOS desde una subrutina residente no
se hace a no ser que se detecte que no se está ejecutando ninguna función DOS en ese
momento. Si se produce un salto a la rutina residente y luego dentro de esta llamamos a
una función del DOS, esto producirá que se sobreescriban los valores de la pila que esta-
ba usando la función del DOS en el momento de producirse la interrupción, con lo que es
probable que el ordenador se “cuelgue” al retornar de la rutina de interrupciones.
Debido a estas circunstancias1 y algunas otras más, la creación de un programa residen-
te se puede complicar bastante más si se quiere llamar a funciones DOS desde el programa resi-
dente, detectar que no se está accediendo al disco en ese momento, etc.
Los ejercicios de ejemplo de esta práctica son más sencillos, buscándose fundamental-
mente el aspecto didáctico de la construcción y funcionamiento de programas residentes. No
se pretende entrar en profundidad en el diseño de programas residentes, sino que el alumno
entienda la utilidad que tiene el manejo de estos mecanismos.
Realizar un programa residente que, cuando se pulse la combinación de las teclas ‘ALT-
Q’, limpie la pantalla.
Realizar un programa residente que escriba en la esquina superior izquierda un smile son-
riente :-), si en la pantalla hay una palabra que ponga CONTENTO; o que ponga un smile triste :-(,
si en la pantalla hay una palabra que ponga TRISTE (pueden estar en mayúsculas o minúsculas).
Realizar una rutina residente que cada vez que la hora sea en punto nos sitúe ésta en pan-
talla, en la esquina superior derecha, poniéndonos el mensaje: ¡¡¡ ATENCIÓN !!! SON LAS
XX:00 Horas
1. En el libro titulado “PC INTERNO” se explica con detalle y con numerosos ejemplos la programación de progra-
mas residentes.
83
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
84
PRÁCTICA 8
8. LA PANTALLA EN MODO GRÁFICO
8.1. BREVE EXPLICACIÓN DEL MODO GRÁFICO A UTILIZAR EN ESTA PRÁCTICA
El programa ejemplo siguiente utiliza las funciones CALC_DIR para calcular la direc-
ción y posición correspondiente de un pixel cuyas coordenadas son (X_PUNTO, Y_PUNTO).
Por otro lado, la función PON_PUNTO sitúa el punto en pantalla.
Entender el funcionamiento del programa “PRACT8A.ASM”, el programa trabaja direc-
tamente con la memoria de vídeo en el modo 640x200 (CGA), situando un punto en pantalla
gráfica que se mueve por todo el borde de la pantalla.
; ########################################################
; PRACTICA NUMERO 8:USO DIRECTO DE LA MEMORIA DE PANTALLA
; EN MODO GRAFICO MODO CGA
; ########################################################
; CONSTANTES Y VARIABLES
DIR_INICIAL EQU 0B800h ;SEGMENTO DE DIRECCION DE PANTALLA
MODO EQU 6 ;MODO DE PANTALLA MÁXIMO CGA 640*200 B/N
X_IZQ EQU 0
Y_SUP EQU 0
X_DER EQU 639
Y_INF EQU 199
DATOS SEGMENT
X_PUNTO DW 0
87
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
Y_PUNTO DW 0
DATOS ENDS
PAUSA MACRO
LOCAL BUC,BUC2
MOV CX,1
BUC2: PUSH CX
MOV CX,0FFFFh
BUC: NOP
LOOP BUC
POP CX
LOOP BUC2
ENDM
;---------------------------------------------------
;
;Segmento de Pila
;----------------
;
PILA SEGMENT STACK ;Comienzo segmento PILA
DB 128 DUP(‘PILA’) ;Inicialización PILA
PILA ENDS
;
;Segmento de CÓDIGO
;------------------
;
CODIGO SEGMENT ;Comienzo segmento CODIGO
EJEMPLO PROC FAR
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
MOV AX,DATOS
MOV DS,AX ;INICIALIZAR DS
88
PRÁCTICA 8. LA PANTALLA EN MODO GRÁFICO
PAUSA
INC [Y_PUNTO]
CMP [Y_PUNTO],Y_INF
JL BAJA
MOV AH,0
INT 16h ;ESPERA A QUE SE PULSE UNA TECLA
; ###########################################################
; # PON_PUNTO: FUNCION QUE PONE UN PUNTO EN PANTALLA #
; ###########################################################
PON_PUNTO PROC
CALL CALC_DIR
MOV AX,DIR_INICIAL
MOV ES,AX
MOV AL,ES:[BX]
OR AL,CH
MOV ES:[BX],AL
RET
PON_PUNTO ENDP
; ############################################################
; # CALCULA DIRECCION EN PANTALLA SEGUN [X_PUNTO] [Y_PUNTO] #
; # DEVUELVE: #
; # BX=OFFSET DIRECCION #
; # CL=NUMERO BIT DE ESA POSICIÓN #
; # EMPEZANDO POR LA DERECHA #
; ############################################################
CALC_DIR PROC
XOR BX,BX ;BORRAMOS BX
MOV DX,80 ;BYTES POR FILA
89
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
MOV AX,[X_PUNTO]
AND AL,00000111b ;COGEMOS EL RESTO DE DIVIDIR POR 8
MOV CL,AL ;EN CL TENEMOS EL DESPLAZAMIENTO DEL PIXEL
RET
CALC_DIR ENDP
CODIGO ENDS ;FIN DE SEGMENTO DE CODIGO
END EJEMPLO ;FIN DE PROGRAMA EJEMPLO
GRAFICO DB 00000000b
DB 00011000b
DB 00100100b
DB 01000010b
DB 01000010b
DB 01000010b
DB 01111110b
DB 01000010b
DB 01000010b
DB 00000000b
Esta letra A se podrá desplazar de pixel en pixel mediante las teclas de cursor. Si se pulsa
la tecla “ESCAPE” se sale del programa, poniéndose la pantalla en modo texto antes de salir.
Realizar una función que dibuje una línea dados sus puntos inicial y final usando el algo-
ritmo de Bresenham (ver apéndice F del libro).
Dibujar una gráfica en pantalla con los ejes de ésta. La gráfica dibujará los datos cuales-
quiera de un array de 640 enteros.
90
PRÁCTICA 8. LA PANTALLA EN MODO GRÁFICO
La máscara sirve para hacer un AND con el fondo y después una OR con el gráfico; usan-
do la máscara podemos hacer que el objeto sea “transparente” donde queramos.
El gráfico se moverá en pantalla pixel a pixel, mediante el uso de los cursores.
La forma de operar es la siguiente:
1º Se coge el cuadrado del fondo de la pantalla donde vamos a poner el gráfico y se
almacena en memoria.
2º Se hace una AND de ese fondo con la máscara, queda en blanco los huecos de la más-
cara.
3º Hacemos una OR del gráfico con el resultado del punto 2, y se imprime en pantalla.
Quedará el gráfico superpuesto al fondo de la pantalla, viéndose el fondo a través de
las zonas transparentes del gráfico.
4º Para poner el gráfico en otra posición, primero se restaura el fondo original (almacena-
do en el punto 1º), y se empieza de nuevo desde el principio para esa nueva posición.
91
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
Realizar lo mismo que en el ejercicio H.6 para un sensor donde sólo tenemos los valores
de 10 puntos. Crear la tabla de los 1024 puntos, interpolando según estos 10 puntos.
Puntos:
0 Voltios 5º C
1 Voltio 10º C
2 Voltios 15º C
3 Voltios 25º C
4 Voltios 40º C
5 Voltios 55º C
6 Voltios 65º C
7 Voltios 85º C
8 Voltios 100º C
9 Voltios 130º C
10 Voltios 160º C
Dibujar en una gráfica en pantalla con sus ejes esta tabla. Modo Gráfico.
Dado un buffer de 200 bytes de datos cualesquiera, realizar el programa que dibuje a
modo de “Analizador Lógico” los bits de cada byte.
92
PRÁCTICA 8. LA PANTALLA EN MODO GRÁFICO
Figura 8-5. Ejemplo tipico de un programa que realiza la función de un analizador lógico.
Dibujar un cubo en tres dimensiones con líneas y girarlo en el espacio lo más suavemente
posible. Modo gráfico.
Realizar un programa que rellene de puntos cualquier figura cerrada, dado un punto de
inicio (típico comando de llenado (fill)).
93
PRÁCTICA 9
9. MANEJO DE FICHEROS
9.1. EL FILE HANDLE
A partir del DOS 2.0, el manejo de archivos es muy sencillo. Simplemente a cada archi-
vo abierto se le designa un número (File Handle), de forma que para escribir o leer le indica-
mos a la función correspondiente el Handle del fichero abierto.
Lo primero que hay que hacer para manejar un fichero es abrirlo o crearlo si no existe.
Para ello existen diferentes funciones, las más sencillas son:
Luego procedemos a situarnos en la posición que nos interese dentro del archivo (al prin-
cipio, al final, en una posición concreta, etc.)
El programa siguiente, abre un archivo de datos y si no existe lo crea. Se sitúa al final del
mismo y le añade información. Entender el funcionamiento del mismo.
97
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
;
;PROGRAMA EJEMPLO PRACT9A.ASM: ABRIR O CREAR UN ARCHIVO Y AÑADIRLE INFOR-
MACIÓN
;-----------------------------------------------
CR EQU 13 ;Retorno de carro
LF EQU 10 ;Salto de línea
;
;-----------------------------------------------
;
;Segmento de Datos
;-----------------
;
DATOS SEGMENT ;Comienzo segmento DATOS
ERROR1 DB ‘ERROR AL ABRIR EL ARCHIVO’,CR,LF,’$’
ERROR2 DB ‘ERROR AL CREAR EL ARCHIVO’,CR,LF,’$’
ERROR3 DB ‘ERROR AL INTENTAR GRABAR LOS DATOS EN EL ARCHIVO’,CR,LF,’$’
ERROR4 DB ‘ERROR AL CERRAR EL ARCHIVO’,CR,LF,’$’
ERROR5 DB ‘ERROR AL POSICIONARSE EN EL ARCHIVO’,CR,LF,’$’
MENSAJE_BIEN DB ‘SE HAN GRABADO BIEN LOS DATOS’,CR,LF,’$’
; ##################################################
; # ABRIMOS EL ARCHIVO, SI NO EXISTE SE CREA #
; ##################################################
98
PRÁCTICA 9. MANEJO DE FICHEROS
CMP AX,2
JE NO_EXISTE ;SALTA A NO_EXISTE
CMP AX,3
JE NO_EXISTE ;SALTA SI NO EXISTE EL DIRECTORIO O ARCHIVO
LEA DX,ERROR1
CALL ESCRIBIR
RET
NO_EXISTE:
MOV AH,3Ch ;FUNCION PARA CREAR EL ARCHIVO
MOV CX,0 ;ATRIBUTOS NORMALES
LEA DX,NAME_A ;NOMBRE DEL ARCHIVO A CREAR
INT 21h
LEA DX,ERROR2
CALL ESCRIBIR
RET
; ###########################################
; # NOS SITUAMOS AL FINAL DEL ARCHIVO #
; ###########################################
ABIERTO:
MOV [HANDLE],AX ;GUARDAMOS EL HANDLE DEL ARCHIVO
JNC POSIC
LEA DX,ERROR5
CALL ESCRIBIR
RET
; ###########################################
; # GUARDAMOS LOS DATOS EN EL ARCHIVO #
; ###########################################
99
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
LEA DX,ERROR3
CALL ESCRIBIR
RET
; #############################
; # CERRAMOS EL ARCHIVO #
; #############################
JNC SALIR
LEA DX,ERROR4
CALL ESCRIBIR
RET
SALIR:
LEA DX,MENSAJE_BIEN
CALL ESCRIBIR ;SUBRUTINA DE ESCRIBIR TEXTO
RET ;RETORNA
;
EJEMPLO ENDP ;FIN DE PROCEDIMIENTO
;
ESCRIBIR PROC ;PROCEDIMIENTO ‘ESCRIBIR’
PUSH AX ;GUARDA EN PILA AX
MOV AH,9 ;AH=9 FUNCION NUMERO 9 ‘SALIDA DE CARACTERES’
INT 21H ;LLAMADA A INTERRUPCION DEL DOS, CON FUNCION 9
POP AX ;RECUPERA EL REGISTRO AX
RET ;RETORNAR
ESCRIBIR ENDP ;FIN DE PROCEDIMIENTO ESCRIBIR
CODIGO ENDS ;FIN DE SEGMENTO DE CODIGO
END EJEMPLO ;FIN DE PROGRAMA EJEMPLO
100
PRÁCTICA 9. MANEJO DE FICHEROS
El programa ejemplo PRACT9B.ASM, busca todos los archivos del directorio indicado
y los escribe en pantalla junto con sus atributos. Entender el funcionamiento del programa.
;
;PROGRAMA EJEMPLO PRACT9B.ASM:
; ESCRIBIR EN PANTALLA LOS ARCHIVOS DEL DIRECTORIO INDICADO
;--------------------------------------------------
CR EQU 13 ;Retorno de carro
LF EQU 10 ;Salto de línea
;
;--------------------------------------------------
;
;Segmento de Datos
;-----------------
;
101
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
DATOS ENDS
;
;-----------------------------------------------------
;
;Segmento de Pila
;--------
;
PILA SEGMENT STACK ;Comienzo segmento PILA
DB 128 DUP(‘PILA’) ;Inicialización PILA
PILA ENDS
;
;----------------------------------------------------
;
;Segmento de C¢digo
;------------------
;
CODIGO SEGMENT ;Comienzo segmento CODIGO
EJEMPLO PROC FAR
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
;
PUSH DS ;Guarda Segmento en pila (DS:AX dirección retorno)
SUB AX,AX ;Borrar registro AX=0
PUSH AX ;Guarda en Pila AX (IP=0)
;
MOV AX,DATOS ;AX=DATOS (SEGMENTO DE DIRECCION DATOS)
MOV DS,AX ;DS=AX
; #################################################
; # INICIALIZAMOS LA DIRECCION DEL DTA #
; # DS:DX=DIRECCION #
; #################################################
LEA DX,ARCHIV_BUF ;DX=DIRECCION DEL BUFFER DE ARCHIVO
MOV AH,1Ah ;INTERRUPCION DE CAMBIAR DIRECCION
INT 21h
LEA BX,TEXTO
CALL ESCRIBIR0 ;PONE EN PANTALLA ‘BUSCANDO:’
LEA BX,BUSC
CALL ESCRIBIR0 ;PONE EN PANTALLA ARCHIVOS A BUSCAR
LEA BX,SALTOLIN
CALL ESCRIBIR0 ;SALTO DE LINEA
LEA BX,SALTOLIN
CALL ESCRIBIR0 ;SALTO DE LINEA
; #################################################
; # BUSCAMOS EL PRIMER ARCHIVO #
; #################################################
102
PRÁCTICA 9. MANEJO DE FICHEROS
103
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
SAL_PRINT: RET
Realizar un programa que nos abra un fichero cualquiera ‘.TXT’ y cuente el número de
vocales que hay, indicando al final de la cuenta cuántas vocales hay en A, E, I, O y U dentro
del archivo.
Realizar un programa que nos pida el NOMBRE (30 bytes), DIRECCION (28 bytes),
EDAD (3 bytes) y DNI (9 bytes) y grabe esta información en una archivo FICHAS.DAT.
Realizar un programa que nos pida el DNI y busque en el archivo del punto anterior
(FICHAS.DAT) la ficha correspondiente a ese DNI, y la presente en pantalla.
104
PRÁCTICA 9. MANEJO DE FICHEROS
Desarrollar un programa que nos busque una palabra cualquiera dentro de un archivo de
texto, devolviéndonos la distancia que hay desde el principio del archivo hasta la palabra
encontrada o dándonos un error si no la encuentra.
Realizar un programa, con las funciones anteriormente indicadas, que nos busque en todo
el disco duro un archivo que previamente le indicamos.
Realizar un programa que cuente en un disco duro cuántos archivos ocultos tiene y el
número de bytes total que ocupan.
Realizar un programa que busque en los archivos con extensión ‘.txt’ una cadena cual-
quiera previamente establecida y nos visualice en pantalla el nombre de todo archivo que la
tenga así como el número de línea en la qué está.
105
ÍNDICE
INTRODUCCIÓN ................................................................................................................................................................................................................................................................................................ 7
1. MANEJO DE ENSAMBLADOR, LINKER Y DEBUGGER ................................................................................................................................................... 11
1.1. COMPILACIÓN Y EJECUCIÓN PASO A PASO DE UN PROGRAMA EJEMPLO .............................................................................................................. 11
1.2. ENSAMBLADOR (TASM), LINKADOR (TLINK) Y DEPURADOR (TD) ............................................................................................................... 12
1.3. PROGRAMA EJEMPLO “PRACT1B.ASM”. SITÚA TEXTO EN UNA POSICIÓN DETERMINADA ............................................... 13
1.4. PROGRAMAS PROPUESTOS PARA PROFUNDIZAR EN EL MANEJO DEL COMPILADOR Y DEPURADOR.
USO DE INSTRUCCIONES BÁSICAS EN ENSAMBLADOR, MANEJO DE PANTALLA .......................................................................................... 15
1.4.1. Programa A.1 .............................................................................................................................................................................................................................................................. 15
1.4.2. Programa A.2 .............................................................................................................................................................................................................................................................. 15
1.4.3. Programa A.3 .............................................................................................................................................................................................................................................................. 15
1.4.4. Programa A.4 .............................................................................................................................................................................................................................................................. 15
1.4.5. Programa A.5 .............................................................................................................................................................................................................................................................. 15
1.4.6. Programa A.6 .............................................................................................................................................................................................................................................................. 15
1.4.7. Programa A.7 .............................................................................................................................................................................................................................................................. 16
1.4.8. Programa A.8 .............................................................................................................................................................................................................................................................. 16
1.4.9. Programa A.9 .............................................................................................................................................................................................................................................................. 16
1.4.10. Programa A.10 ...................................................................................................................................................................................................................................................... 16
107
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
3.4. PROGRAMAS PROPUESTOS PARA PROFUNDIZAR EN EL: MANEJO DEL TECLADO Y LA TRANSFORMACIÓN DE
NÚMEROS “BINARIO-ASCII” Y “ASCII-BINARIO” ..................................................................................................................................................................... 37
3.4.1. Programa C.1 ............................................................................................................................................................................................................................................................. 37
3.4.2. Programa C.2 ............................................................................................................................................................................................................................................................. 37
3.4.3. Programa C.3 ............................................................................................................................................................................................................................................................. 37
3.4.4. Programa C.4 ............................................................................................................................................................................................................................................................. 38
3.4.5. Programa C.5 ............................................................................................................................................................................................................................................................. 38
3.4.6. Programa C.6 ............................................................................................................................................................................................................................................................. 38
3.4.7. Programa C.7 ............................................................................................................................................................................................................................................................. 39
108
ÍNDICE
9. MANEJO DE FICHEROS............................................................................................................................................................................................................................................................ 97
9.1. EL FILE HANDLE............................................................................................................................................................................................................................................................................ 97
9.2. FORMA DE MANEJAR LOS FICHEROS..................................................................................................................................................................................................................... 97
9.3. PROGRAMA EJEMPLO PRACT9A.ASM. ABRIR UN ARCHIVO DE DATOS PARA AÑADIR INFORMACIÓN ................ 97
9.4. MANEJO DE DIRECTORIOS MEDIANTE FUNCIONES DEL DOS ............................................................................................................................................. 100
9.5. BÚSQUEDA DE ARCHIVOS O DIRECTORIOS ................................................................................................................................................................................................... 101
9.6. PROGRAMA EJEMPLO PRACT9B.ASM. SACA EN PANTALLA EL NOMBRE Y LOS ATRIBUTOS DE TODOS LOS
ARCHIVOS DEL DIRECTORIO ............................................................................................................................................................................................................................................. 101
109
CUADERNOS DE PRÁCTICAS DE INFORMÁTICA INDUSTRIAL
9.7. PROGRAMAS PROPUESTOS PARA EL APRENDIZAJE Y USO DE LAS FUNCIONES DE MANEJO DE ARCHIVOS ............. 104
9.7.1. Programa I.1 ................................................................................................................................................................................................................................................................ 104
9.7.2. Programa I.2 ................................................................................................................................................................................................................................................................ 104
9.7.3. Programa I.3 ................................................................................................................................................................................................................................................................ 104
9.7.4. Programa I.4 ................................................................................................................................................................................................................................................................ 105
9.7.5. Programa I.5 ................................................................................................................................................................................................................................................................ 105
9.7.6. Programa I.6 ................................................................................................................................................................................................................................................................ 105
9.7.7. Programa I.7 ................................................................................................................................................................................................................................................................ 105
110