180 likes | 266 Views
5 JJ2 0: Computerarchitectuur 2M200: Inleiding Computersystemen. Sessie 2(2): Instructieformaten adressering assembleertalen (zelfstudie !). Instructieformaten: opcode + adres(sen). Adressen bepalen waar gegevens staan/komen De op eratie- code geeft aan welke instructie het is
E N D
5JJ20: Computerarchitectuur2M200: Inleiding Computersystemen Sessie 2(2):Instructieformatenadresseringassembleertalen (zelfstudie !)
Instructieformaten: opcode + adres(sen) • Adressen bepalen waar gegevens staan/komen • De operatie-code geeft aan welke instructie het is • Eigenlijke bewerking + aantal en codering adressen • Aantal adressen belangrijk criterium • 0: gegevens op vaste plaats (“implied”, “stack”) • 1: één vast register nodig ACCU ACCU + “a” • 2: veel flexibeler “a” “a” + “b” • 3: superflexibel “a” “b” + “c” • Meer adressen: complexere instructies en hardware !
Instructielengte: afwegingen... • Vaste lengte: makkelijk ophalen en decoderen (?) • Aanpassen aan langste: verspilling geheugenruimte • Korter: woekeren met bits, eenvoudige instructies • Variabele lengte: efficienter • Instructie en adressen nemen plaats in die nodig is • Veel complexer ophalen en decoderen
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Opcode Adres 1 Adres 2 Adres 3 Expanderende opcodes • Vast aantal bits variabel gebruiken, bijvoorbeeld • Opcode = 0..13: alle drie adressen bruikbaar • Opcode = 14: adres 1 wordt ‘opcode’ + 2 adressen (2,3) • Opcode = 15: adres 1+2 worden ‘opcode’ + 1 adres (3) • Vele verdelingen mogelijk, soms zeer complex ! • Optimale verdeling: Huffman algoritme (niet bij stof)
Instructieformaten practicumprocessor • Variabele lengte: 1, 2 of 3 bytes • Opcode altijd in eerste byte • Kiezen tussen R0..R7 gebruikt 3 bits in eerste byte • Kiezen tussen R0 / R1 gebruikt 1 bit in eerste byte • Bij twee instructies 3 bits in eerste byte voor adres • Ongeveer 112 verschillende instructies • Meeste instructies 0, 1 of 2 adressen • 2 instructies klassificeerbaar als 3-adres instructies
Adresseringsmodi • (Resultaat) waarden: “Operanden” • Opgesplitst in “sources” en “destinations”: “bronnen” en “bestemmingen” • Direct adres in geheugen specificeren is duur • Veel bits nodig (daarom niet altijd 3 adres machine !) • Bovendien weinig flexibel… • Ingewikkelde adresmodi voor hogere talen • Veel modi mogelijk, maar geeft complexe processor
Assembleertalen • Hoofdstuk 7 (t/m 7.1.4) van boek: zelfstudie ! • Assembleertaal:Taal om met symbolische namen de instructies en adressen van een processor te beschrijven. • Laagste niveau bruikbare programmeertaal • Per tekstregel één instructie • “Assembler” vertaalt assembleertaal in bitcodes • “Pseudo-instructies” besturen assembler zelf • Practicumprocessor: ASM504 assembler
De ASM504 assembler • Zo simpel mogelijk (maar wel snel...) • Geen “macro’s”, geen “linker” • Wijze van opschrijven: Intel Pentium vorm • Siemens SAB-C504 afgeleid van Intel 8051 processor • Destination volgt direct na opcode naam ; commentaar volgt na een puntkommaLus: ; dit is een ‘label’ ADD A,Temp ; tel waarde in Temp op bij A ORG 00FFh ; ‘ORiGin’ forceert adres van:Temp: DS 1 ; ‘Define Storage’, 1 byte
“Immediate” adressering • Nederlandse term “onmiddelijk” (bah !) • GEEN ECHT ADRES: waarde in instructie zelf • Waarde moet dus een constante zijn ! • Aantal bits varieert afhankelijk van destination • Aangeven in assembleertaal met getal of berekening die constante waarde geeft • Bij practicumprocessor een # ervoor zetten: ADD A,#41 ; tel constante 41 bij A register op
Directe adressering • Volledig adres van operand staat in instructie • Adres is dus constant ! • Waarde van operand is variabel, de plaats is vast • Hogere programmeertalen: “globale variabelen” • Assembleertaal notatievorm varieert nogal… • Bij practicumprocessor: getal of berekening die constant getal geeft zonder een # ervoor: ADD A,41 ; tel waarde in adres 41 op bij A ; adressen 0 ..127: intern geheugen ; adressen 128..255: SFR’s
Register adressering • Operand in register met symbolische naam • Registers binnen CPU: snel, daarom veel gebruikt • “load/store”: berekeningen alleen tussen registers • Beschikbare registers gegeven in ISA • Beperkingen in gebruik van registers ! • Bij practicumprocessor belangrijk: A en R0..R7 MOV R1,A ; “MOVe” copieer waarde in A naar R1MOV R2,R3 ; dit is NIET toegestaan !
Registerindirecte adressering • Operand in geheugen, adres hiervan in register • Lekker flexibel: adres niet vast, kan berekend worden • Weinig bits om adres in geheugen te specificeren ! • Soms enige mogelijkheid om geheugen te adresseren • Assembleertaal notatievormen verschillen… • Meestal geheugenadressering met haken: (R1) • Bij practicumprocessor met @ (‘at’): ADD A,@R1 ; tel waarde in intern geheugen (op ; adres in R1) op bij A register
Geïndexeerde adressering • Operand in geheugen op adres aangewezen met de som van de waarde in een register en een constante (“offset”) waarde • Aantal bits in offset varieert met bedoeling • Weinig bits: register is hoofdbepaler van adres “struct” in C, “record” in Pascal • Veel bits: register varieert (“indexeerd”) het adres “array” in zowel C als Pascal
Basisgeïndexeerde adressering • Operand in geheugen op adres aangewezen met de som van TWEE registers en (eventueel) een constante offset waarde • Het eerste register bevat (variabel) “basis” adres • Het tweede register varieert (“indexeerd”) dit adres • De offset kan het adres nog (een beetje) verschuiven • De practicumprocessor kan dit, zonder offset: MOVC A,@A+DPTR ; “MOVe Code”: laad A register ; met waarde in programmageheugen ; op adres dat som is van A+DPTR
Het kan NOG gekker (niet bij stof) • “Auto increment” en “auto decrement”: • Waarde in index register automatisch verhogen of verlagen bij iedere lees/schrijf actie • “post”: NA de actie, “pre”: VOOR de actie • “Scaled index”: • Waarde in index register wordt niet direct gebruikt, maar eerst vermenigvuldigd met een constante • Voor directe ondersteuning van “arrays”
Stack (“stapel”) adressering (1) • De stack is een “Last-In-First-Out” geheugen • “push” operatie plaatst nieuwe waarde in stackbovenop alle al aanwezige waarden • “pop” operatie verwijderd “bovenste” waarde uit stackdat is dus de laatst ge“push”te waarde ! • De bovenste waarde op de stack is de “top of stack” • Implementatie meestal in normaal geheugen • Met “stack pointer” (“SP”) register wijzend naar de top • Practicumprocessor: SP adresseert laatst ge“push”te waarde, stack “groeit” naar hogere adressen
Stack (“stapel”) adressering (2) • Stack is handig • Uitstekend geschikt voor tijdelijke opslag • Precies adres niet nodig en toch weten waar alles is • Stack is belangrijk • Centrale rol bij uitvoeren hogere programmeertalen • Bij sommige machines vervanging van registers Het boek gaat hier nog veel verder op in: zelfstudie.Het postfix-infix conversie-algoritme hoort niet bij de stof !
Adresseermodi voor “sprongen” • PC wijst steeds naar volgende instructie • Laden PC met nieuwe waarde: sprong in programma • “PC-relatief” is geïndexeerd met PC als register • Practicumprocessor als voorbeeld • PC-relatief, direct en basisgeïndexeerd (A+DPTR) • NIEUW: “paged” sprong (“AJMP”) • Geheugen verdeeld in 2 kilobyte grote blokken (“pages”) • Alleen springen binnen blok waar PC al in adresseert • Slechts 11 bits nodig voor adres (2 byte instructie)