scura (Normal User)
Newbie
Messaggi: 3
Iscritto: 30/06/2009
|
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
|
|
antometal (Member)
Guru
Messaggi: 691
Iscritto: 12/09/2007
|
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.
Codice sorgente - presumibilmente Delphi |
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:
Codice sorgente - presumibilmente Plain Text |
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 |
|
scura (Normal User)
Newbie
Messaggi: 3
Iscritto: 30/06/2009
|
visto che ci sei....mi puoi scrive anche il codice per l'input?
grazie
|
|
antometal (Member)
Guru
Messaggi: 691
Iscritto: 12/09/2007
|
questo è il metodo che input + semplice, lo devi inserire nell' altro che stai facendo
Codice sorgente - presumibilmente Delphi |
.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
|
|
|
MiDDiO (Normal User)
Newbie
Messaggi: 9
Iscritto: 15/07/2009
|
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...
Codice sorgente - presumibilmente Altri Linguaggi |
.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
|
|
|
MiDDiO (Normal User)
Newbie
Messaggi: 9
Iscritto: 15/07/2009
|
Nessuno sa darmi una mano ?
|
|
antometal (Member)
Guru
Messaggi: 691
Iscritto: 12/09/2007
|
che errore da?
lo compila il file?
|
|
MiDDiO (Normal User)
Newbie
Messaggi: 9
Iscritto: 15/07/2009
|
No non me lo compila... quando uso il ijvm assembler mi da errore ora te lo allego quello che mi scrive nel Dos...
|
|
antometal (Member)
Guru
Messaggi: 691
Iscritto: 12/09/2007
|
intanto il codice che hai postato è incompleto (così com' è non lo compilerà), manca la costante objref e ldc_w objref prima dei parametri dell' invokevirtual
posta il codice completo, così lo provo anche io
|
|