330 likes | 508 Views
CALCOLATORI ELETTRONICI II. Roberto Palmieri palmieri.rob@gmail.com 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.
E N D
CALCOLATORI ELETTRONICI II Roberto Palmieripalmieri.rob@gmail.comOrarioMercoledì 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)
dalle slide CEI Prof. Ciciani Indirizzamento indirettocon 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)
dalle slide CEI Prof. Ciciani Indirizzamento indirettocon 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)
dalle slide CEI Prof. Ciciani Indirizzamento 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 ; r1=20, ind. immediato addl r1,r1 ; 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 movb #0FFh, 8(r2) ;mem[0x808]=0xFF, r2=0x800 ;ind. con spiazzamento 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 C=1 R1>R2 Z=1 R1=R2 C=0 and Z=0 R1<R2 CMPB R1,R2 Z=0 C=1 Z=1 C=0 R2-R1<0 (R1>R2) not R1=R2 R1<>R2 R2-R1>=0 (R1<=R2) C=0 R1<=R2 Z=0 R1<>R2 Z=1 or C=1 R1>=R2 Z=0 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 Z=1 R1=R2 Z=0 R1<>R2 CMPB R1,R2 Z=0 Z=1 N<>V N=V R2-R1=0 (R1=R2) R1<=R2 R1<>R2 R2-R1>=0 (R2>=R1) Z=0 Z=0 R1<R2 R2>R1
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 : • MAR<-R1 • R1<-R1+1 • Temp1<-[MDR] 8 //gli 8 lsbs di MDR estesi in segno vanno in T1 • Temp2<-[R2] 8 //gli 8 lsbs di R2 estesi in segno vanno in T2 • 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 EQU 20a0h ; indirizzo base array DIM EQU 32 ; num.elementi array LOG2DIM EQU 5 ; log. base 2 di DIM code movl #DIM,R0 movl #ARRAY,R1 xorl R2,R2 ;resetta R2, risultato parziale loop: 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: movl #DIM, R1 ;gestione overflow, calcola in R1 addl #ARRAY, R1 ; R1=ARRAY+DIM subl #1,r1 xorl R3,R3 notl R3,R3 ; R3=111....111 movb R3,(R1) ; ARRAY[DIM]=11111111 fine: halt end
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) 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 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
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 • i=0 • Min = V[m], m:{i,…,dim-1} • V[m] = V[i]; V[i] = Min • i++; Go To 2
PD32 / 4_2 (soluzione) Algoritmo Java 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; }
PD32 / 4_3 (soluzione) org 400h ARRAY EQU 200h ; indirizzo base array DIM EQU ? ; 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