Programa que muestra un marco con asteriscos bajo MSDOS. (Sin macros ni procedimientos)

Programa que muestra un marco desde la coordenada (Fila1,Columna1) hasta la (Fila2,Columna2). El programa, no utiliza macros. Utiliza etiquetas y funciona con LOOP.

Búsqueda de ejemplos en Ensamblador
;Autor Victor De la Rocha
;URL http://www.mis-algoritmos.com

;11:30 p.m. Lunes, 16 de Octubre de 2006
.model small
.stack
.code
        ;Variables auxiliares
        FILA1   db      1;4
        COL1    db      1;15
        FILA2   db      22;15
        COL2    db      78;25
.startup
        ;Clear Screen
        MOV AH, 00H                     ;Set video mode
        MOV AL, 03H                     ;Video mode 80x25, 8x8, 16, 4, B800, CGA
        INT 10H                         ;Video (Int 10)

        ;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,09h              ;Write attributes/characters at cursor position (Int 10/09)
                MOV AL,\'+\'            ;Character
                MOV BH,0                ;Display page
                MOV BL,7                ;Color
               
                PUSH CX                 ;Almacenamos CX en la pila
                mov CX,1                ;number of times to write character
                INT 10H                 ;Video (Int 10)
                POP CX                  ;Sacamos CX de la pila
               
                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,09h              ;Write characters only at cursor position (Int 10/0A)
                MOV AL,\'+\'            ;Character
                MOV BH,0                ;Display page - alpha mode
                MOV BL,7                ;Color
                PUSH CX                 ;Almacenamos CX en la pila
                mov CX,1                ;number of times to write character
                INT 10H                 ;Video (Int 10)
                POP CX                  ;Sacamos CX de la pila
               
                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,09h              ;Write characters only at cursor position (Int 10/0A)
                MOV AL,\'+\'            ;Character
                MOV BH,0                ;Display page - alpha mode
                MOV BL,7                ;Color
                PUSH CX                 ;Almacenamos CX en la pila
                mov CX,1                ;number of times to write character
                INT 10H                 ;Video (Int 10)
                POP CX                  ;Sacamos CX de la pila
               
                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,09h              ;Write characters only at cursor position (Int 10/0A)
                MOV AL,\'+\'            ;Character
                MOV BH,0                ;Display page - alpha mode
                MOV BL,7                ;Color
                PUSH CX                 ;Almacenamos CX en la pila
                mov CX,1                ;number of times to write character
                INT 10H                 ;Video (Int 10)
                POP CX                  ;Sacamos CX de la pila
               
                CMP Cl,FILA1
                        je EXIT_RIGHT
        LOOP LINE_RIGHT ;dec cx;cmp cx,0;jne line_left;
        EXIT_RIGHT:

        ;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