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
|