Esercizio costrutto if-else

di il
6 risposte

Esercizio costrutto if-else

Sono alle prese con l'Assembler Motorola 68000 e sto approcciando da poco con qualche esercizio.
Visto che è uno dei primi che sto svolgendo volevo chiedere uno sguardo per sapere se sono sulla giusta strada o devo rivedere qualcosa.
Il testo dell'esercizio mi chiede di creare un costrutto if-else. Precisamente se q=4, x=5 altrimenti x=y.
Io credo di esserlo riuscito a risolvere con qualche difficoltà ed ho qualche dubbio da chiarire. Intanto posto il codice che ho scritto:

	ORG $8000
START	MOVE.B Q,D0
	CMP #4,D0
	BEQ	IF
	BNE	ELSE
IF	MOVE.B #5,D1
	MOVE.B D1,X
	JMP FINE

ELSE	MOVE.B Y,D2
	MOVE.B D2,X
	JMP FINE

FINE	STOP #$2700
	
	ORG $8814
Q	DC.B	6
Y	DC.B	7
X	DS.B	1
	END START
E' un giusto approccio?

Le mie domande particolari sono:
1)E' giusto usare BEQ e BNE per rimandare alle varie parti del codice che mi serve oppure si può fare in un altro modo? Perchè se a me serve solo l'else mi lancia comunque giustamente l'istruzione dell'if.
2)Se non mettessi STOP #$2700 mi da un errore in fase di esecuzione come mai? O meglio, a cosa mi serve stoppare il processore a quell'indirizzo (?) ?
3) Sarebbe giusta la soluzione un pò furbetta di mettere x pari a y a priori e di controllare solo se il CMP mi da Z=1? Ed evitare quindi di scrivere la parte dell'ELSE...

Scusatemi dove non sono stato molto chiaro. Spero di poter essere aiutato, qualunque cosa è ben accetta.
Saluti!

6 Risposte

  • Re: Esercizio costrutto if-else

    Puoi eliminare la

    BEQ IF

    e la

    JMP FINE

    della parte ELSE ...
  • Re: Esercizio costrutto if-else

    Potresti aiutarmi in un modo più preciso? Al momento ho ancora molto da imparare sull'assembly
  • Re: Esercizio costrutto if-else

    Le due istruzioni che ti ho detto le puoi togliere perché sono superflue.

    Non ha senso usare la BEQ facendola seguire dalla BNE, per rispondere alla tua prima domanda. E la JMP alla prossima istruzione non ha senso. Non ho capito che intendi "se mi serve solo l'else" ...

    Per la domanda 2, il significato dello STOP è proprio quello di fermare il processore, altrimenti eseguiresti tutte le istruzioni presenti in memoria (che in genere non hanno senso in quanto casuali)

    Per la 3, non è detto. Se la variabile x è in realtà un registro di output fisico, combini un disastro.
  • Re: Esercizio costrutto if-else

    Hai proprio ragione! Ragionandoci sopra posso evitare di scrivere la BEQ e controllare solo con la BNE se deve andare nelle istruzioni a partire da quella con l'etichetta ELSE e togliere la JMP visto che comunque andrà allo STOP.
    
    	ORG $8000
    START	MOVE.B Q,D0
    	CMP #4,D0
    	BNE	ELSE
    IF	MOVE.B #5,D1
    	MOVE.B D1,X
    	JMP FINE
    
    ELSE	MOVE.B Y,D2
    	MOVE.B D2,X
    
    FINE	STOP #$2700
    	
    	ORG $8814
    Q	DC.B	6
    Y	DC.B	7
    X	DS.B	1
    	END START
    A proposito di STOP, in altri esercizi banali, tipo eseguire una somma, non l'ho mai usato e non mi ha mai dato nessun problema, invece per questo esercizio son stato costretto ad usarlo. E' dovuto al fatto che usi la JMP? Posso usarlo anche senza indirizzo la STOP?

    Inoltre parlandone con MAW in privato mi ha detto che è una via corretta quella del terzo punto. Non è migliore una soluzione del genere (sempre se è scritta in modo corretto)?
    
    	ORG $8000
    START	MOVE.B Y,D0
    	MOVE.B D0,X
    	CLR D0
    	MOVE.B Q,D0
    	CMP #4,D0
    	BNE FINE
    	MOVE.B #5,D1
    	MOVE.B D1,X
    
    FINE	STOP #$2700
    	
    	ORG $8814
    Q	DC.B	6
    Y	DC.B	7
    X	DS.B	1
    	END START
    
  • Re: Esercizio costrutto if-else

    Per un quadro un po' più esteso, la duplice assegnazione è una Regola Aurea nelle ISA RISC dotate di istruzioni del tipo TEST-AND-SKIP-NEXT, come ad esempio l'arcinota BTFSx dei banali PIC. In tali condizioni, la differenza logica tra i due rami del flusso di esecuzione consiste strettamente in una singola istruzione, posta immediatamente a valle della BTFSx, la quale viene saltata senza alcuna penalità prestazionale (sostituita con un NOP direttamente nella coda di prefetch) qualora il test vada a buon fine - in questo caso, se il bit indicato in un registro specificato (inclusi ovviamente i flag di carry e zero, che quindi consentono di gestire l'esito di qualsiasi confronto, caricamento e generica operazione logica a monte) è alto o basso, rispettivamente per BTFSS e BTFSC.
    Dunque, a monte del test si deve assegnare il valore di default, sovrascrivendolo poi nella istruzione sottesa alla BTFSx.
    Il tutto, ripeto, al fine di ottenere un costrutto if-equivalente senza alcuna penalità prestazionale da salto condizionato o incondizionato.

    Su altre piattaforme la regola si esporta con un ovvio degrado di validità, da Regola Aurea Assoluta (mandatory o required) a semplice suggerimento (advisory), ovunque le penalità da salto siano inevitabili per costruzione, rimanendo comunque importante.

    Come inoltre già ricordato dal nostro ottimo Oregon, nelle architetture con I/O memory mapped il "giochetto" non va certo applicato acriticamente, ma usando sempre le dovute precauzioni quando non si tratti di RAM o normali registri core: ad esempio, sulle piattaforme general purpose, è prassi comune usare un registro buffer in RAM o core, che verrà copiato nell'I/O register solo a valle dell'operazione di modifica.

    A titolo inventariale, si noti che i microcontroller dedicati offrono in genere meccanismi di prevenzione dei glitch e altre caratteristiche anche molto avanzate per la protezione dei registri di I/O e delle sequenze Read-Modify-Write, con shadow registers, buffers sdoppiati e altre metodologie.
  • Re: Esercizio costrutto if-else

    Sempre molto chiari. Non avevo dubbi che mi avreste aiutato a capire. Grazie mille
    Cercherò di ricordarmi di tutte queste cose piano piano ^^
Devi accedere o registrarti per scrivere nel forum
6 risposte