codice:
;COLCHAR.ASM
;
;Stampa un carattere a colori
;
        EXTRN   L_CLS:NEAR      ; Pulisce lo schermo
        EXTRN   L_KWAIT:NEAR    ; Attende la pressione di un tasto
        EXTRN   L_WCHR:NEAR     ; Visualizza il carattere in AL col colore di BL
_prg    SEGMENT BYTE PUBLIC 'CODE'
        ASSUME CS:_prg,DS:_prg
        ORG     0100h
        JMP     START
START:  MOV     BH,00h  ; Pagina video 0
        CALL    L_CLS   ; Reimposta a 80x25 e pulisci lo schermo
        MOV     CX,0Fh  ; Visualizza in 15 colori diversi
        MOV     DX,0Fh
VIS:    MOV     AL,'*'  ; Imposta il carattere da stampare
        MOV     BL,DL   ; Imposta il colore corrente
        MOV     DX,01   ; Numero di caratteri da visualizzare
        CALL    L_WCHR  ; Visualizza il carattere corrente
        CALL    L_KWAIT ; Attendi la pressione di un tasto
        LOOP    VIS     ; Ripeti finchè CX <> 0
        CALL    L_CLS   ; Reimposta a 80x25 e pulisci lo schermo
        MOV     AH, 4Ch ;
        INT     21H     ; ^ Esci al DOS
_prg    ENDS
        END START
E così non sarebbe meglio visto che non chiami in causa lo stack e quindi il programma sarà più veloce? (di qualche miliardesimo di secondo ).

Poi puoi fare quello che vuoi ma ad esempio in un linguaggio ad alto livello, dentro a un ciclo non modifichi mai il contatore di ciclo tranne esigenze particolari...