View Single Post
Old 21-09-2015, 22:09   #15
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da Eman993 Guarda i messaggi
Mauro
Cesare.
Quote:
l'esame non è andato proprio benissimo però me la sono cavata.
Benissimo. Lo scritto è un grosso scoglio, e averlo superato è già una gran cosa. Complimenti.
Quote:
Ho un dubbio enorme che sarà sicuramente la domanda del prof. all'orale:
Supponiamo di voler scrivere un programma per sostituire in una stringa la lettera a con il simbolo ? e la lettera b con il simbolo !. Ti posto il codice:
Codice:
               ORG    $8000
          A   DC.B    'CASE'
          N   DC.B    4
          B   DS.B    1
          C1 DC.B    'A'
          C2 DC.B    'B'
          S1 DC.B    '?'
          S2 DC.B    '!'    

                 ORG         $8100
      MAIN   MOVE.L     #B,-(SP)
                 MOVE.L     #A,-(SP)     
                 MOVE.B     N,-(SP)
                 MOVE.B     C1,-(SP)
                 MOVE.B     C2,-(SP)
                 MOVE.B     S1,-(SP)
                 MOVE.B     S2,-(SP)
                 JSR           SUB
                 ADDA        #16,SP
                 END          MAIN
In questo modo io voglio mettere il vettore modificato dentro la variabile B. Ma ho fatto bene a dichiararla in questo modo? Cioè è un vettore vuoto quello lì?
Non è un vettore vuoto: hai dichiarato la variabile B che è costituita di 1 solo byte. Poiché il vettore A è di 4 byte, non avrai abbastanza spazio e finirai per sovrascrivere C1, C2, ed S1.

Adesso non ricordo se la sintassi dell'assembler lo preveda, ma può darsi che tu possa dichiarare N e B in questo modo:
Codice:
N   DC.B    N-A
B   DS.B    N-A
N-A è la distanza fra N e A in termini di byte. Poiché N si trova esattamente dopo A, N-A sarà 4.

In realtà non avresti bisogno di dichiarare N, C1, C2, S1, ed S2 come variabili, ma semplicemente come costanti. Lo si fa usando EQU al posto di DC:
Codice:
          A   DC.B    'CASE'
          B   DS.B    B-A
          N   EQU    B-A
          C1  EQU    'A'
          C2  EQU    'B'
          S1  EQU    '?'
          S2  EQU    '!'
Ma in tal caso al posto di
Codice:
MOVE.B     N,-(SP)
ad esempio, dovrai usare l'indirizzamento immediato:
Codice:
MOVE.B     #N,-(SP)
Altra cosa importante, anche se utilizzi la MOVE.B, quando inserisci un dato nello stack, il "taglio" minimo è rappresentato da una word, per cui scriverai 2 byte anziché 1. Tienine conto quando devi farti i conti per vedere dove si trovano i tuoi parametri nello stack.
Quote:
Quando la subroutine farà
Codice:
               MOVE.B      5(SP),D0
               MOVE.L       16(SP),A0
                MOVE.B      D0,(A0)+
Intanto ti consiglio di definire delle costanti per gli offset di ogni parametro che si trova nello stack, altrimenti diventi matto a tenere i conti ogni volta che ti serve una variabile.
Quote:
B "Diventerà" un array?
Perché in C++ quando voglio dichiarare una variabile faccio int i. Quando voglio dichiarare un array faccio int i[n]. In assembler c'è questa differenza?
In assembly faresti:
Codice:
i DS.B n
Quote:
P.S. il prof. ci tiene alla riusabilità del codice, quindi se ho fatto qualcosa di troppo particolare e poco generico me lo indichi? Grazie mille!
Visto che usi una subroutine e gli passi tutti i parametri, direi che è abbastanza generico.

In ogni caso devi tenere presente che il tuo obiettivo è risolvere l'esercizio. Quindi non ti complicare la vita: implementa la soluzione più semplice che ti viene in mente e che lo risolve pienamente. Poi se c'è qualcosa da migliorare, ci penserai dopo, SE avrai tempo e avrà senso la modifica.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro
@LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro
Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys
cdimauro è offline   Rispondi citando il messaggio o parte di esso