Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
.model small
.stack
.data
habla db "parola"
.code
.startup
xor si, si
loopa: mov al, habla[si]
cmp al, 0
je ended
sub al, 32
mov habla[si], al
inc si
jmp loopa
ended: xor si, si
end
convertitore da minuscolo a maiuscolo
quando AL vale 0, la parola è finita (in ASCII 000=null)
quindi deve saltare fuori dal loop
però l'etichetta sull'END ovviamente non va
e mi trovo costretto ad aggiungere un'istruzione inutile per dargli un'etichetta
voi come fareste?
Ottimizzazioni estreme
PS: ma lo stack non va dimensionato all'inizio del programma, o ci pensa l'assembler a inizializzarne la dimensione ad un valore di default? Io di solito lo dichiaravo:
noi non lo dimensioniamo mai
ma vabbè il nostro è un corso più che basiliare
grazie lo stesso, ma comunque non risolve il mio problema
e ora, come una capra, mi sono accorto che lo vuole con una procedura
doh
Per quanto riguarda lo stack, l'istruzione .stack definisce automaticamente uno stack da 100h byte.
in realtà dal loop esce
il problema che ho posto è un altro:
per mettere l'etichetta "ended" ho dovuto aggiungere uno xor inutile (penultima riga), perchè ad end non si può applicare un'etichetta
vorrei poter aggirare queste situazioni
Chiaramente, "end" è una parola chiave che in TASM termina il programma; quindi, non la puoi usare come etichetta.
Non è comunque obbligatorio associare un'istruzione ad una etichetta; puoi mettere ended: senza aggiungere altro.
In ogni caso, il codice che hai scritto è sbagliato; il loop termina grazie al fatto che, a forza di incrementare SI, prima o poi incontri una locazione di memoria che per pura coincidenza contiene un byte di valore zero. Devi per forza mettere lo zero alla fine di "habla":