Esercitazione del 15 Dicembre 2010
Il processore 68k
16 registri:
D0-D7 registri dati, aggiornano i bit di zero, carry, overflow
A0-A7 registri indirizzi. A7: stack pointer. (In alcuni processori è doppio, per U o S)
Istruzioni
#DEFINE Data Code
Es 1
int a=5;
int b=3;
if(a>b){
b=1;
}
Suffissi:
.B -> Byte -> Char .W -> Word -> Short Int .L -> Long -> Int
Traduzione
CODE EQ 0 DATA EQ 1 SECTION DATA ORG $1000 A DC.L 5 B DC.L 3 SECTION CODE
ORG $1008 //Le due declare.long occupano 4 byte ciascuna START MOVE.L A.D0
MOVE.L B.D1 CMP.L DO,D1 BLE IF_END
MOVE.L #1,D2 MOVE.L D2,B END MOVE.L #9,D0
IF_END TRAP #15 //Istruzione per chiamare una SVC END START
Es 2
INT a=5;
INT b
IF(a>0 && a<=5) b=a;
ELSE b=0;
Traduzione
CODE EQ 0 //Allocazione segmento codice DATA EQ 1 //Allocazione segmento dati SECTION DATA //Inizio sezione dati ORG $1000 //Origine segmento dati
A DC.L 5 //Dichiaro una costante long uguale a 5 B DS.L 1 //Dichiaro un long di spazio
SECTION CODE START ORG $1008
MOVE.L A,D0
CMPI.L #0,D0 //Per negare la condizione
ab
a bBLE ELSE CMPI.L #5,D0 BGT ELSE MOVE.L A,D2 MOVE.L D2,B BRA OUT ELSE MOVE.L #0,D3
MOVE.L D3,B OUT MOVE #9,D0
TRAP #15 //Chiamo la SVC a fine codice END START //Parcheggio l’entry point
Es 3
INT VALORE;
INT VALORI[5];
INT I;
VALORI[0]=1;
VALORI[1]=2;
VALORI[2]=3;
VALORI[3]=4;
VALORI[4]=5;
VALORE=2;
WHILE(i<5&&VALORI[i]!=VALORE)i++;
Traduzione
CODE EQ 0 DATA EQ 1 SECTION DATA ORG $1000
VALORE DS.L 1 //4 parole VALORI DS.L 5 //20 parole
I DS.L 1 //4 parole. Totale 28. 28->1C in Hex SECTION CODE
ORG $101C
MOVEA.L #VALORI,A0
MOVE.L #1, (A0)+ //Sposta all’indirizzo di A0 e lo incrementa MOVE.L #2, (A0)+
MOVE.L #3, (A0)+
MOVE.L #4, (A0)+
MOVE.L #5, (A0) MOVE.L #2, D0 MOVE.L D0, VALORE MOVE.L #0, D1 MOVE.L D1, I
MOVEA.L #VALORI,A1 CICLO MOVE.L I,D1
CMP.I #5,I BGE END_WHILE VALORI[i]==VALORE MOVE.L (A1)+,D2 MOVE.L VALORE, D3 CMP.L D2,D3
BEQ END_WHILE
MOVE.L I,D4 //Eseguo il ciclo ADDI.L #1,D4
MOVE.L D4,I BRA CICLO END_WHILE MOVE #9, D0
TRAP #15 END START
Es 4
INT VALORE;
INT VALORI[5];
INT I;
VALORI[0]=5;
VALORI[1]=2;
VALORI[2]=1;
VALORI[3]=3;
VALORI[4]=4;
MINIMO=VALORI[0];
FOR(i=0,i<5,i++) {IF(VALORI[i]<MINIMO) MINIMO=VALORI[i];
}
Traduzione
CODE EQ 0 DATA EQ 1 SECTION DATA ORG $1000
MINIMO DS.L 1 //4 parole VALORI DS.L 5 //20 parole
I DS.L 1 //4 parole. Totale 28. 28->1C in Hex SECTION CODE
ORG $101C
MOVEA.L #VALORI,A0
MOVE.L #5, (A0)+ //Sposta all’indirizzo di A0 e lo incrementa MOVE.L #2, (A0)+
MOVE.L #1, (A0)+
MOVE.L #3, (A0)+
MOVE.L #4, (A0) MOVE.L VALORI,D0 MOVE.L D0, MINIMO MOVEA.L #VALORI,A1 MOVE.L #0, D1
MOVE.L D1, I //Inizializzazione FOR MOVE I, D1
CMPI.L #5,D1 BGE OUT
IF MOVE.L MINIMO, D2 MOVE.L (A1)+, D3 CMP D2, D3
BGE END_IF
MOVE.L D3, MINIMO END IF MOV.L I, D4
ADDI.L #1, D4 MOVE.L D4, I BRA FOR
OUT MOVE.L #9, D0 TRAP #15 END CODICE