Repository 32bit  Forum
Repository 64bit  Wiki

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

[Assembly 8086] banale problema jump

Messaggioda Blallo » gio giu 24, 2010 20:18

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?
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3218
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [Assembly 8086] banale problema jump

Messaggioda 414N » gio giu 24, 2010 20:30

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
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: [Assembly 8086] banale problema jump

Messaggioda Blallo » gio giu 24, 2010 20:34

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
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3218
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [Assembly 8086] banale problema jump

Messaggioda phobos3576 » gio giu 24, 2010 21:25

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
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [Assembly 8086] banale problema jump

Messaggioda 414N » gio giu 24, 2010 21:39

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
414N
Iper Master
Iper Master
 
Messaggi: 2881
Iscritto il: mer feb 13, 2008 16:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: [Assembly 8086] banale problema jump

Messaggioda phobos3576 » gio giu 24, 2010 22:09

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
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3

Re: [Assembly 8086] banale problema jump

Messaggioda Blallo » gio giu 24, 2010 23:17

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
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3218
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: [Assembly 8086] banale problema jump

Messaggioda phobos3576 » gio giu 24, 2010 23:32

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
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Yahoo [Bot] e 1 ospite