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:

Codice: Seleziona tutto

or      al, al       ;anche and va bene
jz      ended
Ottimizzazioni estreme :D
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:

Codice: Seleziona tutto

.stack 100h

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:

Codice: Seleziona tutto

habla   db  "parola", 0
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:

Codice: Seleziona tutto

habla   db  "parola", 0
Azz, non l'avevo suggerito perché pensavo che l'assembler lo aggiungesse in automatico #-o

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 #-o
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:

Codice: Seleziona tutto

habla   db  "parola", 0
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":

Codice: Seleziona tutto

habla   db  "parola", 0