Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [ASM 32b] input non letto

    Buonasera,

    Il mio codice in asm 32bit è destinato a un programma che al click di un tasto, parta un conteggio da 0a9 sullo stesso carattere (sostituendo con la funzione 0Ch) e al click dello stesso tasto, finisca il conteggio.
    Il problema è il seguente: non mi funziona neppure lo stop con un tasto qualsiasi, o per meglio dire solo in una parte:

    codice:
    ;Si codifichi un programma che attenda che sia premuto un tasto per iniziare a visualizzare un conteggio
    ;su video da 0 a 9, sempre nella stessa posizione. La visualizzazione del conteggio è ripetuta fino a quando
    ;non è premuto di nuovo il tasto
    ;Funzioni utili:
    ;02h
    ;07h
    ;09h
    ;0bh
    ;0ch
    
    		.model small
    		.stack
    		.data
    			messInizio db "Premi un tasto per far partire il conteggio$"
    			messCont db "Premi lo stesso tasto per far finire il conteggio$"
    			messFine db "Fine$"
    			divDieci db 0Ah
    			tasto db 0h
    			resto db 0h
    			conteggio dw 0h
    			acapo db 0Dh,0Ah,"$"
    			inizioRiga db 0Dh,"$"
    		.code
    			mov ax,@data
    			mov ds,ax
    			
    			lea dx,messInizio
    			mov ah,09h
    			int 21h
    			lea dx,acapo
    			mov ah,09h
    			int 21h
    			lea dx,messCont
    			mov ah,09h
    			int 21h
    			lea dx,acapo
    			mov ah,09h
    			int 21h
    			
    			mov ah,01h
    			int 21h
    			mov tasto,al
    			
    	conta:
    				
    				mov ax,conteggio
    				div divDieci
    				mov resto,ah
    				add resto,30h
    				
    				;		ritardo
    ;				mov di,0h
    ;				mov cx,0h
    ;	cicloRitardo1:	inc di
    ;	cicloRitInt1:		inc cx
    ;						cmp cx,0FFFh
    ;						jne cicloRitInt1
    ;					cmp di,09FFh
    ;					jne cicloRitardo1
    				
    				;		inizio riga
    				lea dx,inizioRiga
    				mov ah,09h
    				int 21h
    				
    				;		stampa resto
    				mov ah,0Ch
    				mov al,06h
    				mov dl,resto
    				int 21h
    				
    				;		prevenzione overflow
    				inc conteggio
    				cmp conteggio,100h
    				jne continua
    				mov conteggio,0h
    				
    	continua:				
    				;		0Bh
    				;	se al==0FFh, è disponibile un carattere
    				;	se al==00h, non è disponibile nessun carattere
    				;	quindi cliccando un tasto, il ciclo dovrebbe finire.
    				mov ah,0Bh
    				int 21h
    				cmp al,00h
    				je conta
    	
    	fine:
    			
    			lea dx,acapo
    			mov ah,09h
    			int 21h
    			lea dx,messFine
    			mov ah,09h
    			int 21h
    			
    			mov ah,4ch
    			int 21h
    		end
    Allora, l'uscita dal ciclo me lo fa quando vuole lui. Io penso che lo faccia quando siamo in prossimità dell'istruzione 0Bh, infatti se aggiungo il ritardo è praticamente impossibile farlo fermare, infatti non ci sono riuscito in vari tentativi.
    Le mie domande sono queste:
    1. Come faccio a eseguire le istruzioni, tenendo sempre acceso il buffer per controllare alla fine del ciclo, se è stato premuto qualcosa;
    2. Come faccio a ritardarlo senza problemi di tempistica (penso che risolvendo la 1. si risolva anche questa);
    3. Con la funzione 0Bh, so che mi ritorna in AL 0FFh se un tasto è stato premuto, ora mi chiedo dove posso trovare il codice ASCII di sto benedetto tasto (il prof mi sembra che avesse detto di fare "in al,60h" per accedere al PIC, e in 60h troveremo il nostro valore).

    Grazie per la lettura

  2. #2
    Utente di HTML.it L'avatar di Shika
    Registrato dal
    Jan 2010
    Messaggi
    27
    per la prima domanda non ho ben capito dov'è il problema..la funzione 0Bh non è quello che cerchi?
    EDIT: Ok avevo letto velocemente e non avevo capito,non saprei aiutarti al momento...
    Comunque per quanto riguarda la terza domanda usa la funziona AH=00h/Int 16h,ritorna il codice ASCII del carattere nel buffer della tastiera in AL e lo elimina dal buffer

  3. #3
    Utente di HTML.it L'avatar di Shika
    Registrato dal
    Jan 2010
    Messaggi
    27
    Mi scuso per il doppio post ma ho trovato la soluzione al problema,questo è realizzato con asm 16bit del 8086 ma dovrebbe andar bene comunque

    codice:
    ;Richiedo l'input per avviare il loop
    mov dx,offset var
    mov ah,0ah
    int 21h
    
    ;Ho messo FF in cx per crearmi un loop abbastanza lungo per il test xD,poi modifichi la funzione mettendo i numeri da 0 a 9
    mov cx,0ffh
    repeat:
    mov ah,02h
    mov dx,31h  ;Stampo sempre 1
    int 21h 
    mov ah,0bh ;Richiamo la funzione 0bh e controllo se è stato premuto qualcosa
    int 21h 
    cmp al,0ffh 
    jz analizza ;Se è stato premuto salto alla parte di codice cha analizza (non avevo voglia di fare una procedura ò_ò)
    continua: 
    loop repeat   
    jmp fine
     
    analizza: ;estraggo l'input e lo confronto con il contenuto di var[2] che contiene l'input ottenuto inizialmente,se sono uguali arriva alla conclusione,altrimenti salta indietro e continua il loop
    mov ah,00h 
    int 16h 
    cmp al,var[2] 
    jnz continua  
    fine:  
    ret 
    var db 2,?,2 dup(?) ;Dichiaro un array di 2 elementi (input + invio)
    Un codice un pò grezzo ma dovrebbe andar bene per quello che ti serve
    Ciao e buona fortuna

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 © 2024 vBulletin Solutions, Inc. All rights reserved.