Oppure

Loading
30/06/09 12:12
scura
Ciao ragazzi,
devo implementare tre metodi in IJVM, sono simili quindi ne scrivo solo uno:
-metodo che restituisce 1 al TOS se il carattere ascii passato è alfabetico minuscolo( da ascii 0x61 ad ascii 0x7A), 0 altrimenti.

è da poco che uso l'IJVM e nn so come fare...
grazie in anticipo
aaa
30/06/09 13:45
antometal
innanzitutto ti serve il metodo o comunque il codice che legge il carattere da tastiere, lo hai?
una volta acquisito il carattere (sullo stack hai l' ascii del carattere) ti conviene salvaro in una variabile, dichiarata nel metodo (puoi anche non farlo e usare solo lo stack, ma se sei alle prima armi è meglio di si)

a questo punto devi controllolare se l' ascii del carattere è compreso tra 0x61 e 0x7A
per far ciò, puoi usare solo l' istruzione IFLT offset, la quale esegue le istruzioni dopo la label offset, solose il valoro in cima allo stack è negativo

es.
iload x     /porta il valore della var x in cima allo stack
dup         /duplica il valore in cima allo stack, perchè la iflt decrementa lo stack pointer
iflt neg    /se il valore in cima allo stack è <0, va a neg
bipush 20   /altrimenti esegue il codice dopo la iflt
iadd
goto fine   /va alla label fine
neg:
bipush 30
isub
fine:
halt


se la x<0 il codice fa x+20 ed esce
se la x>=0 il codice fa x-30 ed esce

per il tuo codice devi fare 2 controlli, e siccome puoi usare solo la iflt, devi usare anche la isub

x:ascii del carattere

x deve essere >=0x61 riducibile in x>0x60 perchè lavori solo con numeri interi, lo devi ancora trasformare come (...)<0 in questo caso: 0x60-x<0

in codice:
bipush 0x60
iload x
isub             //isub,fa la differenza l' elemento al top dello stack (che verrà eliminato)e quello appana sotto (che sarà modificato come risultato)
iflt maggiore_60
ireturn 0
maggiore_60


alla label maggiore_60 (sei sicuro che x sia >=0x61), devi fare una cosa analoga al codice sopra, ma con 0x7A

fammi sapere se hai ancora bisogno
aaa
30/06/09 14:12
scura
visto che ci sei....mi puoi scrive anche il codice per l'input?
grazie
aaa
30/06/09 14:40
antometal
questo è il metodo che input + semplice, lo devi inserire nell' altro che stai facendo

.method input()
getch:
	IN		// Legge un carattere
	DUP		// Duplica il top dello stack
	IFEQ reread	// Se è = 0 (nessun tasto)
	GOTO done 	// Tasto premuto, procedi
	
reread:
	POP		// Cancella il duplicato
	GOTO getch	// Torna in attesa
	
done:
	ireturn		// Ritorna il top dello stack
.end-method
aaa
15/07/09 15:07
MiDDiO
Io ho un progetto molto simile... sempre con tre funzioni ti riconoscere l'esadcimale è numerico albafetico o alfanumerico ( alfabetico sono intese minuscoli e maiscole)..
ho provato a fare intanto il pezzo dei numerici premetto che non sono bravo.. pero mi da un errore e non riesco a capire perchè... se potete darmi una mano ne sarei contento...

.constant
esadecimale      0x33   // numero 2 in esadecimale
masknumerico1    0x-10 // maschera posta in complemento a due per controllare i 4 bit più significativi 
masknumerico2    0x30  // maschera per controllare se è nei numerici 
masknumerico3    0xF   // maschera per tirar fuori gli ultimi 4 bit 
masknumerico4    0xA   // maschera per confrontare se è nel limite superiore dei numerici
.end-constant 

.main
bipush 0
ldc_w esadecimale
invokevirtual isnum
halt 
.end-main

.method isnum(v)
ldc_w masknumerico1
iload v 
iand
ldc_w masknumerico2
if_icmpeq controllo2   // se è vero non sara numerico, altrimenti bisogna fare il controllo per vedere se è minore di 0x3A
bipush 0 
ireturn

controllo2: 
ldc_w masknumerico3
iload v 
iand
ldc_w masknumerico4
isub
iflt Numerico   // confronto se è minore di 0x3A se falso 0 nel TOS altrimenti 1
bipush 0 
ireturn
aaa
20/07/09 19:32
MiDDiO
Nessuno sa darmi una mano ?
aaa
20/07/09 22:21
antometal
che errore da?
lo compila il file?
aaa
21/07/09 13:34
MiDDiO
No non me lo compila... quando uso il ijvm assembler mi da errore ora te lo allego quello che mi scrive nel Dos...
aaa