Newsgroup: it.comp.programmare
Titolo: Ancora sulla dimensione dei dati in assembly

Consideriamo questa istruzione:
string     dc.b 'sasiccio',0,'friariello'
dc.b dignifica: inizializza i dati con ognuno di essi contenuto in un byte.
Ma vedendo in memoria il dato 'sasiccio' occupa più di un byte, 
precisamente mi pare siano 8 byte:
http://digilander.libero.it/maxxam99/Pics/2010-06-12_102218.jpg
Che mi sfugge?
-- 
Bonus di 25 euro su 
betfair.it
, codice da inserire: AAAACGWFG
Vai sul mio sito(in fondo alla pagina) per altri dettagli:
http://digilander.libero.it/maxxam99/

 a questo punto si comincia a consigliare il RTFM
Hai perfettamente ragione, perň ho tremila testi scaricati da piů parti, 
e mille dubbi in testa, spesso ho risolto leggendo qua e la o su 
internet e sui testi, ma alcuni dubbi rimangono.
Quindi mi scuso e ti ringrazio infinitamente per la pazienza che hai avuto.


 string     dc.b 'sasiccio',0,'friariello'
in C diventa
char *s = "sasiccio\000friariello";
ed occupa evidentemente piu' di un byte; e se non fosse evidente vuol
dire che la necessaria "forma mentis" proprio non c'e' ancora.

 Ma qui non c'e' neppure quella del C.
Ma č normale che sia cosi', ho talmente poca pratica alle spalle...ecco 
perchč adesso cerco di recuperare studiando e facendo domande.
Ciao.


 perchè adesso cerco di recuperare studiando e facendo domande.
E proprio perché voglio imparare e sono curioso, ti chiedo(il c in 
realtà non l'ho mai studiato, purtroppo, alle spalle ho solo un pochino 
di  c++, ma proprio a livello base...):
hai detto che:
string dc.b 'sasiccio',0,'friariello
In C diventa
char *s = "sasiccio\000friariello";
Ho capito  che ogni carattere vale un byte, sia in assembly che in C, ma 
potresti spiegarmi cosa rappresenta \000?
Grazie anticipate.


 potresti spiegarmi cosa rappresenta \000?
Il terminatore di stringa, un carattere il cui valore è 0. La notazione 
con backslash indica il valore desiderato espresso in ottale.

 Ma vedendo in memoria il dato 'sasiccio' occupa più di un byte, 
Il sasiccio* occupa ben più di un byte, si sa.
* salsicciotto


Ah, ecco, adesso è chiaro.
Graie Andrea.


On Monday/14/06/2010 09:32, Andrea D'Amore wrote:

Ah, ecco, adesso è chiaro.
Grazie Andrea.


 Grazie Andrea.
Ad esempio, per il carattere new line \n
Posso usare anche:
\012
esatto?
Ma se quella è la rappresentazione in ottale quando scrivo "\n" sto solo 
usando una particolare convenzione dei compilatori per riferirsi 
comunque a \012, è giusto porla in questo modo?
Ciao.


 comunque a \012, è giusto porla in questo modo?
Comunque dalle tabelle che ho visto mi par di capire che scrivere \0 
(decimale) o \00 (ottale) sia perfettamente equivalente.

 (decimale) o \00 (ottale) sia perfettamente equivalente.
\000 volevo dire ovviamente



In C ci sono diversi modi per rappresentare i numeri.
Decimale, esadecimale, ottale...
Convenzionalmente, ma non e' obbligatorio, per far capire che si vuole
rappresentare un carattere e non un numero, si usa l'ottale.
Le scritture di caratteri particolari come il newline, e il tab, e'
preferibile scriverle con \n o \t, per una migliore leggibilita' anche
se puoi benissimo scriverli con la notazione ottale o decimale.
Ma tutto questo riguarda il C.
In assembly le convenzioni sono diverse e cambiano da compilatore a
compilatore.
Nel tuo caso, del 68000, non ricordo se sia possibile indicare i
numeri con basi diverse, mi viene da pensare di si, ma sinceramente
non ricordo.
Ad ogni buon conto a te serve capire come scrivere i numeri, in
decimale (per comodita' tua), in esadecimale e binario (per
praticita').
L'ottale non serve molto in assembly: non l'ho mai usato al di fuori
del C, io.
Le stringhe di caratteri, in C e in assembly, hanno una
caratteristica: sai sempre dove cominciano, ma non sai mai dove
finiscono, quindi ti serve una informazione aggiuntiva.
O la lunghezza, o ci metti un terminatore.
La lunghezza ti costa 4 byte se usi una longword.
In pratica ne dovrebbero bastare 2, dipende sempre da quello che devi
fare (l'errore di buffer overflow e' sempre li' che ti aspetta).
Altrimenti utilizzi un terminatore, come il C che usa lo zero.
Il vantaggio del terminatore e' che costa un solo byte, oltre a quelli
della stringa.
Lo svantaggio e' che non puoi gestire stringhe con uno zero tra i suoi
caratteri.
Naturalmente zero inteso come ascii \000, non come '0' che ha un
codice ascii 48.
Un bell'esercizio che potresti fare per imparare a gestire le strighe
e' quello di prendere una stringa e trasformarla in maiuscolo, usando
l'istruzione AND, e poi trasformarla in minuscolo usando l'istruzione
OR.
Oppure scambiare le maiuscole con le minuscole usando l'istruzione
XOR.

 XOR.
Ti ringrazio per i preziosi consigli, utilissimi!


 Quello della lunghezza non credo: potresti farmi un esempio pratico?
Te lo faccio in C.
Col terminatore una stringa in C la si smazza nel modo seguente:
for (char *p=stringa; *p != 0; p++)
  char c = *p;
Con la lunghezza invece la stringa la smazzi cosi':
for (int i=0, char *p=stringa; i<lunghezza; i++, p++)
  char c = *p;
oppure considerandola come array di caratteri
for (int i=0; i<lunghezza; i++)
  char c = stringa[i];


Capito, si stabilisce una lunghezza che limita la stringa a tale 
lunghezza, mentre col terminatore si va avanti finchč non si incontra lo 0.
Almeno la logica adesso mi č chiara, mi basta cosě per ora :-)
Grazie ancora.
