Macro posicionado de cursor PAMCUR

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico) 1 Macro posicionado de cursor PAMCUR ;Macro para posicionar el cursor en l

0 downloads 85 Views 131KB Size

Recommend Stories


MACRO DE PAGO DE HABERES 5TA CATEGORIA
MACRO DE PAGO DE HABERES 5TA CATEGORIA Ingresar la cuenta de cargo con el siguiente formato: 0011: Código de Banco xxxx: Código de Oficina DC: Dígito

MICROTENDENCIAS QUE SE HACEN MACRO
microtendencias MICROTENDENCIAS QUE SE HACEN MACRO Los amos de casa LOS HISPANOS EN USA L Tan sólo entre el 2000 y el 2010 la población Hispana au

1era MACRO RUEDA DE NEGOCIOS ARGENTINA - BOLIVIA
MINISTERIO DE RELACIONES EXTERIORES COMERCIO INTERNACIONAL Y CULTO. BUENOS AIRES, 28 de septiembre de 2004 1era MACRO RUEDA DE NEGOCIOS ARGENTINA -

Story Transcript

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

1

Macro posicionado de cursor PAMCUR ;Macro para posicionar el cursor en la página que yo le indique, si la fila o columna indicadas están fuera de los límites se ignora, teniendo en cuenta que en modo alfanumérico tenemos un máximo de 80 (0-79) columna y 25 líneas (0 - 24). ;Para colocar el cursor en una posición de una página usaremos la interrupción 10h de la BIOS: Servicio posicionar cursor Entrada: AH = 02h DH = Fila. DL = Columna. ; Macro pamcur con tres parámetros de columna,fila y página PAMCUR MACRO columna,fila,pagina local fin ; defino la etiqueta fin como local ; salvo los registros afectados por esta macro, para preservar su valor ya que no se en que punto de los programas será llamada esta macro. push ax push bx push dx ; cargo el valor de la columna donde quiero colocar el cursor en el registro dl y me aseguro que su valor es mayor o igual que cero y menor o igual que 79 mov dl,columna cmp dl,0 jl fin cmp dl,79 jg fin ; cargo el valor de la fila donde quiero colocar el cursor en el registro dh y me aseguro que su valor es mayor o igual que cero y menor o igual que 24 mov dh,fila ; cargo la fila en dh cmp dh,0 ; me aseguro que esté dentro de los límites jl fin cmp dh,24 jg fin

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

2

; cargo el valor de la página donde quiero colocar el cursor en el registro bh y me aseguro que su valor es mayor o igual que cero y menor o igual que 7 mov bh,pagina cmp bh,0 jl fin cmp bh,7 jg fin ;Llamo al servicio correspondiente (ah=02h) de la interrupcion 10h para colocar el cursor en la fila, columna y página deseada. mov ah,02h int 10h ; Recupero los registros afectados por la macro para que queden tal y como estaban antes de entrar en ella fin:

pop dx pop bx pop ax endm

OBSERVAR: La etiqueta fin está definida como local para evitar problemas de múltiples destinos para un mismo salto. OBSERVAR: En esta macro se revisan los valores de los parámetros para asegurar que están dentro de los límites de fila, columna y página, si no es así, se sale de la macro sin posicionar el cursor

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

3

PROGRAMA CUADRO1 En este programa se pretende colocar una fila de * en un punto de la pantalla en modo alfanumérico usando el servicio 0eh de la interrupción 10h de la bios, este programa también se puede hacer de forma más sencilla con la interrupción del DOS 21h, o con el servicio 0Ah de INT 10h También colocaremos la pantalla en modo alfanumérico 80X25 con el servicio 00H de la INT 10h

;En este programa no necesito segmento de datos, así que defino directamente el segmento de código codigo segment para Assume cs:codigo,ss:pila

;Con la directiva include añado la macro pamcur para posicionar el cursor donde desee. include pamcur.asm

;comienzo del procedimiento cuadro1 cuadro1 proc far

; Para poner la pantalla en modo alfanumérico 80X25 usaremos el servicio 00H (AH = 00h) de la INT 10H de la BIOS, cargando en AL, el valor correspondiente a esta configuración (AL=02) mov ax,0002h int 10h

;llamo a la macro incluida en el programa para colocar el cursor en la columna 12, fila 12 y página 0, que es la página activa por defecto pamcurl 12,12,0

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

4

;Los “*” los escribiremos uno a uno repitiendo el mismo código, ya que el servicio 0eh de INT 10h actualiza la posición del cursor, para no repetir código usaremos un bucle LOOP, indicando en CX el número de veces que quiero que se ejecute el bucle. mov cx,000ah

;Este grupo de instrucciones se repetirá 10 veces ya que en el paso anterior cargamos cx con 000Ah, cada vez que se repita escribirá un asterisco en pantalla y actualizara la posición del cursor, el carácter a escribir, se escribirá en la página activa que por defecto será la cero. ;En AH indicamos el servicio que deseamos de la INT 10h, en AL el carácter a escribir. bucle:mov ah,0eh mov al,"*" int 10h loop bucle

; finalización del código mov ax,4c00h int 21h cuadro1 endp codigo ends ; segmento de pila pila segment stack para dw 512 dup (?) pila ends ; final del programa end cuadro1

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

PROGRAMA CUADRO2

Con este programa se pretende conseguir lo mismo que con el anterior pero usando el servicio 0Ah de la interrupción 10h de la BIOS

; Igual que en el programa anterior codigo segment para assume cs:codigo,ss:pila include pamcur.asm cuadro1 proc far mov ax,0002h int 10h pamcur 12,12,0

; ;En AH indicamos el servicio que deseamos de la INT 10h, en AL el carácter a escribir, en BH la página en la página en la que queremos escribir y en CL el número de caracteres a escribir mov ah,0ah mov al,"*" mov bh,0 mov cl,0ah int 10h

;Igual que en el programa anterior mov ax,4c00h int 21h cuadro1 endp codigo ends pila segment stack para dw 512 dup (?) pila ends end cuadro1

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

5

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

6

PROGRAMA CUADRO3

Con este programa se pretende conseguir lo mismo que con el anterior pero usando el servicio 09h de la interrupción 21h de la BIOS ; en el segmento de datos metemos lo 10 asteriscos y el carácter $ que finaliza la cadena que representa el servicio 09h de la int 21h datos segment asterisco db 10 dup ("*"),"$" datos ends

;igual que en el programa anterior codigo segment para assume cs:codigo,ss:pila include pamcur.asm cuadro1 proc far ;inicialización del segmento de datos mov ax,datos mov ds,ax ;igual que en los programas anteriores mov ax,0002h int 10h pamcur 12,12,0 ; para usar el servicio 09h (ah=09h) de la int 21h del DOS, debemos tener la dirección de la cadena de caracteres a representar en DS:DX, DS ya lo hemos cargado con la dirección donde comienza el segmento de datos, y para cargar DX con el offset donde comienza el texto a representar, usaremos la instrucción LEA, igualmente podíamos haber usado MOV DX, offset asterisco mov ah,09h lea dx,asterisco int 21h

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

;Igual que en el programa anterior mov ax,4c00h int 21h cuadro1 endp codigo ends pila segment stack para dw 512 dup (?) pila ends end cuadro1

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

7

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

8

PROGRAMA CUADRO4 ; El objetivo de este programa es crear un bucle que repita la fila de 10 asteriscos de los programas anteriores 10 veces en líneas consecutivas.

;igual que en el programa cuadro1 codigo segment para assume cs:codigo,ss:pila include pamcur.asm cuadro1 proc far mov ax,0002h int 10h ;vamos a indicar en Al el número de fila que pasaremos como parámetro a la macro pamcur, es decir, en vez de indicar el valor de fila cada vez que llamo a la macro, le indico que ese valor lo debe de tomar de AL mov al,04 ;Cargamos CX con el número de veces que quiero que se repita el bucle exterior mov cx,000ah ;Guardo en la pila los valores de AL y de BX con los valores correspondientes al bucle exterior ya que en el bucle interior necesito modificar su valor push ax buc2: push cx ;coloco el cursor en la columna 24, en la fila indicada por al y en la página 0 pamcur 24,al,0 ; igual que en el programa cuadro1 mov cx,000ah bucle:mov ah,0eh mov al,"*" int 10h loop bucle

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

9

;Al salir del bucle interior recupero los registros que había guardado antes de entrar, incremento al, para que el siguiente conjunto de “*” se escriban una línea mas abajo y vuelvo a buc2 mientras el valor recuperado de cx sea distinto a cero, este valor se decrementa cada vez que llego a la instrucción loop, así que lo tendremos que guardar en pila después de dicha instrucción pop cx pop ax inc al push ax loop buc2

;igual que en el programa cuadro1 mov ax,4c00h int 21h cuadro1 endp codigo ends pila segment stack para dw 512 dup (?) pila ends end cuadro1

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

10

Macro MACUADRO ; Crearemos una macro con el programa anterior, pudiendo elegir como parámetros, la fila y columna donde comienza el cuadro, la página en la que colocaré el cuadro, el número de caracteres por fila y columna y el carácter a representar ; defino la macro con el nombre cuadro, observar que puede ser diferente al nombre del fichero en el que está contenida “macuadro”, como parámetros de esta macro tenemos: ! Columna: Columna donde comienza el cuadro ! Línea: Línea donde comienza el cuadro ! Página: Página donde colocaremos el cuadro ! Caracteres: Nº de caracteres que vamos a colocar en cada línea del cuadro ! Repeticiones: Nº de filas del cuadro ! Texto: Es el carácter que se usará para dibujar el cuadro ! cuadro macro columna,linea,pagina,caracteres,repeticiones,texto ; defino las etiquetas como locales ya que la macro puede ser llamada varias veces y eso me provocaría problemas de duplicación de etiquetas local bucle,buc2 ; Guardamos los registro antes de empezar a trabajar en la macro, así nos aseguramos que al salir de ella se pueden recuperar a los valores que tenían al entrar push ax push bx push cx push dx ; igual al programa anterior colocando los nombres de los parámetros de las macros donde antes estaban los valores mov al,linea mov cx,repeticiones push ax buc2: push cx pamcur columna,al,pagina mov cx,caracteres bucle:mov ah,0eh mov al,texto int 10h loop bucle pop cx pop ax inc al push ax loop buc2

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

; Recuperación de los registros a la salida de la macro y fin de macro pop dx pop cx pop bx pop ax endm

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

11

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

12

PROGRAMA CUADRO6 ; Crear un programa que usando la macro anterior dibuje cuadros en diferentes posiciones de la pantalla ;comienzo del programa codigo segment para assume cs:codigo,ss:pila ;incluyo los ficheros donde se encuentran las macros que voy a usar, no confundir el nombre del fichero con el de la macro, en el caso del pamcur coinciden, pero esto no es obligatorio. ;También se podría haber hecho que las dos macro estuvieran en un mismo fichero, en ese caso sólo necesitaríamos una directiva include include pamcur.asm include macuadro.asm

;Comienzo del procedimiento e inicialización de la pantalla a modo alfanumérico 80X25 cuadro1 proc far mov ax,0002h int 10h ;Llamada a la macro que coloca los cuadros con los parámetros que hemos programado cuadro 10,10,0,12,8,31h cuadro 35,2,0,8,7,32h ;finalización del programa mov ax,4c00h int 21h cuadro1 endp codigo ends pila segment stack para dw 512 dup (?) pila ends end cuadro1

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

13

PROGRAMA CUADRO7 Basándonos en el programa anterior en este programa se colocarán varios cuadros en cada una de las 4 páginas existentes en el modo de video 80X25 alfanumérico, el programa mostrará 5 segundos cada una de las páginas y pasará a la siguiente, durante 1 minuto, al cabo del cual finalizará el programa. Para la temporización usaremos el servicio 2Ch de la interrupción 21h del DOS, que funciona de la siguiente forma: Servicio 2Ch (INT 21h): Descripción: Devuelve la hora del día programada en el PC. CH = Contiene la hora (0 a 23) CL = Contiene los minutos (0 a 59) DH = Contiene los segundos (0 a 59) DL = contiene las centésimas de segundo (0 a 99)

Inicialización del segmento de datos, los dos primeros bytes con el nombre “actual”, los usaremos para temporizar los cinco segundo que debe de permanecer cada una de las pantallas, y los dos último bytes, los usaremos para recordar a la hora que comenzó a ejecutarse el programa y para poder temporizar el final del mismo datos segment actual db 2 dup (?) horainicio db 2 dup (?) datos ends Comienzo del segmento de código e incluyo tres ficheros externos, pamcur y macuadro, están comentados y listados en programas anteriores, tiempo.asm se listará mas adelante y será el encargado de realizar las temporizaciones. codigo segment para assume cs:codigo,ss:pila include pamcur.asm INCLUDE macuadro.asm include tiempo.asm Apertura del procedimiento llamado colocación, la función principal de este procedimiento será la de colocar cuadros en las 4 páginas permitidas en formato 80X25 colocacion proc far mov ax,datos mov ds,ax

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

14

Memorizo la hora de comienzo de la ejecución del programa, en DS:[0002] los minutos y en DS:[0003] los segundos mov ax,2c00h int 21h mov DS:[0002],cl ; minutos mov ds:[0003],dh ; segundos

Colocamos el modo de video a 80X25 mov ax,0002h int 10h Colocamos la página 0 como activa y mediante la macro macuadro coloco dos cuadros mov ax,0500h int 10h ;Activar página 0 cuadro 10,10,0,8,9,"A" cuadro 20,20,0,10,5,"B"

Igual que el punto anterior para las páginas 1,2 y 3 mov ax,0501h int 10h ;Activar página 1 cuadro 5,5,1,6,4,"C" cuadro 13,15,1,8,10,"D" mov ax,0502h int 10h ;Activar página 2 cuadro 2,8,2,13,9,"E" cuadro 22,10,2,7,3,"F" mov ax,0503h int 10h ;Activar página 3 cuadro 8,2,3,9,13,"G" cuadro 20,12,3,3,7,"H" Hago un salto incondicional a la etiqueta “salto1” situada en otro procedimiento jmp salto1 colocacion endp

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

15

Abrimos el segundo procedimiento en el que se mostrarán temporizados los cuadros anteriormente colocados. mostrar proc far

Memorizo la hora actual en DS:[0000] = Minutos, DS:[0001] = segundos, para poder hacer las temporizaciones salto1: mov ax,2c00h int 21h mov DS:[0000],cl ; minutos mov ds:[0001],dh ; segundos

Mediante la directiva IRP , hago que las instrucciones colocadas entre IRP y ENDM se repita una vez para cada uno de los valores encerrados entre “”, sustituyendo esos valores en la etiqueta que hemos escrito después de irp, en este caso llamada “valor”, si hubiera etiquetas entre irp y endm, se podrían definir como locales irp valor, Con las tres instrucciones siguientes se activará en cada una de las repeticiones la pagina cuyo número venga indicado en valor mov ah,05h mov al,valor int 10h Llamada a la macro temporización que se encuentra en el fichero tiempo.asm, haremos, que el programa se quede dentro de esa macro el tiempo que quiero que se muestre cada pantalla temporizacion endm

Al llegar a este punto, se ha mostrado una vez cada una de las páginas, durante 5 segundos, con este salto hago que se repita el proceso. jmp salto1

Finalización del segundo procedimiento y del segmento de código mostrar endp codigo ends Segmento de pila pila segment stack para dw 512 dup (?) pila ends Finalizo el programa indicando cual es el procedimiento principal end colocacion 1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

16

MACRO Tiempo Fichero tiempo.asm que contiene la macro temporización Apertura de macro y definición de etiquetas locales. temporizacion macro local bucle,diferminut,fintiemp,nofin Guardo los registros antes de modificarlos push ax push bx push cx push dx

Leemos la hora del sistema para hacer las temporizaciones, en CL quedarán los minutos y en dh los segundos. *1 bucle:mov ax,2c00h int 21h En cl tenemos los minutos actuales, en dh los segundos actuales. En DS:[0002] el minuto en el que comenzó la ejecución del programa. En DS:[0003] los segundos en los que comenzó la ejecución del programa. Con estos datos, pretendo detectar haciendo las correspondientes comparaciones el momento en el que los minutos y segundos actuales son mayores a los de comienzo de la ejecución del programa, mientras no se cumpla esto, saltaremos a la etiqueta nofin, que comenzará la temporización de 5 segundos para activar cada pantalla, pero cuando se cumpla finalizaré el programa. cmp cl,ds:[0002] jna nofin cmp dh,ds:[0003] jna nofin mov ax,4c00h int 21h Antes de entrar en la macro teníamos memorizado en DS:[0000] los minutos, y en *1 estoy leyendo los minutos actuales que quedan memorizados en cl, en el caso de que cl y ds:[0000] sean iguales, deberé esperar a que los segundos actuales sean 5 unidades superiores a los que tenía antes de entrar en la macro, pero si los minutos han cambiado, a los segundo actuales les sumaré 60 = 3Ch para saber cuando han pasado los 5 segundos, por ello en estas dos instrucciones examino si han cambiado los minutos. nofin: cmp cl,DS:[0000] jne diferminut

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

17

En el caso de que no tengamos diferencia de minutos, compararemos los segundos antes de entrar en la macro, con los actuales restandolos y comparando la diferencia con 5, en el caso de que la comparación diga que el resultado es menor o igual volveremos a la etiqueta bucle haciendo que el programa quede dentro de esta macro, hasta que la diferencia sea mayor de 5, en cuyo caso saltaremos a la etiqueta fintiemp que finalizará la temporización sub dh,DS:[0001] cmp dh,05h jbe bucle jmp fintiemp En el caso de que han cambiado los minuto, sumaremos 60 segundos al valor actual de los segundo, para poder calcular cuando pasan los 5 segundos de la misma forma que antes. diferminut: add dh,3ch sub dh,ds:[0001] cmp dh,05h jbe bucle A esta etiqueta se llegará cuando se termine de temporizar 5 segundos de permanencia en una pantalla, para poder hacer la temporización la próxima vez que entremos en esta macro, cargaremos los minutos y segundos actuales en ds:[0000] y en ds:[0001] fintiemp: mov ax,2c00h int 21h mov DS:[0000],cl ; minutos mov ds:[0001],dh ; segundos

Recupero los registros tal y como estaban antes de entrar en la macro y salgo de la misma pop dx pop cx pop bx pop ax endm

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

18

Nota sobre cuadro7.asm En el programa cuadro 7 asm, el conjunto de instrucciones: Jmp salto1 Colocacion endp Mostrar proc far Se podría sustituir por Call mostrar Colocacion endp Mostrar proc near Y se podría usa ret desde el segundo procedimiento para finalizar el programa el el primero

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

19

PROGRAMA cabecera.asm Hacer un programa de título de un juego en la página 0 de una pantalla de 80X25

En el segmento de datos formamos la el título, en este caso se ha hecho desde edit del DOS con alt+219 y se han ido colocando cada una de las filas para que den la imagen de un texto datos segment

datos ends Abrimos el segmento de código, colocamos el assume, incluimos el fichero pamcur.asm donde tengo la macro pamcur para colocar el cursor en el sitio de la pantalla que se desee y abrimos el procedimiento pr1 codigo segment para assume cs:codigo,ds:datos,ss:pila include pamcur.asm pr1 proc far

Necesito inicializar el segmento de datos ya que lo voy a usar para mostrar el texto en pantalla. mov ax,datos mov ds,ax Resolución de la pantalla 80X25 color Alfanumérica mov ax,0003h int 10h

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

20

Cargamos en ah el valor 09h, porque es el servicio de int 21h que voy a usar para mostrar en pantalla. mov ah,09h

Con la directiva irp hago que se repitan las tres instrucciones que hay entre irp y endm una vez para cada uno de los valores especificados entre “” , sustituyendo ese valor en los lugares donde ponga la variable valor, es decir, sería como escribir 6 veces lo mismo cambiando el valor del número en los lugares donde pone la variable valor irp valor, Colocamos el cursor en diferentes líneas según se vaya a escribir el texto fila1, fila2 ...fila6 etc pamcur 20,valor,0 Cargamos en DX el offset sobre ds donde comienza fila1, fila2 ... fila6 etc lea dx,fila&valor int 21h endm Igual que lo anterior para el resto del texto fila7 ... fila13 irp valor, pamcur 5,valor+5,0 lea dx,fila&valor int 21h endm

Finalización del programa mov ax,4c00h int 21h pr1 endp codigo ends pila segment para stack dw 512 dup (?) pila ends end pr1

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

21

Programa MINAS.ASM En este programa se pretende preparar una pantalla con un casillero de 8 filas y 8 columna, dentro de él distribuir una minas y rodearlas de números indicando el numero de minas que hay alrededor (juego buscaminas de windows). Apertura del segmento de datos datos segment El texto mina será el que coloque como minas en el casillero, es decir, una M mayúscula. mina equ "M" Las columnas del casillero estarán nombradas por las letras A,B,C,D,E,F,G,H, cada una de estas letras corresponderá a una columna de la pantalla y esos valores de columnas los memorizo con los nombres de columna. A EQU 13H B EQU 17H C EQU 1bH D EQU 1fH E EQU 23H F EQU 27H G EQU 2bH H EQU 2fH La tabla columna está compuesta por los nombres de las columnas del casillero distribuidas de forma aleatoria, lo mismo ocurre con la tabla fila, en la que tenemos distribuidas de forma aleatoria los valores de las filas del casillero, esto lo usaremos más adelante en el segmento de código para elegir aleatoriamente un elemento de la tabla fila y otro de la de columna e ir de este modo colocando las minas en el casillero columna db A,D,E,C,F,G,B,H,F,B,H,G,A,C,B,A Fila

db 5H,09H,0DH,0BH,0FH,07H,13H,11H,0FH,09H,0FH,15H,0BH,07H,09H,13H

La tabla filatitulo la utilizaré para colocar el texto “A---B---C ...” en pantalla sobre el casillero y poder así saber el nombre de cada columna, el nombre de las filas lo programaré en el segmento de código. Las tablas contorno1 .... contorno4 son las correspondientes a los códigos ASCII para dibujar el casillero filatitulo db "A B C D E F G H","$" contorno1 db 201,3 dup (205),7 dup (203,3 dup(205)),187,"$" contorno2 db 204,3 dup (205),7 dup (206,3 dup(205)),185,"$" contorno3 db 200,3 dup (205),7 dup (202,3 dup(205)),188,"$" contorno4 db 9 dup (186," "),"$" Reservo 4 bytes del segmento de datos y cierro el segmento de datos posicion db 4 dup (?) datos ends Apertura del segmento de datos codigo segment para 1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

22

assume cs:codigo,ss:pila,ds:datos incluyo los ficheros pamcur.asm y macros2.asm, en el fichero pamcur.asm tengo la INCLUDE PAMCUR.ASM include macros2.asm Apertura del procedimiento principal en el dibujare el casillero e inicialización del segmento de datos preppantalla proc far mov ax,datos mov ds,ax Mediante el servicio 00h de la interrupción 10h de la BIOS, colocamos la resolución de pantalla en 80X25 color Alfanumérica. mov ax,0003h int 10h Mediante la macro pamcur colocaremos el cursor en la línea 05, columna 13 y página 0 de la pantalla para escribir el texto guardado en la tabla filatitulo, esta tabla la escribo usando el servicio 09h de la interrupción 21h pamcur 13h,05h,00h lea dx,filatitulo mov ah,09h int 21h

Las siguientes 15 instrucciones realizan la tarea de colocar números a la izquierda del casillero que dibujaré mas tarde como títulos para esas líneas, inicialmente cargamos “AL” con el valor 31h que es el código ASCII correspondiente al número 1. mov al,31h Cargo “DH” con 07 que será el número de la primera fila, es decir, donde quiero escribir el número 1, par el resto de números se deberá de ir incrementando este valor. mov dh,07h Cargo “AH” con 02 que será el número de servicio que usaré para recolocar el cursor cada vez que quiera un número. salto: mov ah,02h Cargo “DL” con 10h que será el número de columna de pantalla común para escribir todos los números del 0 al 8, estos irán todos en la misma columna pero diferente fila. mov dl,10h Cargo en “BH” el número de página donde voy a escribir el número mov bh,00h

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

23

Con los registros ya cargador para colocar el cursor en la posición de pantalla deseada, llamo a la interrupción 10h de la BIOS que coloca el cursor en esa posición. int 10h Una vez colocado el cursor en la posición de pantalla que deseo, debo escribir el número de línea del casillero en esa posición, para ello utilizo el servicio “0Ah” de la interrupción 10h, indicando en “BH” el número de página donde quiero escribir y en “CX” el número de veces que quiero escribir, antes hemos cargado en AL el valor ASCII del carácter que queremos mostrar, con estos registros el servicio 09h de la interrupción 10h nos muestra el dato en pantalla mov ah,0ah mov bh,00h mov cx,0001h int 10h Con lo anterior hemos colocado el número 1 (Código ASCII = 31h) en la línea 07 de la pantalla, el numero de línea lo tenía en “DH” y el código ASCII en “AL”, si incrementamos “DH” en dos unidades y “AL” en una unidad, y volvemos a la etiqueta salto, escribiremos “2” en la línea 09h, esto lo repito hasta que AL alcance el valor 39h = “9”, en ese momento dejaremos de saltar a la etiqueta “salto” inc dh inc dh inc al cmp al,39h jne salto Coloco el cursor en la columna 11, fila 06 y página 0 para comenzar a dibujar el casillero pamcur 11h,06h,00h

Con el servicio 09h de la interrupción 21h, dibujo la primera línea del contorno

mov dx,offset contorno1 MOV AH,09H INT 21H

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

24

La parte de código entre irp y endm se repite una vez para cada valor encerrado entre los símbolos “”, sustituyendo ese valor en la variable ue sigue a irp, en este caso fila, en este caso sirve para dibujar las líneas internas del casillero, no la superior ni la inferior, sólo las internas. Con este irp dibujo la tabla contorno2 en las líneas 8,0a,...etc usando el servicio 09h de la interrupcion 21h del DOS.

irp fila, pamcur 11h,fila,00h mov dx,offset contorno2 mov ah,09h int 21h endm

Con las siguientes cuatro instrucciones se dibuja la última línea del casillero en la columna 11, fila 16 y página 0, usando el servicio 09h de la interrupción 21h

pamcur 11h,16h,00h lea dx,contorno3 mov ah,09h int 21h

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

25

Para finalizar el casillero sólo falta colocar el dibujo que se muestra con barras verticales, estas barras hay que colocarlas a partir de la línea 07 hasta la 15 saltando líneas de 2 en 2, es decir, lo tengo que colocar en las líneas 7,9,B,D,F,11,13 y 15, estas barras están también en una tabla del segmento de datos con el nombre contorno4

Vamos a usar el registro bl para indicar en que línea se debe escribir la tabla contorno4, su valor inicial será de 07h ya que es la primera línea donde debemos escribir esta tabla, luego haré un bucle para ir aumentando este valor de 2 en 2 e ir colocando la tabla contorno4 en todas las posiciones necesarias mov bl,07h Coloco el cursor en la página 0, columna 0 y fila indicada en “BL” que en principio será 07h e ira aumentando de 2 en 2 cada vez que se ejecute el bucle salto2. salto2: pamcur 11h,bl,00h Una vez colocado el cursor en cada una de las posiciones, llamo al servicio 09h de la interrupción 21h de DOS para colocar en pantalla la tabla contorno4 lea dx,contorno4 mov ah,09h int 21h Una vez colocada la tabla en una fila, aumento “BL” en dos unidades para colocar contorno4, esto lo haremos mientras ese valor de “BL” no sea igual “JNE” a 17h, si es igual a este valor, saldré del bucle add bl,02h cmp bl,17h jne salto2 Llamada al procedimiento colocaminas en el que realizaré la colocación de las “M” indicando el lugar donde tengo minas call colocaminas Llamada a la macro colocanumeros en la que rellenaré las casillas que rodean las minas con el número de minas que tienen alrededor call colocanumeros Coloco el cursor en la página, fila y columna cero y finalizo el programa pamcur 0,0,0 mov ax,4c00h int 21h Fin del procedimiento preppantalla preppantalla endp

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

26

Comienzo del procedimiento colocaminas (es NEAR para poder saltar a él desde un procedimiento de este mismo segmento de código) en el que colocaremos las minas en el casillero, esta colocación la haremos de la siguiente manera: leeremos la hora del sistema con el servicio 2Ch de la interrupción 21h del DOS, al usar esta interrupción, nos devuelve entre otras cosas en ”DH” los segundos (en hexadecimal) y separaremos las unidades de segundo y las décimas de segundo, el número de las unidades de segundo lo tomaremos como offset sobre la tabla columna para saber en que columna se debe de colocar la primera mina, y las decenas de segundo las tomaremos como offset sobre la tabla fila para saber en que fila debemos de colocar esa primera mina, el resto de minas se colocarán aumentando ambos valores de offset. colocaminas proc near La posición de memoria ds:[posicion+2] la voy a usar para controlar el numero de minas que coloco en pantalla, por ello en principio me interesa que esté a cero mov ds:[posicion+2],00h Leemos la hora del sistema con el servicio 2Ch de la interrupción 21h, con esta interrupción quedará: CH = Hora, CL = Minutos, DH = Segundos, DL= centésimas de segundo. mov ax,2c00h int 21h Guardamos el dato de los segundos leídos en DX en la pila. Esto lo hago porque para separar las unidades y las decenas de segundo voy a modificar el registro DH que es donde tengo los segundos leídos con la interrupción anterior, y si primero leo las unidades modificando DH, luego debo recuperar los segundos completos de la pila para separar las decenas. otra2: push dx Para que en el registro DH sólo me queden las unidades de segundo hago la operación AND entre el registro DH y el valor inmediato 0Fh, ese valor obtenido lo guardo en el segmento de datos con el offset indicado en la tabla posición and dh,0fh mov ds:[posicion],dh Leo el dato de la tabla columna del segmento de datos con el offset DH que son las unidades de segundo y ese valor leído me lo llevo a CL, porque luego voy a leer de la otra tabla y el resultado de la lectura irá también a AL lea bx,columna mov al,dh xlat columna mov cl,al

Recupero el valor de DX que tenía e la pila ya que ahora quiero recoger de ese valor la cantidad de decenas de segundo que he leído al leer la hora. pop dx

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

27

Del valor completo de los segundos me interesan sólo las decenas, para hacer esta separación, hago la operación AND de los segundos con el valor F0h, es decir, que si había leído 15 segundos, el registro DH después de la operación AND quedará cargado con 10, y lo que me interesa entosces es recoger el dato que ocupa la posición 1 en la tabla fila, para ello debo convertir el 10 en 01, esto lo hago desplazando los bits de del número hexadecimal 10 4 veces a la derecha y ese valor también lo almaceno en el segmento de datos con desplazamiento posición + 1, el dato leido de la tabla fila con la instrucción XLAT queda almacenado en AL and dh,0f0h lea bx,fila mov al,dh shr al,01h shr al,01h shr al,01h shr al,01h mov ds:[posicion+1],al xlat fila Llegado este punto del programa, tendremos en cl la columna donde quiero colocar la mina y en al la fila, así que colocaremos el cursor en esa posición de la página cero. pamcur cl,al,00h Con el servicio 0Ah de la interrupción 10h coloco una M mayúscula en esa posición del casillero. mov bh,00h mov al,mina mov cx,0001h mov ah,0ah int 10h saltos para evitar error de salto largo jmp otra3 otramina: jmp otra2 En ds:[posicion] tengo el valor del offset de la tabla columna de la que he recogido el valor de la columna donde colocar la mina anterior, para la siguiente mina debo aumentar este valor en una unidad para coger el siguiente valor, pero antes me debo asegurar que el valor recogido no era el último, para ello comparo ds:[posicion] con 0Fh ya que dicha tabla tiene 0F elementos, si es igual a 0F, pongo esa posición de memoria a cero y así la siguiente mina sera colocada en la columna que ocupa la posición 1 de la tabla. otra3: cmp ds:[posicion],0fh jne pepe mov ds:[posicion],00h

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

28

Esta parte es igual que la anterior pero para la tabla fila pepe: cmp ds:[posicion+1],0fh jne luis mov ds:[posicion+1],00h Incremento los datos que tengo en ds:[posicion] y en ds:[posicion + 1], que son respectivamente los offset de los datos recogidos de las tablas columna y fila, para de esta forma recoger los siguientes. luis: inc ds:[posicion] inc ds:[posicion+1] El objetivo del siguiente conjunto de instrucciones es almacenar en DH los mismos segundos en los que me he basado para colocar la mina anterior pero aumentadas la unidades en uno y las decenas en uno, tenemos esas cifras en DS:[0000] = las unidades y en DS:[0001] las decenas. Debo mover el contenido de DS:[posicion+1] = decenas cuatro bits a la izquierda, es decir convertir por ejemplo un 2 en un 20. mov cx,0004 shl [posicion+1],cl Para realizar la operación usaré la posición de memoria DS:[posicion+3] y cuando tenga el dato ya preparado lo llevaré a DH, antes de empezar a preparar el dato me aseguro que DS:[0003] está vacía mov ds:[posicion+3],00h Copiamos el dato de las unidades de segundo de DS:[0000] a DS:[0003], pero para ello tengo que usar un registro intermedio con dos mov o como en este caso con un mov y un OR mov al,ds:[posicion] or ds:[posicion+3],al Y de la misma forma copio las decenas, en este caso el segundo tendrá que ser una instrucción OR, ya que sino me borraría las unidades mov al,ds:[posicion+1] or ds:[posicion+3],al Como el dato que quería conseguir ya lo tengo en DS:[0003], lo llevo a DH mov dh,ds:[posicion+3] incremento el dato almacenado en ds:[posicion]+2 que es el contador de minas colocadas, cuando este contador llegue a 0Fh terminaré el procedimiento volviendo al procedimiento desde el que vine utilizando Call, para hacer esto uso la instrucción RET, en caso contrario volverá hacia arriba a la etiqueta otramina para colocar otra mina. inc ds:[posicion+2] cmp ds:[posicion+2],0fh jne otramina ret Finalización del procedimiento colocaminas colocaminas ENDP

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

29

Comienzo del procedimiento colocanumeros en el que colocaremos en cada casilla que no tenga mina dentro el número de minas que tiene en las casillas adyacentes, para ello voy a ir casilla por casilla leyendo su contenido y en el caso de que sea diferente a “M” es decir que no tenga nada haré la cuante de las minas cercanas colocanumeros proc near para ir casilla por casilla viendo si tiene mina o no, empiezo por la casilla “A1” , es decir la fila 07 y la columna 13h de la página cero que es donde tengo el casillero. mov cl,13h ;primera columna mov ch,07h ;primera fila coloco el cursor en la fila y columna indicadas en ch y cl y con el servicio 08h de la interrupción 10h leo el contenido de esa posición de la pantalla en la página BH = 00h otraposicion: pamcur cl,ch,00h mov ah,08h mov bh,00h int 10h Comparo el dato leído con el texto M, en el caso de que no coincida llamaré a la macro scanceldas que contará las minas de las casillas adyacentes, pero si coincide, no entraré en esta macro. cmp al,"M" je otracelda2 Llamado a la macro que cuenta cuantas minas hay alrededor de una casilla vacía y escribe el número en dicha casilla scanceldas

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

30

Una vez llegado a este punto, debemos posicionar el cursor en la siguiente celda que quiero estudiar si tiene o no mina y en su caso rellenar el número, , para ir a la siguiente casilla en principio miro si el valor de CL (columna de la última celda chequeada) es igual a 2Fh, ya que en ese caso corresponde a la columna “H”, y la siguiente celda que debería mirar sería la de la columna 13h (“A”) pero de la siguiente fila a no ser que la fila chequeada sea la 15h (última), en cuyo caso ya he terminado de mirar todas las celdas. Primero comparo la columna con 2Fh, si no es igual salto a la etiqueta otracolumna en la que sumaré 4 a la columna actual para pasar a la siguiente columna del casillero, y sin tocar la fila volveré a la etiqueta otraposición para chequear la siguiente celda de esa misma fila pero una columna a la derecha. Si la comparación dice que CL = 2Fh, pongo CL = 13h indicando que voy a chequear la primera columna de la siguiente fila, pero antes me debo asegurar que no he chequeado ya todas las filas comparando CH con 15h, si no he mirado todas las filas, salto a la etiqueta otrafila en la que aumento CL en dos unidades para empezar con la siguiente fila y primera columna, saltando a la etiqueta otraposicion . En el caso de haber chequeado todas las filas y columnas, ejecuto la instrucción Ret que me hace volver al procedimiento preppantalla. otracelda: cmp cl,2fh jne otracolumna mov cl,13h cmp ch,15h jne otrafila ret otracolumna: add cl,04h jmp otraposicion otrafila: add ch,02h jmp otraposicion Finalización del procedimiento colocanumeros y del segmento de código colocanumeros endp codigo ends Segmento de pila y finalización del programa indicando el nombre del procedimiento principal pila segment para stack dw 512 dup (?) pila ends end preppantalla

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

31

PROGRAMA MACROS2.ASM En este fichero guardo la macro macros2.asm que utilizo en el programa minas.asm, esta macro la utilizo para rellenar las casillas donde no hay minas con el número de minas que tiene esa casilla alrededor. Comienzo de la macro, se puede observar que no tiene parámetros, por el programa minas.asm, en esta macro sólo se entrará al ir celda por celda leyendo su contenido y en el caso de que en la posición actual del cursor no exista una “M” scanceldas macro Antes de empezar con la macro, guardo el contenido de los registros en la pila, estos registros los recuperaré antes de salir, así me aseguro que al salir los dejo tal y como estaban antes de entrar push ax push bx push cx push dx Con el servicio 03h de la interrupción 10h, le indico que lea la posición actual del cursor en la página que yo le digo en BH, al ejecutarse este servicio quedará en DH la fila en la que se encuentra el cursor y en DL la columna. mov ah,03h mov bh,00h int 10h El registro CL lo voy a utilizar como contador de minas que hay alrededor de la casilla actual, por ello en principio me interesa que este a cero. mov cl,00h Para contar las minas adyacentes a la posición actual del cursor, debo variar la posición actual del cursor a las otras casillas y leer su contenido, pero para no perder la posición actual en la que quiero rellenar el número, guardo DX en la pila push dx Coloco el cursor en la celda que está encima a la derecha de la casilla que quiero rellenar sub dl,04h sub dh,02h pamcur dl,dh,00h Con el servicio 08h de la interrupción 10h leo el contenido de la casilla en la que acabo de poner el cursor, como BH ya estaba a cero, no hace falta que lo vuelva a poner, el resultado de la lectura quedará en AL el código ASCII del carácter leído y en AH su atributo mov ah,08h int 10h

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

32

Comparo el carácter leído con “M”, si es igual no salta aún a la etiqueta scanarriba e incrementa el contador CL colocándolo a 1 y entonces es cuando salta a la etiqueta scanarriba donde seguiré escaneando las celdas adyacentes cmp al,"M" jne scanarriba inc cl jmp scanarriba Salto intermedio para corregir error de salto largo otracelda2: jmp otracelda Recupero el registro DX de la pila en el que tengo guardada la fila y columna de la casilla que quiero rellenar con el número de minas que le rodean, también lo vuelvo a guardar para poder volver a acceder a él en el caso de que lo necesite scanarriba: pop dx push dx Igual que antes examino la celda que está encima de la que quiero rellenar y en el caso de que tenga una mina incremento CL sub dh,02h pamcur dl,dh,00h mov ah,08h int 10h cmp al,"M" jne scanarrder inc cl Igual que los pasos anteriores para la celda que está encima a la derecha. scanarrder: pop dx push dx add dl,04h sub dh,02h pamcur dl,dh,00h mov ah,08h int 10h cmp al,"M" jne scanizda inc cl

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

Igual que los pasos anteriores para la celda que está a la izquierda. scanizda: pop dx push dx sub dl,04h pamcur dl,dh,00h mov ah,08h int 10h cmp al,"M" jne scandcha inc cl Igual que los pasos anteriores para la celda que está a la derecha. scandcha: pop dx push dx add dl,04h pamcur dl,dh,00h mov ah,08h int 10h cmp al,"M" jne scanabizda inc cl Igual que los pasos anteriores para la celda que está abajo a la izquierda. scanabizda: pop dx push dx sub dl,04h add dh,02h pamcur dl,dh,00h mov ah,08h int 10h cmp al,"M" jne scanabajo inc cl Igual que los pasos anteriores para la celda que está debajo. scanabajo: pop dx push dx add dh,02h pamcur dl,dh,00h mov ah,08h int 10h cmp al,"M" jne scanabdca inc cl

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

33

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

34

Igual que los pasos anteriores para la celda que está debajo a la derecha scanabdca: pop dx push dx add dl,04h add dh,02h pamcur dl,dh,00h mov ah,08h int 10h cmp al,"M" jne escribir inc cl En este punto del programa tengo cargado en CL el número de minas que hay alrededor de la casilla que quiero rellenar, pero en el caso de que no tenga minas alrededor, en vez de que aparezca un 0 quiero que aparezca la celda vacía Recupero la posición de la celda que quiero rellenar de la pila y vuelvo a colocar el cursor en esa posición escribir: pop dx pamcur dl,dh,00h Cargo BH con 00h porque cuando escriba el dato en la casilla quiero que sea en la página cero. mov bh,00h El dato que quiero escribir lo tengo en CL, que es el registro donde he ido sumando las minas que había alrededor de la casilla actual, este dato lo llevo a AL, ya que es el registro en el que debo cargar el código ASCII del carácter que quiero escribir con el servicio 0Ah de la interrupción 10h. A este valor le sumo 30h, ya que lo que debo cargar en AL es el código ASCII del número, esto se consigue sumándole 30h mov al,cl add al,30h Comparo el código ASCII que voy a escribir con el valor 30h que es el correspondiente al “0”, y el el caso de que sea igual, sustituyo ese código 30h por el código ASCII del espacio en blanco. cmp al,30h jne noes mov al," " Doy la orden de escribir el carácter cuyo código ASCII está en AL en pantalla una vez con el servicio 0Ah de la interrupción 10h noes: mov cx,0001h mov ah,0ah int 10h

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

ESTRUCTURA DE COMPUTADORES I (Programas de ejemplo pantalla alfanumérico)

35

Antes de finalizar la macro recupero los registros de la pila tal y como estaban antes de entrar y finalizo la macro pop dx pop cx pop bx pop ax endm

1º INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN – EUITI VITORIA Profesor : Fernando Oterino Echávarri

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.