TDT4160 Datamaskiner Grunnkurs Forelesning 21.11 Adresseringsmodi Kap 5.4
Dagens tema Adresseringsmodi (5.4) Hva? Gjennomgang av 6 forskjellige modi Bruk av stakk Eksempler
Repetisjon: Instruksjonsformat Assembler: ADD R1, R2, R3 Maskinkode: 101010111001011010100. Instruksjonsformatet forteller hvilke bits som tilsvarer hva Generelt: Opkode + Adresser til operander Hvor mange operander er eksplisitt? Implisitt: Gitt av opkode eller annen operand Operander kan være registre eller hovedlageradr. Hvor mange kan være hovedlageradresser?
Adresseringsmodi Hvordan skal vi oppgi en operand? Adresseringsmodus Regel for tolking av adressefelt Mål: Effektiv adresse Peker på operand Spesifiseres av opkode eller eget modus-felt i instruksjonen Forskjellige operander i samme instruksjon kan ha forskjellig adresseringsmodus
Immediate adressering Operanden ligger direkte i instruksjonen Er dermed tilgjengelig uten videre Størrelse på operand begrenset av feltlengde Kan bare brukes til konstanter verdi bestemmes ved kompilering R0 R1 R2 R3 Opkode ALU 0 1 2 4 5 6 8 9 10 12 13 14 3 7 11 15
Direkte adressering Instruksjonsfelt inneholder hovedlageradresse Feltlengde begrenser adresseområde R0 R1 R2 Opkode 0 1 2 4 5 6 8 9 10 3 7 11 Adresse bestemt ved kompilering lite fleksibelt Kan f.eks. bli brukt for globale variable R3 ALU 12 13 14 15
Registeradressering Instruksjonsfelt inneholder registernummer Veldig mye brukt R0 Opkode 0 1 2 3 RISC-ark. bruker nesten bare registeradressering Feltlengde begrenser antall registre R1 R2 R3 ALU 4 5 6 8 9 10 12 13 14 7 11 15
Register-indirekte adressering Instruksjonsfelt inneholder registernummer Register inneholder hovedlageradresse Kalles peker Registernummer krever færre bit enn hovedlageradresse Fleksibelt R0 R1 R2 R3 Opkode ALU 0 1 2 4 5 6 8 9 10 12 13 14 3 7 11 15
Eksempel: Registerindirekte Bruker ( P4 Instr): Immediate MOV R1, #0 Registeradressering MOV R1, #0 Register-indirekte ADD R1, (R2)
Indeksert adressering Instruksjonsfelt inneholder registernummer Register inneholder adresse1 Instruksjonsfelt inneholder adresse2 adresse1 + adresse2 = hovedlageradresse Tilsvarende som for lokale variable i Mic-ark (LV + variabelnummer) R0 R1 R2 R3 Opkode + ALU 0 1 2 4 5 6 8 9 10 12 13 14 3 7 11 15
Eksempel: Indeksert adresser. Har to array, A og B, på 1024 ord hver Skal beregne A i AND B i for alle par Skal dessuten bruke OR mellom alle resultat
Baseindeksert adressering Instruksjon inneholder to registernummer Hovedlageradresse er summen av innholdet i disse to registrene Kan ha offset i tillegg Eksempel MOV R4,(R2+R5) R0 R1 R2 R3 Opkode + ALU 0 1 2 4 5 6 8 9 10 12 13 14 3 7 11 15
Dagens oppgave Hovedlager Adresse Verdi 0 71 1 54 2 12 3 86 4 28 5 56 6 3 7 8 8 13 9 7 10 45 11 82 Registre Registernr Verdi R0 5 R1 15 R2 8 R3 7 R4 8 R5 55 R6 9 R7 35 Følgende instruksjoner skal utføres etter hverandre. Skriv ned hvilke registre hver enkelt instruksjon endrer og hva sluttverdiene til R4, R5, R6 og R7 vil være. Antall er en variabel med verdi 4. I1 PUSH R4 I2 MOV R5, #antall I3 MOV R7, (R5) I4 POP R5 I5 MOV R6, 1(R5) I6 MOV R7, 10 (Tips: I6 bruker bl.a. direkte adr.)
Stakkadressering Har sett: Kort instruksjonsformat er bra Optimalt i så måte er 0-adresseinstruksjoner Dvs. bruk av stakk (Stakk ligger i hovedlager og derfor litt tregt) Bruk av stakk krever omforming av uttrykk Normalt: Infix 2 + 3 Stakk: Postfix 2 3 + Kode: Push 2, Push 3, Add
Infix vs. Omvendt polsk notasjon (RPN) Trenger ikke operator-presedens Trenger ikke parenteser
Infix til postfix (Dijkstra) 1. Examine the next element in the input. 2. If it is an operand, output it. 3. If it is an opening parenthesis, push it onto the stack. 4. If it is an operator, then If the top of the stack is an opening parenthesis, then push the operator. If it has higher priority than the top of the stack, then push the operator. Else, pop operation from stack to output, and repeat step 4. 5. If it is a closing parenthesis, pop operators to the output until an opening parenthesis is encountered. Pop and discard the opening parenthesis. 6. If there is more input, go to step 1. 7. If there is no more input, unstack the remaining operands. (Stallings 5 th ed, 2000)
RPN og stakk
Adresseringsmodi og hoppinstruksjoner Må kunne oppgi hvor man (evt.) skal hoppe Dvs. hovedlageradressen til målinstruksjonen Hvilke modi kan brukes? Direkte, men 32-bits adresser krever stort format Register-indirekte Indeksert Mest vanlig: PC-relativ. Indeksert med basen implisitt gitt av PC. Trenger dermed bare offset i adresse. Tilsvarer hopp tilbake 20 instruksjoner o.l.
Opkoder/adr.modi (1/2) Få instruksjonsformat, fast lengde Alle instruksjoner tillater alle adresseringsmodi Alle registre kan brukes i register-relaterte adresseringsmodi Gjør jobben enklere for kompilator
Opkoder/adr.modi (2/2) Direkte adressering: Hovedlageradr. i instruksjon Eksempel: 2-adresseinstruksjon der begge operander kan bruke direkte adressering MODE bestemmer adresseringsmodus REG og OFFSET brukes bare i visse modi Variabel instruksjonslengde alt etter om 0, 1 eller 2 operander bruker direkte adressering
Eksempel: Pentium 4 Mange adresseringsmodi Men: Alle modi kan ikke brukes til alle instruksjoner Bare visse register kan brukes til visse modi
P4: MOD- og R/M-felt Å skrive en kompilator som til enhver tid bruker det mest optimale adresseringsmodi, er ikke helt enkelt
Eksempel: UltraSPARC III Alle instruksjoner bruker immediate eller registeradressering Register: 5 bit gir registernummer Immediate : 13 bits konstant i instruksjon Unntak: LOAD/STORE (+ en spesialinstr.) Indeksert, 13 bits offset Baseindeksert, sum av to registerverdier