lunes, 25 de noviembre de 2013

Act 25 de nov

1. Qué es el acceso a dispositivos de almacenamiento
Es la manera en la cual algun software en este caso el lenguaje ensamblador mediante su codificaccion permite la escritura y lectura de informacion en algun medio de almacenamiento.

2. Como se hace el acceso a disco usando lenguaje ensamblador
Para leer o escribir en un disco, no se realiza byte a byte, sino más bien en bloques de bytes, debido a que el acceso a disco implica movimientos mecánicos además de que el acceso se da por sectores; en este proceso no intervienen el CPU, puesto que solo envía los comandos a la interfase que maneja la unidad de disco y ésta es la que se encarga de leer o escribir información de un área especial de memoria, llamada DMA; este proceso es conocido como acceso directo a memoria.


Cuando se escribe a disco, el CPU coloca la información en el área de DMA, después envía un comando de escritura a la interface. La interface lee la información de la memoria (DMA) y la escribe en el sector deseado y después informa al CPU si terminó la operación o si se produjo un error (INT 0Eh). Cuando se requiere leer información del disco entonces el CPU envía un comando de lectura a la interface, ésta localiza el sector deseado, lee la información y la deposita en el área de DMA, avisa al CPU que terminó o bien si hay error. Después de esto el CPU puede leer la información para procesarla.

Para el manejo de disco desde BIOS se hace uso de la INT 13h, y con servicios de la misma interrupción. Para el manejo de disco desde el sistema DOS, se utilizan los discos a los cuales se le haya aplicado el comando format, el cual realiza un formato a nivel de BIOS (INT 13h), es decir mapea todos los sectores físicos de un disco en sectores lógicos, divide el disco en 4 áreas básicas de información:

· Boot record: Contiene la información acerca del formato del disco, tal como número de sectores, número tracks, número de lados, etc. Además contiene un pequeño programa que se encargará de bajar el sistema operativo (boot del sistema).

· Boot Strap: Lee el primer sector del disco (boot record) y le transfiere el control.

· Boot del sistema: Pasa a memoria los archivos del sistema operativo, les transfiere el control para que aparezca el prompt del sistema.

· Tabla de localización de archivos (FAT): En esta tabla se guarda una lista de los sectores ocupados por cada archivo contenido en el disco.

· Directorio: Se guarda información acerca de los archivos en el disco (nombre, extensión, tamaño, fecha y hora de última actualización, atributos y un apuntador a su correspondiente en el FAT).

· Archivos (área de datos): Es donde se guarda la información contenida en los archivos.

Los pasos a seguir para trabajar con archivos es la siguiente:

·  Identificar el archivo (nombre.ext).

·  Si el archivo no existe, entonces crearlo si hay que escribir, sino marcar error.

·  Localizar el archivo en el directorio.

·  Abrir el archivo.

·  Acceder el archivo (leer o escribir registros).

·  Cerrar el archivo.

La forma de acceder un archivo es mediante registros, es decir, se lee un registro o se escribe un registro de memoria a disco. Al área destinada para la transferencia de registros se le conoce como DTA (área de transferencia de datos) y puede estar localizada en cualquier parte del segmento de datos. El DTA tiene un tamaño de 128 bytes. Cuando se crea un archivo en el directorio se guarda el nombre y la extensión, se busca espacio en el disco y se guarda, por lo que no siempre son secuenciales los sectores de los archivos, es por eso que en la FAT se guardan las direcciones de los sectores y el boot guarda el programa que guarda el archivo.
Un archivo se puede acceder de dos formas: acceso secuencial; en este caso se sigue un orden en la lectura/escritura de registros, acceso aleatorio; en esta caso no se sigue un orden establecido y se puede leer/escribir en cualquier registro.
En DOS, para trabajar con archivos se necesitan dos estructuras de datos:
· Un área de memoria para el DTA, donde se van a escribir los registros.
o DTA DB 128 DUP (0)
· Un área para el bloque de control de archivos (FCB) en donde se guarda información importante para el acceso a archivo.
o FCB DB 36 DUP (0)
El formato para el FCB es el siguiente:

Un bloque de archivo consta de 80h registros de 80h bytes cada uno. Al iniciar el manejo de un archivo los únicos campos del FCB que se inicializan son el de la unidad, el nombre y la extensión; los demás bytes se ponen en cero y son actualizados por el sistema.



3. mencione y describa las unidades básicas de adaptador de video

Imagen enviada



PCB: En electrónica, un circuito impreso o PCB (del inglés printed circuit board), es un medio para sostener mecánicamente y conectar eléctricamente componentes electrónicos, a través de rutas o pistas de material conductor, grabados en hojas de cobre laminadas sobre un sustrato no conductor, comúnmente baquelita o fibra de vidrio.

GPU: Unidad Gráfica de procesamiento. se encarga de todos los cáculos gráficos, en juegos: Calcula millones de polígonos por segundo,controla los efectos: antialiasing, mipmaping, shaders, renderizado 3D, librería DirectX 6,7,8,9,10,11 OpenGL.

Memorias: chip de silicio que se encarga de almacenar texturas, datos, a gran velocidad, GDDR 5 duplica el ancho de banda que una memoria GDDR3.

Fases de poder: Se encarga de regular la tension que recibe desde la fuente. por ejemplo el GPU cuando esta en reposo la fase de alimentación no requiere tanto poder VCORE, y al cargar algún juego estas fases suministran mas voltaje a los componentes y al GPU cuando se requiere mucho procesamiento.

Transistores: Los transistores son unos elementos que han facilitado, en gran medida, el diseño de circuitos electrónicos de reducido tamaño, gran versatilidad y facilidad de control. Conmutación, actuando de interruptores (control de relés, fuentes de alimentación conmutadas, modulación por anchura de impulsos PWM)

Condensadores Sólidos: Es un condensador de larga vida útil compuesto de polímero, moderar el voltaje de salida y las fluctuaciones de corriente en la salida rectificada.

PCIex: El bus PCIEX (Interconexión de Componentes Periféricos Express, también escrito PCI-E) es un bus de interconexión entre la placa madre y la tarjeta de vídeo.

Entrada de Alimentación: Es por donde alimentamos con energía la tarjeta de vídeo directamente desde la fuente de poder.

Resistencias: pequeños componentes se encargan de elevar o disminuir la tencion electrica entre memoria, transistores,fases etc.

Acceso a discos en lenguaje ensamblador

1. ¿Qué es el acceso a dispositivos de almacenamiento?
Es la manera en la cual algun software en este caso el lenguaje ensamblador mediante su codificaccion permite la escritura y lectura de informacion en algun medio de almacenamiento.

2.¿Como se hace el acceso a disco usando lenguaje ensamblador?
 Para leer o escribir en un disco, no se realiza byte a byte, sino más bien en bloques de bytes, debido a que el acceso a disco implica movimientos mecánicos además de que el acceso se da por sectores; en este proceso no intervienen el CPU, puesto que solo envía los comandos a la interfase que maneja la unidad de disco y ésta es la que se encarga de leer o escribir información de un área especial de memoria, llamada DMA; este proceso es conocido como acceso directo a memoria.


Cuando se escribe a disco, el CPU coloca la información en el área de DMA, después envía un comando de escritura a la interface. La interface lee la información de la memoria (DMA) y la escribe en el sector deseado y después informa al CPU si terminó la operación o si se produjo un error (INT 0Eh). Cuando se requiere leer información del disco entonces el CPU envía un comando de lectura a la interface, ésta localiza el sector deseado, lee la información y la deposita en el área de DMA, avisa al CPU que terminó o bien si hay error. Después de esto el CPU puede leer la información para procesarla.

Para el manejo de disco desde BIOS se hace uso de la INT 13h, y con servicios de la misma interrupción. Para el manejo de disco desde el sistema DOS, se utilizan los discos a los cuales se le haya aplicado el comando format, el cual realiza un formato a nivel de BIOS (INT 13h), es decir mapea todos los sectores físicos de un disco en sectores lógicos, divide el disco en 4 áreas básicas de información:

· Boot record: Contiene la información acerca del formato del disco, tal como número de sectores, número tracks, número de lados, etc. Además contiene un pequeño programa que se encargará de bajar el sistema operativo (boot del sistema).

· Boot Strap: Lee el primer sector del disco (boot record) y le transfiere el control.

· Boot del sistema: Pasa a memoria los archivos del sistema operativo, les transfiere el control para que aparezca el prompt del sistema.

· Tabla de localización de archivos (FAT): En esta tabla se guarda una lista de los sectores ocupados por cada archivo contenido en el disco.

· Directorio: Se guarda información acerca de los archivos en el disco (nombre, extensión, tamaño, fecha y hora de última actualización, atributos y un apuntador a su correspondiente en el FAT).

· Archivos (área de datos): Es donde se guarda la información contenida en los archivos.

Los pasos a seguir para trabajar con archivos es la siguiente:

·  Identificar el archivo (nombre.ext).

·  Si el archivo no existe, entonces crearlo si hay que escribir, sino marcar error.

·  Localizar el archivo en el directorio.

·  Abrir el archivo.

·  Acceder el archivo (leer o escribir registros).

·  Cerrar el archivo.

La forma de acceder un archivo es mediante registros, es decir, se lee un registro o se escribe un registro de memoria a disco. Al área destinada para la transferencia de registros se le conoce como DTA (área de transferencia de datos) y puede estar localizada en cualquier parte del segmento de datos. El DTA tiene un tamaño de 128 bytes. Cuando se crea un archivo en el directorio se guarda el nombre y la extensión, se busca espacio en el disco y se guarda, por lo que no siempre son secuenciales los sectores de los archivos, es por eso que en la FAT se guardan las direcciones de los sectores y el boot guarda el programa que guarda el archivo.
Un archivo se puede acceder de dos formas: acceso secuencial; en este caso se sigue un orden en la lectura/escritura de registros, acceso aleatorio; en esta caso no se sigue un orden establecido y se puede leer/escribir en cualquier registro.
En DOS, para trabajar con archivos se necesitan dos estructuras de datos:
·         Un área de memoria para el DTA, donde se van a escribir los registros.
o   DTA DB 128 DUP (0)
·         Un área para el bloque de control de archivos (FCB) en donde se guarda información importante para el acceso a archivo.
o   FCB DB 36 DUP (0)
El formato para el FCB es el siguiente: 

 Un bloque de archivo consta de 80h registros de 80h bytes cada uno. Al iniciar el manejo de un archivo los únicos campos del FCB que se inicializan son el de la unidad, el nombre y la extensión; los demás bytes se ponen en cero y son actualizados por el sistema.

 
3. Busque y ejecute un programa de demuestre en su ejecucion el acceso a disco para grabar y leer

TITLE Sector Display Program (Sector.asm)

; Demonstrates INT 21h function 7305h (ABSDiskReadWrite)
; This Real-mode program reads and displays disk sectors.
; Works on FAT16 & FAT32 file systems running under Windows
; 95, 98, and Millenium.
; Last update: 06/01/2006

INCLUDE Irvine16.inc

Setcursor PROTO, row:BYTE, col:BYTE
EOLN EQU <0dh,0ah>
ESC_KEY = 1Bh
DATA_ROW = 5
DATA_COL = 0
SECTOR_SIZE = 512
READ_MODE = 0 ; for Function 7505h

DiskIO STRUCT
startSector DWORD ? ; starting sector number
numSectors WORD 1 ; number of sectors
bufferOfs WORD OFFSET buffer ; buffer offset
bufferSeg WORD SEG buffer ; buffer segment
DiskIO ENDS

.data
driveNumber BYTE ?
diskStruct DiskIO <>
buffer BYTE SECTOR_SIZE DUP(0),0 ; one sector

curr_row BYTE ?
curr_col BYTE ?

; String resources
strLine BYTE EOLN,79 DUP(0C4h),EOLN,0
strHeading BYTE "Sector Display Program (Sector.exe)"
BYTE EOLN,EOLN,0
strAskSector BYTE "Enter starting sector number: ",0
strAskDrive BYTE "Enter drive number (1=A, 2=B, "
BYTE "3=C, 4=D, 5=E, 6=F): ",0
strCannotRead BYTE EOLN,"*** Cannot read the sector. "
BYTE "Press any key...", EOLN, 0
strReadingSector \
BYTE "Press Esc to quit, or any key to continue..."
BYTE EOLN,EOLN,"Reading sector: ",0

.code
main PROC
mov ax,@data
mov ds,ax
call Clrscr
mov dx,OFFSET strHeading ; display greeting
call Writestring ; ask user for...
call AskForSectorNumber

L1: call Clrscr
call ReadSector ; read a sector
jc L2 ; quit if error
call DisplaySector
call ReadChar
cmp al,ESC_KEY ; Esc pressed?
je L3 ; yes: quit
inc diskStruct.startSector ; next sector
jmp L1 ; repeat the loop

L2: mov dx,OFFSET strCannotRead ; error message
call Writestring
call ReadChar

L3: call Clrscr
exit
main ENDP

;-----------------------------------------------------
AskForSectorNumber PROC
;
; Prompts the user for the starting sector number
; and drive number. Initializes the startSector
; field of the DiskIO structure, as well as the
; driveNumber variable.
;-----------------------------------------------------
pusha
mov dx,OFFSET strAskSector
call WriteString
call ReadInt
mov diskStruct.startSector,eax
call Crlf
mov dx,OFFSET strAskDrive
call WriteString
call ReadInt
mov driveNumber,al
call Crlf
popa
ret
AskForSectorNumber ENDP

;-----------------------------------------------------
ReadSector PROC
;
; Reads a sector into the input buffer.
; Receives: DL = Drive number
; Requires: DiskIO structure must be initialized.
; Returns: If CF=0, the operation was successful;
; otherwise, CF=1 and AX contains an
; error code.
;-----------------------------------------------------
pusha
mov ax,7305h ; ABSDiskReadWrite
mov cx,-1 ; always -1
mov dl,driveNumber ; drive number
mov bx,OFFSET diskStruct ; sector number
mov si,READ_MODE ; read mode
int 21h ; read disk sector
popa
ret
ReadSector ENDP

;-----------------------------------------------------
DisplaySector PROC
;
; Display the sector data in <buffer>, using INT 10h
; BIOS function calls. This avoids filtering of ASCII
; control codes.
; Receives: nothing. Returns: nothing.
; Requires: buffer must contain sector data.
;-----------------------------------------------------
mov dx,OFFSET strHeading ; display heading
call WriteString
mov eax,diskStruct.startSector ; display sector number
call WriteDec
mov dx,OFFSET strLine ; horizontal line
call Writestring
mov si,OFFSET buffer ; point to buffer
mov curr_row,DATA_ROW ; set row, column
mov curr_col,DATA_COL
INVOKE SetCursor,curr_row,curr_col

mov cx,SECTOR_SIZE ; loop counter
mov bh,0 ; video page 0
L1: push cx ; save loop counter
mov ah,0Ah ; display character
mov al,[si] ; get byte from buffer
mov cx,1 ; display it
int 10h
call MoveCursor
inc si ; point to next byte
pop cx ; restore loop counter
loop L1 ; repeat the loop
ret
DisplaySector ENDP

;-----------------------------------------------
MoveCursor PROC
;
; Advance the cursor to the next column,
; check for possible wraparound on screen.
;-----------------------------------------------
cmp curr_col,79 ; last column?
jae L1 ; yes: go to next row
inc curr_col ; no: increment column
jmp L2
L1: mov curr_col,0 ; next row
inc curr_row
L2: INVOKE Setcursor,curr_row,curr_col
ret
MoveCursor ENDP

;-----------------------------------------------------
Setcursor PROC USES dx,
row:BYTE, col:BYTE
;
; Set the screen cursor position
;-----------------------------------------------------
mov dh, row
mov dl, col
call Gotoxy
ret
Setcursor ENDP
END main

martes, 12 de noviembre de 2013

PROGRAMA CON PROCEDIMIENTOS

1)
; programa que usa procedimientos

.model small
.stack
.data
  doble  db \\\'ɻȼͺ\\\'
  simple db \\\'Ú¿ÀÙij\\\'
  msj    db \\\'No se duerman$\\\'
.code
.startup

; definici¢n de procedimientos prototipos
printcad proto c, p_cad: ptr word
cuadro proto c, fi:byte, ci:byte, ff:byte, cf:byte, tipo :ptr byte
poncar proto c, letra: byte
gotoxy proto c, fil: byte,col: byte
pon_color proto c,cfi:byte, cci:byte, cff:byte, ccf:byte, color:byte


; llamada a los procedimientos
call clrscr
call pitido
invoke pon_color, 1,1,23,79,0Ah
invoke cuadro, 1,1,23,79,addr doble
invoke cuadro, 4,4,20,74,addr simple
invoke pon_color, 3,3,21,77,34h
invoke gotoxy, 10,20
invoke printcad, addr msj
invoke cuadro, 5,5,18,70,addr doble
invoke pon_color, 15,20,17,25,0A0h


.exit

; Imprime una candena de caracteres en pantalla
; en cadena recibe la direccion de 16 bits donde apunta la
; cadena a imprimir

printcad proc c, p_cad: ptr word
      mov dx,p_cad
      mov ah,09h
      int 21h
      ret
printcad endp

; emite un pitido
pitido proc near
      mov ah,02h
      mov dl,07
      int 21h
      RET
pitido endp

; limpiar pantalla

clrscr proc
   mov ah,06h         ; peticion de recorrido de la pantalla
   mov al,00h         ; indica la pantalla completa
   mov bh,07h         ; attributos de color y fondo 7 blanco 1 azul
   mov cx,0000h       ; esquina superior izquierda renglon columna
   mov dx,184fh       ; esquina inferior derecha renglon columna
   int 10h            ; llamada a la interrupcion de video BIOS
   ret
clrscr endp


;  procedimiento para el gotoxy

gotoxy proc c, fil:byte,col: byte
   mov ah,02h         ; peticion para colocar el cursor
   mov bh,00          ; numero de pagina de video 0
   mov dh,fil         ; renglon
   mov dl,col         ; columna
   int 10h            ; llamada a la interrupcion de video BIOS
   ret
gotoxy endp

; procedimiento para escribir un caracter en pantalla

poncar proc c,letra: byte
  mov ah,02h
  mov dl,letra
  int 21h
  ret
poncar endp


; procedimiento para hacer un cuadro
cuadro proc c, fi:byte,ci:byte,ff:byte,cf:byte, tipo: ptr byte
     mov BX,tipo
     mov cl,ci
     .repeat
       invoke gotoxy, fi,cl
       invoke poncar, [BX+4]
       invoke gotoxy, ff,cl
       invoke poncar, [BX+4]
       inc cl
    .until cl==cf
     mov cl,fi
     .repeat
       invoke gotoxy, cl,ci
       invoke poncar, [BX+5]
       invoke gotoxy, cl,cf
       invoke poncar, [BX+5]
       inc cl
     .until cl==ff
     invoke gotoxy, fi,ci
     invoke poncar, [BX]
     invoke gotoxy, fi,cf
     invoke poncar, [BX+1]
     invoke gotoxy, ff,ci
     invoke poncar, [BX+2]
     invoke gotoxy, ff,cf
     invoke poncar, [BX+3]
     ret
cuadro endp

; camiar color del fondo de la pantalla

pon_color proc c,cfi:byte, cci:byte, cff:byte, ccf:byte, color:byte
   mov ah,06h         ; peticion de recorrido de la pantalla
   mov al,00h         ; indica la pantalla completa
   mov bh,color       ; attributos de color y fondo 7 blanco 1 azul
   mov ch,cfi
   mov cl,cci         ; esquina superior izquierda renglon columna
   mov dh,cff
   mov dl,ccf         ; esquina inferior derecha renglon columna
   int 10h            ; llamada a la interrupcion de video BIOS
   ret
pon_color endp

end


2)

.model small
.stack
.data
        cad db 5 dup(\' \'),\'$\'
.code
.startup
        gotoxy proto c, x: byte, y: byte
        call cls
        invoke gotoxy,10,10
        call leer
        call cls
        invoke gotoxy,5,6
        call write
.exit
       
        write proc
                mov ah,09h
                lea dx,cad
                int 21h
                ret
        write endp

        leer proc
                        mov si,00
                        mov ah,01h
                        otro:
                        .repeat
                                int 21h
                                cmp al,13
                                        je salir
                                mov cad[si],al
                                inc si
                        .until (si==5)
                        salir:
                ret
                leer endp

        gotoxy proc c, x: byte, y: byte
                        mov ah,02h
                        mov dh,y
                        mov dl,x
                        mov bh,0
                        int 10h
                        ret
                gotoxy endp

        cls proc
                        mov ah,00
                        mov al,03
                        mov bh,00
                        int 10h
                        ret
                cls endp
end


PROGRAMA CON MACROS

1)
;cambiar el fondo a color azul
;poner un pixel color blanco
;usando la tecla
;usando la tecla 8,2,4,6 moveremos el pixel
GRAPH MACRO             ;iniciamos modo gráfico
                MOV AH,00H
                MOV AL,12H
                INT 10H
        ENDM

PALETA MACRO color      ;Permite definir la paleta
                MOV AH,0BH
                MOV BH,00H
                MOV BL,color
                INT 10H
        ENDM

PUNTO MACRO x,y,color
                MOV AH,0CH
                MOV AL,color    ;Color blanco
                MOV BH,0       
                MOV CX,x
                MOV DX,y
                INT 10H
        ENDM

.model small
.stack
.data
        xx dw 1
        yy dw 1
        x dw 320
        y dw 240
.code
.startup

        GRAPH           ;Seteamos modo gráfico 640*480
        PALETA 1        ;Color azul
       
        PUSH AX
        PUSH BX

        mover:
                PUNTO xx,yy,0
                PUNTO x,y,7

        MOV AH,07H      ;READKEY
        INT 21H         ;
       
        CMP AL,56; Caracter '8'
                JE UP
        CMP AL,52; Caracter '4'
                JE LEFT
        CMP AL,54; Caracter '6'
                JE RIGHT
        CMP AL,50; Caracter '2'
                JE DOWN
        CMP AL,27; Salir
                JE SALIR
                JNE mover
       
        ;UP:
        DOWN:
                MOV AX,y
                MOV yy,AX       ;Guardamos posicion anterior
                        mov bx,x;X lo movemos a XX
                        MOV xx,bx
                INC AX
                MOV y,AX
                JMP mover

        LEFT:
                MOV AX,x
                MOV xx,AX       ;Guardamos posicion anterior
                        mov bx,y;X lo movemos a XX
                        MOV yy,bx
                DEC AX
                MOV x, AX
                JMP mover      

        RIGHT:
                MOV AX,x
                MOV xx,AX       ;Guardamos posicion anterior
                        mov bx,y;X lo movemos a XX
                        MOV yy,bx
                INC AX
                MOV X, AX
                JMP mover      

        ;DOWN:
        UP:
                MOV AX,y
                MOV yy,AX       ;Guardamos posicion anterior
                        mov bx,x;X lo movemos a XX
                        MOV xx,bx
                DEC AX
                MOV y, AX
                JMP mover      

        JMP mover

        MOV AH,07H      ;READKEY
        INT 21H         ;

        SALIR:

        MOV AH,00H
        MOV AL,03H
        INT 10H
.exit
end

2)

;Programa que muestra un marco desde la coordenada (Fila1,Columna1) hasta la (Fila2,Columna2)
;El programa, utiliza macros. funciona con LOOP. y utiliza la función 02h de la interreucipon 21h
;02:15 p.m. Miercoles, 18 de Octubre de 2006
MARCO MACRO     FILA1, COL1, FILA2, COL2
                LOCAL LINE_TOP
                LOCAL EXIT_TOP
                LOCAL LINE_BOTTOM
                LOCAL EXIT_BOTTOM
                LOCAL LINE_LEFT
                LOCAL EXIT_LEFT
                LOCAL LINE_RIGHT
                LOCAL EXIT_RIGHT
                ;Recorremos desde COL2 hasta COL1 en FILA1
                MOV cl,COL2                     ;El contador decrementará desde COL2
                LINE_TOP:                       ;
                        MOV AH,02h              ;Set cursor position (Int 10/02)
                        MOV DH,fila1    ;Row
                        MOV DL,cl               ;Column
                        MOV BH,0                ;page number: 0 = in graphics modes
                        int 10h                 ;Video (Int 10)
                       
                        MOV AH,02h              ;Write attributes/characters at cursor position (Int 10/09)
                        MOV DL,'+'              ;Character
                        INT 21H                 ;
                       
                        CMP Cl,COL1
                                je EXIT_TOP
                LOOP LINE_TOP ;dec cx;cmp cx,0;jne line_left;
                EXIT_TOP:
               
                ;Recorremos desde COL2 hasta COL1 en FILA2
                MOV cl,col2
                LINE_BOTTOM:
                        MOV AH,02h              ;Set cursor position (Int 10/02)
                        MOV DH,fila2    ;Row
                        MOV DL,cl               ;Column
                        MOV BH,0                ;page number: 0 = in graphics modes
                        int 10h                 ;Video (Int 10)
                       
                        MOV AH,02h              ;Write characters only at cursor position (Int 10/0A)
                        MOV DL,'+'              ;Character
                        INT 21H                
                       
                        CMP Cl,COL1
                                je EXIT_BOTTOM
                LOOP LINE_BOTTOM ;dec cx;cmp cx,0;jne line_left;
                EXIT_BOTTOM:
               
                ;Recorremos desde FILA2 hasta FILA1 en COL1
                MOV cl,FILA2
                LINE_LEFT:
                        MOV AH,02h              ;Set cursor position (Int 10/02)
                        MOV DH,cl               ;Row
                        MOV DL,COL1             ;Column
                        MOV BH,0                ;page number: 0 = in graphics modes
                        int 10h                 ;Video (Int 10)
                       
                        MOV AH,02h              ;Write characters only at cursor position (Int 10/0A)
                        MOV DL,'+'              ;Character
                        INT 21H                
                       
                        CMP Cl,FILA1
                                je EXIT_LEFT
                LOOP LINE_LEFT ;dec cx;cmp cx,0;jne line_left;
                EXIT_LEFT:
               
                ;Recorremos desde FILA2 hasta FILA1 en COL2
                MOV cl,FILA2
                LINE_RIGHT:
                        MOV AH,02h              ;Set cursor position (Int 10/02)
                        MOV DH,cl               ;Row
                        MOV DL,COL2             ;Column
                        MOV BH,0                ;page number: 0 = in graphics modes
                        int 10h                 ;Video (Int 10)
                       
                        MOV AH,02h              ;Write characters only at cursor position (Int 10/0A)
                        MOV DL,'+'              ;Character
                        INT 21H                
                       
                        CMP Cl,FILA1
                                je EXIT_RIGHT
                LOOP LINE_RIGHT ;dec cx;cmp cx,0;jne line_left;
                EXIT_RIGHT:
               
                ;Dibujamos esquinas
                MOV AH,02h              ;Set cursor position (Int 10/02)
                MOV DH,FILA1    ;Row
                MOV DL,COL1             ;Column
                MOV BH,0                ;page number: 0 = in graphics modes
                int 10h                 ;Video (Int 10)
               
                MOV AH,02h              ;Write characters only at cursor position (Int 10/0A)
                MOV DL,'@'              ;Character
                INT 21H                
               
                MOV AH,02h              ;Set cursor position (Int 10/02)
                MOV DH,FILA1    ;Row
                MOV DL,COL2             ;Column
                MOV BH,0                ;page number: 0 = in graphics modes
                int 10h                 ;Video (Int 10)
               
                MOV AH,02h              ;Write characters only at cursor position (Int 10/0A)
                MOV DL,'@'              ;Character
                INT 21H                
               
                MOV AH,02h              ;Set cursor position (Int 10/02)
                MOV DH,FILA2    ;Row
                MOV DL,COL1             ;Column
                MOV BH,0                ;page number: 0 = in graphics modes
                int 10h                 ;Video (Int 10)
               
                MOV AH,02h              ;Write characters only at cursor position (Int 10/0A)
                MOV DL,'@'              ;Character
                INT 21H                
               
                MOV AH,02h              ;Set cursor position (Int 10/02)
                MOV DH,FILA2    ;Row
                MOV DL,COL2             ;Column
                MOV BH,0                ;page number: 0 = in graphics modes
                int 10h                 ;Video (Int 10)
               
                MOV AH,02h              ;Write characters only at cursor position (Int 10/0A)
                MOV DL,'@'              ;Character
                INT 21H                
               
        ENDM

CLS MACRO                                       ;Clear Screen
                MOV AH, 00H                     ;Set video mode
                MOV AL, 03H                     ;Video mode 80x25, 8x8, 16, 4, B800, CGA
                INT 10H                         ;Video (Int 10)
        ENDM

.model small
.stack
.code
.startup

        CLS
        MARCO 1,1,22,78
        MARCO 5,15,15,25
        MARCO 3,3,8,8
        MARCO 3,30,18,70

        ;Enviar cursor a ultima línea
        MOV AH,02h              ;Set cursor position (Int 10/02)
        MOV DX,1700H    ;Row & Col
        MOV BH,0                ;Page number: 0 = in graphics mode
        int 10h                

.exit
end