Ejemplo 4

.286
.MODEL tiny
CODIGO      SEGMENT PUBLIC
            ASSUME CS:CODIGO,DS:CODIGO,ES:CODIGO,SS:CODIGO
            ORG 100H
INICIO:
            MOV CX, 800      ; Carga en CX 800
BUCLE2:     CALL DESPLAZA1   ; Llama al procedimiento DESPLAZA1
            LOOP BUCLE2      ; CX-- y salta a BUCLE2 si no cero

            INT 20H          ; El programa acaba

DESPLAZA1   PROC             ; Comienza el procedimiento DESPLAZA1
            PUSH CX          ; Salva en la pila CX
            MOV BX, 0B800H   ; La memoria de vídeo comienza en
                             ; esta dirección
            MOV CX, 25       ; La pantalla tiene 25 filas
            STD              ; Esto pone a 1 el flag de movimiento de
                             ; cadenas en modo decremental
BUCLE1:     MOV  ES, BX      ; ES apuntara a la memoria de vídeo
            MOV  DS, BX      ; DS también
            CALL LINEA       ; Llama al procedimiento LINEA
            ADD  BX, 10      ; Incrementa los registro de segmento  
                             ; en 10 unidades, luego en el 
			     ; direccionamiento es equivalente
                             ; a incrementar 160.
                             ; 160 = 80 columnas * 2 bytes por columna
                             ; Dirección = SEGMENTO * 16 + OFFSET 
            LOOP BUCLE1      ; CX-- y salta si no cero
            POP CX           ; Recupera CX de la pila
            RET              ; Retorna al punto de llamada.
DESPLAZA1   ENDP  


LINEA       PROC             ; Comienza el procedimiento LINEA 
            PUSH CX          ; Salva CX
            MOV DX, DS:[158] ; Salva en DX el primer carácter de la
                             ; columna 79 (comienza en 0)
            MOV CX, 79       ; Numero de columnas a desplazar
            MOV SI, 156      ; Dirección de inicio
            MOV DI, 158      ; Dirección destino
            REP MOVSW        ; [DI] <-- [SI]
                             ; DI-- SI-- CX--
                             ; Repite la instrucción si CX no es cero
            MOV DS:[0], DX   ; Coloca el ultimo carácter en su sitio
            POP CX           ; Recupera CX
            RET              ; Retorna al punto de llamada.
LINEA       ENDP


CODIGO      ENDS
            END INICIO