CALCOLATORI ELETTRONICI II Roberto Palmieri [email protected] Orario Mercoledì 10:15 – 11:45 PROGRAMMA PRELIMINARE • Ripasso assembly PD32 • Integrazione PD32: Architettura e nuove istruzioni I/0 • Implementazione di metodologie di I/O • Progettazione Interfacce Input/Output • Sviluppo driver CALCOLATORI ELETTRONICI II Ripasso Indirizzamenti CEI dalle slide CEI Prof. Ciciani Modi di indirizzamento • Modi diretti – Diretto con registro – Immediato – Assoluto • Modi indiretti – – – – – Indiretto con registro Indiretto con spiazzamento Relativo Indiretto con predecremento Indiretto con postdecremento dalle slide CEI Prof. Ciciani Indirizzamento a registro Esempio: MOVL R1,R5 (significato: R1->R5) dalle slide CEI Prof. Ciciani Indirizzamento immediato • Il dato si trova in memoria immediatamente dopo l’istruzione • Esempio: MOVL #0,R5 (significato: poni 0 in R5) dalle slide CEI Prof. Ciciani Indirizzamento assoluto • Esempio: MOVB R1,1280H (sposta il byte basso di R1 nella cella di memoria di indirizzo 1280H. • Tale valore, 1280H, è memorizzato dopo l’istruzione ed è riferito da PC dopo che è stato incrementato) • Effective address = 1280H dalle slide CEI Prof. Ciciani Indirizzamento indiretto con registro • Il registro contiene l’indirizzo dell’operando (corrisponde alla nozione di puntatore nei linguaggi di programmazione) • Esempio: MOVL (R5),R1 (significato: sposta in R1 in contenuto della locazione il cui indirizzo è contenuto in R5) Indirizzamento dalle slide CEI Prof. Ciciani indiretto con registro e con predecremento • Il registro, opportunamente decrementato, contiene l’indirizzo dell’operando • Esempio: MOVL R1,-(R7) (sposta nella locazione il cui indirizzo è pari al contenuto in R7 meno 4 ciò che è memorizzato in R1) Indirizzamento dalle slide CEI Prof. Ciciani indiretto con registro e con postincremento • Il registro contiene l’indirizzo dell’operando, una volta acceduto la memoria il registro viene opportunamente incrementato • Esempio: MOVL (R7)+,R1 (sposta in R1 quanto memorizzato nella locazione il cui indirizzo è pari al contenuto in R7, dopodiché incrementare di 4 ciò che è memorizzato in R7) dalle slide CEI Prof. Ciciani Indirizzamento con spiazzamento • L’indirizzo effettivo dell’operando è la somma di un valore base (mem. in un reg.) con il valore di spiazzamento • Esempio: MOVB D(R0),R1 (significato: sposta in R1 il contenuto della cella con indirizzo D+R0) Indirizzamento dalle slide CEI Prof. Ciciani relativo • Usato nei salti, per consentire riferimenti relativi e caricare il PC con valori differenti da quelli ottenuti con semplici incrementi. • Esempio: JMP LABEL(PC) (metti nel PC quanto ottenuto dalla somma del contenuto della locazione il cui indirizzo è dato dall’etichetta LABEL con il valore corrente del PC) dalle slide CEI Prof. Ciciani Indirizzamento Riepilogo org 400h code movl #20, r1 addl r1,r1 ; r1=20, ind. immediato ; r1=40, ind. a registro movb #0FFh, 800h ;mem[0x800]=0xFF, ind. assoluto movl #800h,r2 ;r2=0x800 movb #0EEh, (r2);mem[r2]=0xEE, ind. con registro movb #0FFh, -(r2) ;r2=0x800-0x1=0x7FF, mem[0x7FF]=0xFF ;ind. con predecremento movb #0AAh, (r2)+ ;mem[0x7FF]=0xAA, r2=0x800 ;ind. con postincremento ;mem[0x808]=0xFF, r2=0x800 ;ind. con spiazzamento movb #0FFh, 8(r2) end dalle slide CEI Prof. Ciciani Confronto fra registri Aritmetica non segnata • CMPB R1,R2 (ipotesi: R1,R2>=0) – Equivale ad eseguire R2-R1 senza aggiornare R2 CMPB R1,R2 Z=0 C=1 C=0 R2-R1<0 (R1>R2) C=1 R1>R2 Z=1 R1=R2 C=0 and Z=0 R1<R2 Z=1 R2-R1>=0 R1=R2 R1<>R2 (R1<=R2) Z=0 R1<R2 not C=0 R1<=R2 Z=0 R1<>R2 Z=1 or C=1 R1>=R2 dalle slide CEI Prof. Ciciani Confronto fra registri Aritmetica segnata R1,R2 rappresentati in complemento a 2 • CMPB R1,R2 Equivale ad eseguire R2-R1 senza aggiornare R2 N=V R1>=R2 N<>V R1<=R2 CMPB R1,R2 Z=1 R2-R1=0 (R1=R2) N=V N<>V Z=0 R2-R1>=0 R1<=R2 R1<>R2 (R2>=R1) Z=0 Z=0 R2>R1 R1<R2 Z=1 R1=R2 Z=0 R1<>R2 PD32 / 1 (esercizio) Sintassi/Semantica Istruzioni: MicroOpGen Esercizio 1: Sia dato un array formato da DIM longword, allocato in memoria a partire dall’indirizzo 250H, costruire nella posizione 278H l’array reverse. PD32 / 1_1 (soluzione) ORG 400H ;*********DichiarazioneCostanti********* DIM EQU ? ARRAY1 EQU 250H ARRAY2 EQU 278H ; *********Corpo del Programma********* CODE PD32 / 1_2 (soluzione) CODE XORL R0,R0 XORL R1,R1 XORL R2,R2 MOVL #ARRAY1,R1 MOVL #ARRAY2,R2 MOVL #DIM,R0 ASLL #2,R0 ADDL R0,R2 MOVL #DIM,R0 REPEAT: MOVL (R1)+,-(R2) SUBL #1,R0 JNZ REPEAT HALT END PD32 / 1_3 (soluzione) CODE XORL R0,R0 XORL R1,R1 XORL R2,R2 MOVL #ARRAY1,R1 MOVL #ARRAY2,R2 MOVL #DIM,R0 ASLL #2,R0 ADDL R0,R2 XORL R0,R0 REPEAT: CMPL #DIM,R0 JZ FINE MOVL (R1)+,-(R2) ADDL #1,R0 JMP REPEAT FINE: HALT END PD32 / 1_4 (soluzione) ATTEZIONE!!!!! Se nella soluzione 2 non avessi spostato la CMPL #DIM,R0 in testa al ciclo avrei eseguito un ciclo ulteriore....... QUALE SAREBBE STATO IL RISULTATO? (.....qualcuno si sarebbe arrabbiato) PD32 / 1_5 Simulazione esercizio 1 DISSimulator...... PD32 / 2 (esercizio) Sintassi/Semantica Istruzioni: MicroOpGen Esercizio 2: Dato un vettore di 32 bytes unsigned memorizzato a partire dalla locazione 0x20a0, calcolare la media posizionandola nell’ultima posizione del vettore. P.S. Si tenga sotto controllo l’eventuale overflow ed in tal caso restituire il valore ff ff ff PD32 / 2_1 (soluzione) L’istruzione da controllare e’: addb (R1)+, R2 Microcodice : 1. MAR<-R1 2. R1<-R1+1 3. Temp1<-[MDR] 8 //gli 8 lsbs di MDR estesi in segno vanno in T1 4. Temp2<-[R2] 8 //gli 8 lsbs di R2 estesi in segno vanno in T2 5. ALU_OUT=Temp1+Temp2 Se (Temp1 + Temp2) >232-1 il CARRY bit viene settato per segnalare l’overflow (…ricordate che i registri sono circolari). Quindi e’ sufficiente far seguire all’operazione di somma un salto condizionato del tipo: jc error PD32 / 2_2 (soluzione) org 400h ARRAY DIM LOG2DIM loop: EQU 20a0h EQU 32 EQU 5 ; indirizzo base array ; num.elementi array ; log. base 2 di DIM code movl #DIM,R0 movl #ARRAY,R1 xorl R2,R2 ;resetta R2, risultato parziale addb (R1)+,R2 ;somma i-esimo elem. i=0..DIM-1 jc error ;bit c settato =>Overflow subl #1,R0 ;decrementa contatore jnz loop ;se contatore!=0 continua il cicla lsrb #LOG2DIM, R2;dividi per il numero di elementi, ;usiamo LSRB poichè lavoriamo con unsigned movb R2, -(R1) ;memorizza la media in ARRAY[DIM-1] jmp fine PD32 / 2_3 (soluzione) error: fine: movl #DIM, R1 addl #ARRAY, R1 subl #1,r1 xorl R3,R3 notl R3,R3 movb R3,(R1) halt end ;gestione overflow, calcola in R1 ; R1=ARRAY+DIM ; R3=111....111 ; ARRAY[DIM]=11111111 PD32 / 3 (esercizio) Sintassi/Semantica Istruzioni: MicroOpGen Esercizio 3: Sia dato un array formato da DIM byte, allocato in memoria a partire dall’indirizzo 250H e contenente numeri positivi e negativi. Restituire: – Min – Max P.S. I valori devo essere restituiti all’interno di variabili PD32 / 3_1 (soluzione) ORG 400H ;********* Dichiarazione Costanti ********* DIM EQU ? IND_BASE EQU 250H ;********* Dichiarazione Variabili ********* CONT DL 0 MIN DB 0 MAX DB 0 PD32 / 3_2 (soluzione) CODE XORL R0,R0 XORL R1,R1 MOVB IND_BASE,MIN MOVB IND_BASE,MAX repeat: MOVB IND_BASE(R0),R1 CMPB MAX,R1 ; R1 – MAX JNC swapMax CMPB MIN,R1 ;R1 – MIN JNC swapMin JMP agg swapMax: MOVB R1,MAX JMP agg swapMin: MOVB R1,MIN agg: ADDL #1,R0 MOVL CONT,R2 ;!!!! SUBL #1,R2 ;!!!! MOVL R2,CONT ;!!!! JZ fine JMP repeat fine: halt end PD32 / 4 (esercizio) Sintassi/Semantica Istruzioni: MicroOpGen Esercizio 4: dato un array di longword, ordinarlo in maniera crescente implementando l’algoritmo di ordinamento di selezione del minino (Selection Sort) PD32 / 4_1 (soluzione) Algoritmo Pseudocodice Selection Sort 1. i=0 2. Min = V[m], m:{i,…,dim-1} 3. V[m] = V[i]; V[i] = Min 4. i++; Go To 2 PD32 / 4_2 (soluzione) for (int i=0; i<DIM; i++) { min = v[i]; posMin = i; for (int j=i; j<DIM; j++) if(v[j]<v[i]) { min = v[j] posMin = j } v[posMin] = v[i]; v[i] = min; } Algoritmo Java PD32 / 4_3 (soluzione) org 400h ARRAY DIM EQU 200h EQU ? ; indirizzo base array ; num.elementi array code XORL R0,R0 ;registro posizione di inizio della ricerca del minimo XORL R1,R1 ;minimo temporaneo XORL R4,R4 ;registro contenente il dato da nalizzare iniziomin: CMPB #DIM,R0 ;R0-DIM JZ fine XORL R3,R3 ;registro di spiazzamento MOVL R0,R3 ;copio per usare R0 come spiazzamento MOVB ARRAY(R3),R1 ;inizializzo il minimo parziale PD32 / 4_4 (soluzione) ciclomin: CMPL #DIM,R3 ;R3-DIM JZ finemin MOVB ARRAY(R3) ,R4 ;R4 <= Valore corrente dell'array ADDL #1,R3 CMPB R4,R1 ;R1-R4 se R4 < R1 allora Carry = 0 ed R4 è il nuovo minimo JC ciclomin MOVB R4,R1 ;swap minimo MOVB R3,R5 ;mi salvo la posizione JMP ciclomin finemin: SUBB #1,R5 MOVB ARRAY(R0),ARRAY(R5) ;swap con il valore da ordinare MOVB R1,ARRAY(R0) ADDL #1,R0 ;aumento la posizione del vettore JMP iniziomin fine: halt end