[Assembly 8086] banale problema jump

Forum dedicato alla programmazione.

Moderatore: Staff

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.
Rispondi
Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

[Assembly 8086] banale problema jump

Messaggio 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?

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: [Assembly 8086] banale problema jump

Messaggio 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

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [Assembly 8086] banale problema jump

Messaggio 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

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [Assembly 8086] banale problema jump

Messaggio 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.

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: [Assembly 8086] banale problema jump

Messaggio 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

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [Assembly 8086] banale problema jump

Messaggio 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.

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [Assembly 8086] banale problema jump

Messaggio 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

Avatar utente
phobos3576
Staff
Staff
Messaggi: 2980
Iscritto il: dom 17 apr 2005, 0:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [Assembly 8086] banale problema jump

Messaggio 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

Rispondi