Pagina 1 di 1
[Assembly 8086] banale problema jump
Inviato: gio 24 giu 2010, 21:18
da Blallo
Codice: Seleziona tutto
.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?
Re: [Assembly 8086] banale problema jump
Inviato: gio 24 giu 2010, 21:30
da 414N
Invece di je prova jz. Puoi pure risparmiarti il caricamento di una costante numerica (0) per fare il confronto in questo modo:
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:
Re: [Assembly 8086] banale problema jump
Inviato: gio 24 giu 2010, 21:34
da Blallo
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
Re: [Assembly 8086] banale problema jump
Inviato: gio 24 giu 2010, 22:25
da phobos3576
Non si esce mai da loop perché "habla" non termina con uno zero; bisogna scrivere:
Per quanto riguarda lo stack, l'istruzione
.stack definisce automaticamente uno stack da
100h byte.
Re: [Assembly 8086] banale problema jump
Inviato: gio 24 giu 2010, 22:39
da 414N
phobos3576 ha scritto:Non si esce mai da loop perché "habla" non termina con uno zero; bisogna scrivere:
Azz, non l'avevo suggerito perché pensavo che l'assembler lo aggiungesse in automatico

Re: [Assembly 8086] banale problema jump
Inviato: gio 24 giu 2010, 23:09
da phobos3576
414N ha scritto:Azz, non l'avevo suggerito perché pensavo che l'assembler lo aggiungesse in automatico

Quello lo fa il linguaggio C (zero terminated string); in Assembly è tutto nelle mani del programmatore.
Re: [Assembly 8086] banale problema jump
Inviato: ven 25 giu 2010, 0:17
da Blallo
phobos3576 ha scritto:Non si esce mai da loop perché "habla" non termina con uno zero; bisogna scrivere:
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
Re: [Assembly 8086] banale problema jump
Inviato: ven 25 giu 2010, 0:32
da phobos3576
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":