PDA

View Full Version : [assembler]Ciclo che si ripete fino alla pressione di un tasto


frizzo28
29-10-2006, 08:44
Ciao a tutti dovrei creare un ciclo in assembler che si ripete infinite volte finche non viene premuto un tasto. Cioè il ciclo non si deve fermare ad aspettare un tasto...
In C sarebbe così:
while(!kbhit()){
//Instruzioni da fare nel ciclo
}
Avete qualche suggerimento qualche link utile? Perchè non so da dove cominciare...

grazie anticipatamente
:)

andbin
29-10-2006, 09:56
Ciao a tutti dovrei creare un ciclo in assembler che si ripete infinite volte finche non viene premuto un tasto. Cioè il ciclo non si deve fermare ad aspettare un tasto...
In C sarebbe così:
while(!kbhit()){
//Instruzioni da fare nel ciclo
}
Avete qualche suggerimento qualche link utile? Perchè non so da dove cominciare...

grazie anticipatamente
:)Immagino che stai parlando di Assembly x86 in ambiente DOS.
In tal caso puoi usare il servizio del BIOS Int 16h/AH=01h (http://www.ctyme.com/intr/rb-1755.htm). Nota che se c'è l'indicazione di tasto premuto, dovresti anche rimuovere il tasto dal buffer con il servizio Int 16h/AH=00h.

frizzo28
29-10-2006, 14:31
Si parlo di assembly x86... grazie del suggerimento ora provo

frizzo28
29-10-2006, 15:41
Grazie mille ho provato come hai detto tu e funziona solo che ora non ho capito come posso modificarlo in modo che ripeta il ciclo finche il carattere è diverso da invio... e esca appena premo invio....

.MODEL SMALL
.STACK 100
.DATA

vett DB 99 DUP(?)
ora DB 0
minuti DB 0
secondi DB 0
n DB ?

.CODE
.STARTUP

;Pulisco schermo
MOV CX,020H
PULISCI:
;A capo
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
MOV AH,02H
INT 21H
;Fine a capo

LOOP PULISCI


CICLOPRI:

;Condizioni ciclo
MOV AH,01H
INT 16H;
;SE ZF !=0 esci dal ciclo
JNZ FINECICLO

;Leggo l'ora i minuti e i secondi e li salvo nelle rispettice variabili
MOV AH,2CH
INT 21H
;CH=ORE CL=MIN DH=SEC
MOV ora,CH
MOV minuti,CL
MOV secondi,DH



;Riposiziono il cursore all'inizio
MOV DL,00H
MOV DH,00H
MOV BH,00H
MOV AH,02H
INT 10H

;Stampa numeri a 2 cifre (stampa l'ORA)

MOV SI,0
CICLO:

MOV AL,ora
MOV AH,0
MOV BL,10
DIV BL
MOV ora,AL

MOV vett[SI],AH
INC SI


CMP SI,2
JE PROSEGUI

JMP CICLO



PROSEGUI:


MOV CX,SI
STAMPA:

DEC SI
MOV DL,vett[SI]
ADD DL,30H
MOV AH,02H
INT 21H



LOOP STAMPA


MOV DL,':'
MOV AH,02H
INT 21H

;Ho dovuto usare questo perchè il salto diretto all'etichetta FINECICLOP dava un errore perchè era troppo distante
JMP AVANT
FINECICLO:
JMP FINECICLOP
AVANT:


;Stampa numeri a due cifre (Stampa i MINUTI)
MOV SI,0
CICLO2:

MOV AL,minuti
MOV AH,0
MOV BL,10
DIV BL
MOV minuti,AL

MOV vett[SI],AH
INC SI



CMP SI,2
JE PROSEGUI2

JMP CICLO2



PROSEGUI2:


MOV CX,SI
STAMPA2:

DEC SI
MOV DL,vett[SI]
ADD DL,30H
MOV AH,02H
INT 21H



LOOP STAMPA2



MOV DL,':'
MOV AH,02H
INT 21H

;Stampa numeri a due cifre (Stampa i secondi SECONDI)
MOV SI,0
CICLO3:

MOV AL,secondi
MOV AH,0
MOV BL,10
DIV BL
MOV secondi,AL

MOV vett[SI],AH
INC SI


CMP SI,2
JE PROSEGUI3

JMP CICLO3



PROSEGUI3:


MOV CX,SI
STAMPA3:

DEC SI
MOV DL,vett[SI]
ADD DL,30H
MOV AH,02H
INT 21H



LOOP STAMPA3



JMP CICLOPRI
FINECICLOP:


.EXIT
END

andbin
29-10-2006, 16:07
Grazie mille ho provato come hai detto tu e funziona solo che ora non ho capito come posso modificarlo in modo che ripeta il ciclo finche il carattere è diverso da invio... e esca appena premo invio....Dovresti fare una cosa del genere (posto solo il codice necessario):
CICLO:
MOV AH,01H
INT 16H
JZ CONTINUA ; Nessun tasto, continua
MOV AH,00H
INT 16H
CMP AL,13 ; Premuto INVIO?
JE FINE_CICLO
CONTINUA:

; .... codice da eseguire nel ciclo ....

JMP CICLO

FINE_CICLO:


P.S. Solo come consiglio: indenta correttamente il codice, così come l'hai scritto non si capisce molto!

frizzo28
29-10-2006, 16:21
Perfetto funziona alla perfezione era proprio quello che cercavo grazie mille... :)