Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [ASM] problemino in un loop...

    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
    VIS:    PUSH    CX      ; Metti al sicuro CX nello stack
            MOV     AL,'*'  ; Imposta il carattere da stampare
            MOV     BL,CL   ; Imposta il colore corrente
            CALL    L_WCHR  ; Visualizza il carattere corrente
            CALL    L_KWAIT ; Attendi la pressione di un tasto
            POP     CX      ; Preleva CX dallo stack
            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
    l'idea è di visualizzare 15 volte un singolo carattere, ogni volta di colore diverso... perchè invece mi visualizza 15 caratteri del colore 15, poi 14 del colore 14 e così via fino a zero? mi ci sto perdendo...
    Sotto la panza la mazza avanza.

  2. #2
    uff... niente, risolto... avevo scordato di settare CX a 1 all'interno del ciclo
    Sotto la panza la mazza avanza.

  3. #3
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    E' un po' "rischioso" lavorare con cx dentro a un ciclo.

    Ti consiglio di utilizzare anche dx visto che non l'hai mai chiamato in causa.

  4. #4
    rischioso perchè?
    Sotto la panza la mazza avanza.

  5. #5
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    Dipende da dove hai messo MOV CX,1

    Se hai voglia di postare il codice corretto...

  6. #6
    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
    VIS:    PUSH    CX      ; Metti al sicuro CX nello stack
            MOV     AL,'*'  ; Imposta il carattere da stampare
            MOV     BL,CL   ; Imposta il colore corrente
            MOV     CX,01   ; Numero di caratteri da visualizzare
            CALL    L_WCHR  ; Visualizza il carattere corrente
            CALL    L_KWAIT ; Attendi la pressione di un tasto
            POP     CX      ; Preleva CX dallo stack
            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
    Sotto la panza la mazza avanza.

  7. #7
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    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...

  8. #8
    se uso dx non può funzionare, nella l_wchr richiamo un int 10h con al a 13h che richiede in cx il numero di caratteri da visualizzare... al massimo nella funzione esterna potrei usare il valore di dx per inserirlo in cx, ma sarei comunque al punto di prima
    Sotto la panza la mazza avanza.

  9. #9
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    Originariamente inviato da Caleb
    se uso dx non può funzionare, nella l_wchr richiamo un int 10h con al a 13h che richiede in cx il numero di caratteri da visualizzare... al massimo nella funzione esterna potrei usare il valore di dx per inserirlo in cx, ma sarei comunque al punto di prima
    E chi è stato a fare la funzione l_wchr???

    E pensare che ci sono processori con UN solo registro e si fa tutto quello che si vuole

    Vebbè, non sarò io a decidere come devi fare un programma solo che sono stato abituato sin dall'inizio a non espormi a rischi inutili...ma quando c'è di mezzo codice di terzi è sempre così

  10. #10
    spe', quella l'ho scritta io

    era ah a 09h e non al a 13h, comunque questo e' il suo codice

    codice:
            PUBLIC L_WCHR
    _prg    SEGMENT BYTE PUBLIC 'CODE'
            ASSUME CS:_prg
    L_WCHR  proc NEAR
            PUSH AX
            PUSH BX
            MOV BH,00h ; Pagina video 0
            MOV AH,09h ; 
            INT 10h    ; ^ Stampa un carattere a colori
            POP BX
            POP AX
            RET
    L_WCHR  ENDP
    _prg    ENDS
            END
    Sotto la panza la mazza avanza.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.