Quote:
Originariamente inviato da Eman993
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
ad esempio, dovrai usare l'indirizzamento immediato:
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:
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.