Newsgroup: it.comp.programmare
Titolo: E dopo la teoria sull'assembly..il nulla

Ma come si fa a partir con gli esercizi dopo aver capito istruzioni e 
logica dei programmi assembly?
Mi sono letto appunti e testi qua e la, credo di avere una visione 
generale che mi permette di capire dei semplici listati assembly, ma 
come si fa a fare la parte attiva senza vedere prima esempi?
Dovrei fare questo esercizio:
Si scriva in Assembly 80x86 una routine che legga dalla memoria un 
vettore di 8 byte e produca 2 byte contenenti i bit di parità di colonna 
e riga della matrice rappresentata dagli 8 vettori di 8 bit.
Si richiede che gli 8 byte sia allocati consecutivamente in memoria, e 
che la parità sia tale che il numero di '1' sia pari. la scelta degli 8 
byte da allocare in memoria viene lasciata allo studente.
Il passaggio di parametri deve avvenire registri senza utilizzare lo 
stack  (tranne che per la memorizzazione dell'indirizzo di ritorno dalla 
routine).
Es:                        Byte con Parità per le righe
byte1   1 0 0 1 1 0 1 0    0
byte2   0 0 0 0 0 1 0 1    0
byte3   1 1 0 1 0 1 1 0    1
byte4   1 0 0 0 1 0 0 0    0
byte5   0 1 1 1 1 1 1 0    0
byte6   0 0 0 0 0 0 0 0    0
byte7   1 0 1 0 1 0 0 0    1
byte8   0 1 0 1 1 0 0 1    0
byte    0 1 0 0 1 1 1 0
parita
colonna
Non ho idea da dove cominciare :-(
-- 
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/

 Non ho idea da dove cominciare :-(
SAL AL, 1 porta il bit piů significativo di AL nel carry.
JC salta se il carry č 1.
Dovrebbe bastarti, come suggerimento.

 E no, i compiti per casa no però...
Per carità, non li chiederei mai!
Volevo solo un consiglio, per imparare a fare questi esercizi non ci 
sarebbe bisogno di avere dei testi adatti?
Al corso non ci hanno dato nulla in questo senso, io ho imparato i 
concetti passivi, ma adesso mi pare di ripartire da zero...mi piacerebbe 
avere un testo con esercizio già svolti, di questo tipo, per imparare 
poi a farli....
Comunque grazie ancora.


 E no, i compiti per casa no però...
Forse hai capito che sono esercizi che devo portare all'esame, e quindi 
pensavi che chiedessi di farli.
No, all'esame avrò altri esercizi, queste sono solo prove vecchie che ho 
scaricato dal sito.
Figurati, a me di scopiazzare per passare l'esame non frega nulla, io 
voglio imparare...e solo che non riesco a trovare il metodo adatto.


 voglio imparare...e solo che non riesco a trovare il metodo adatto.
Inizio, ma da solo, senza una guida(che puň essere un libro che ancora 
non ho trovato), non riuscirň a farlo interamente neanche in cent'anni:
Devo usare la sintassi Linux:
.data
a: .byte 0b10011010
b: .byte 0b00000101
c: .byte 0b11010110
d: .byte 0b10001000
e: .byte 0b01111110
f: .byte 0b00000000
d: .byte 0b10101000
H  .byte 0b01011001
Va bene come inizializzazione dei dati?
A questo punto dovrei passare in rassegna ogni byte(seguendo il tuo 
consiglio) copiandolo in AL...
Ma devo farlo in una subroutine, o posso farlo direttamente?
Mi fermo qui, altrimenti farei solo pasticci, č troppo avanzato per me, 
dovrei iniziare da qualche esercizio piů semplice..


 Ma devo farlo in una subroutine, o posso farlo direttamente?
Ad esempio, considerando per semplicità solo il primo:
mov a,al
Adesso ci vorrebbe una specia di ciclo for in assembly, ma non ho idea 
di come implementarlo(l'avessi mai trovato nei manualetti che ho letto, 
che sono per lo più una semplice lista di istruzioni di salto e basta...)


 che sono per lo più una semplice lista di istruzioni di salto e basta...)
Appunto, devi usare un'istruzione di salto condizionato.
Cose come i cicli FOR, i CASE/SWITCH e i DO/WHILE non esistono in 
assembler, tutto quello che hai sono le istruzioni di salto 
condizionato. E con quelle ti devi arrangiare :-)
Definisci 8 bytes per le parità delle righe (cioè dei bytes che hai già) 
e altri 8 per le parità delle colonne.
Definisci due bytes che ti facciano da indici per sapere a che 
riga/colonna sei e azzerali.
Poi vai di SAL o di SAR (scegli tu) e ad ogni SAx incrementa l'indice 
colonna e testa il carry. Se carry=1 aggiorna il conteggio dei byte 
riga/colonna corrispondenti, sennò no.
Poi testa l'indice di colonna: se è <8 salta di nuovo al SAx, sennò 
incrementa l'indice riga di 1, carica il prossimo byte in AL, azzera 
l'indice colonna e salta di nuovo al SAx.
Questo in linea di massima il tuo programma. Si può fare di meglio, ma 
la logica di base è questa qui.

 la logica di base è questa qui.
E che devo fare tanto in poco tempo, quindi mi scuso con te e con gli 
altri per questi post, ma sono ai limiti della disperazione
Ad esempio saltando di palo in frasca, ho questa direttiva:
dato1: .byte 200
Inizializza un byte al valore decimale 200, ma perché diavolo il mio 
debugger su Linux, ddd( tra le  3 mila cose che sto cercando di 
imparare), mi dice che la variabile vale 15560 o cosi mi pare:
http://img840.imageshack.us/img840/8664/screenshot.png
Anche se non conosci il debugger in questione, non credo che per te sia 
un problema...
Ciao e grazie.


 imparare), mi dice che la variabile vale 15560 o cosi mi pare:
Mai visti né as né ddd, per cui essendo poco familiare con la loro 
sintassi non ti so dire molto.
Prima osservazione, RAX = 0xC8 cioč 200 decimale. Il valore di dato1 
viene caricato correttamente.
Seconda osservazione, non č che per caso "2: dato1" mostra l'indirizzo 
di dato1 invece del suo valore?...

On 18/07/2010 14:39, Massimo Soricetti wrote:
Ecco che succede a postare di corsa.
dato1: .byte 200 = 0xC8
dato2: .byte 60  = 0x3C
dato1: .word = 0x3CC8 = 15560
Mi sa che hai impostato male il tipo di dato1 nel ddd...


Non ti so dire che ho combinato, ma richiudendo e riaprendo il software 
il dato č stato visualizzato correttamente...eppure non mi pareva di 
aver toccato nulla...
Grazie.


 riga/colonna corrispondenti, sennò no.
Scusami, ma faccio una fatica bestiale a capire(colpa del mio livello 
attuale!): con queste istruzioni di shift estraggo uno ad uno  i bit dei 
vettori che vanno a finire ogni volta nel carry, e poi come faccio a 
sapere se il numero totale contato è pari(quindi bit di parità: 0) o 
dispari(bit corrispondente: 1)?
E' chiaro che sono riuscito a seguirti solo fino ad un certo punto :-(


 Grazie.
Altro comportamento strano(misterioso come il precedente):
ho  dichiarato la mia variabile come:
q:   .word 0
Secondo ddd questa vale: 65536
Booh! :-(


 voglio imparare...e solo che non riesco a trovare il metodo adatto.
Per imparare devi prima cominciare a fare esercizi per tuo conto....
quello che hai postato, per esempio, va benissimo per cominciare.
Ciao
-- 
la donna che ti costa meno la paghi
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it