EDA 451 - Digital och Datorteknik Dagens föreläsning: Assemblerprogrammering för FLEX, Extra material ”Ext 18” Ur innehållet: Programmerarens bild av FLEX Instruktionsuppsättning Register åtkomliga för programmeraren Datatyper Adresseringssätt Användning av adressrum Minne för program och data In- och ut- matning Assemblerprogrammering för FLEX
Programmerarens bild av FLEX Register A ACCUMULATOR A 7 B ACCUMULATOR B X INDEX REGISTER PC PROGRAM COUNTER SP STACK POINTER N Z V C 3 CONDITION CODES REGISTER Instruktioner Load/Store LDAA, LDAB, LDX, LDS, LEAX, LEAS STAA, STAB, STX, STS Data movement TFR regS,regD Program (Flow) control JMP, JSR, BRA, BSR, B(condition) Integer arithmetic/test ADDA, ADDB, ADCA, ADCB, SUBA, SUBB, SBCA, SBCB, CLRA, CLRB, CLR, NEGA, NEGB, NEG, DECA, DECB, DEX, DEC, INCA, INCB, INX, INC, CMPA, CMPB, CPX, CPS, BITA, BITB Logical operations ANDA, ANDB, ORAA, ORAB, ANDCC, ORCC, EORA, EORB, COMA, COMB, COM Shift/rotate ASLA, ASLB, ASL, ROLA, ROLB, ROL Stack operations PSHA, PSHB, PSHC, PSHX, PULA, PULB, PULC, PULX Adresseringssätt Inherent Omedelbar Absolut Register relativ Auto pre- increment/decrement Auto post- increment/decrement PC-relativ Assemblerprogrammering för FLEX
Operationer - FLEX Load/Store LDAA, LDAB, LDX, LDS, LEAX, LEAS STAA, STAB, STX, STS Data movement TFR regS,regD Program (Flow) control JMP, JSR, BRA, BSR, B(condition) Integer arithmetic/test ADDA, ADDB, ADCA, ADCB, SUBA, SUBB, SBCA, SBCB, CLRA, CLRB, CLR, NEGA, NEGB, NEG, DECA, DECB, DEX, DEC, INCA, INCB, INX, INC, CMPA, CMPB, CPX, CPS, BITA, BITB Logical operations ANDA, ANDB, ORAA, ORAB, ANDCC, ORCC, EORA, EORB, COMA, COMB, COM Shift/rotate ASLA, ASLB, ASL, ROLA, ROLB, ROL Stack operations PSHA, PSHB, PSHC, PSHX, PULA, PULB, PULC, PULX Assemblerprogrammering för FLEX
Adresseringssätt - FLEX Inherent Omedelbar Absolut Register relativ Auto pre- increment/decrement Auto post- increment/decrement PC-relativ Assemblerprogrammering för FLEX
Inherent adressering Ökande adress Operandens läge är entydigt given av instruktionen. Exempel: INCA ”Increment register A” RTS ”Return from subroutine” PSHA ”Push register A” ... PC OP-kod Styrenhet med fast kopplad logik
Omedelbar adressering OP-kod Data Ökande adress PC PC+1 Operanden följer omedelbart efter operationskoden. Exempel: LDAA #8 ”Load A immediate” CMPA #10 ”Compare contents of A with value” ... Styrenhet med fast kopplad logik
Absolut adressering OP-kod Adress Ökande adress PC PC+1 Data Operanden finns på den adress som följer omedelbart efter operationskoden. Exempel: LDAA $10 ”Load A from address” CMPA $10 ”Compare contents of A with contents of address” ... Styrenhet med fast kopplad logik
Absolut adressering Flödeskontroll OP-kod Adress Ökande adress PC PC+1 Operanden är i detta fall den adress som följer omedelbart efter operationskoden. Exempel: JMP $20 ”Jump to address” JSR $20 ”Call subroutine at address” ... Styrenhet med fast kopplad logik
Register-relativ adressering OP-kod n Data Ökande adress PC PC+1 X Operanden finns på den adress som anges av ett register. Oftast kan en konstant anges, denna adderas till innehållet i registret för adressberäkningen. Exempel: LDAA 3,X ”Load A via register X” ... Styrenhet med fast kopplad logik
Auto pre/post- decrement/increment OP-kod Ökande adress PC +/-X+/- Komplext adresseringssätt som utnyttjar något register för adressberäkning samtidigt som innehållet i registret modifieras av instruktionen. 1,-X pre decrement 1,+X pre increment 1,X- post decrement 1,X+ post increment Styrenhet med fast kopplad logik
Auto pre-decrement Exempel: LDAA 1,-X ... X - 1→X (X)→A PC OP-kod Ökande adress Exempel: LDAA 1,-X ... PC OP-kod X - 1→X A = ? A = 11 (X)→A 50 X 11 Före 51 X 22 Efter 52 33 Styrenhet med fast kopplad logik
Auto pre-increment Exempel: LDAA 1,+X ... X + 1→X (X)→A PC OP-kod Ökande adress Exempel: LDAA 1,+X ... PC OP-kod X + 1→X A = ? A = 33 (X)→A 50 11 Före 51 X 22 Efter 52 X 33 Styrenhet med fast kopplad logik
Auto post-decrement Exempel: LDAA 1,X- ... (X)→A X - 1→X PC OP-kod Ökande adress Exempel: LDAA 1,X- ... PC OP-kod (X)→A A = ? X - 1→X A = 22 50 X 11 Före 51 X 22 Efter 52 33 Styrenhet med fast kopplad logik
Auto post-increment Exempel: LDAA 1,X+ ... (X)→A X + 1→X PC OP-kod Ökande adress Exempel: LDAA 1,X+ ... PC OP-kod (X)→A A = ? X + 1→X A = 22 50 11 Före 51 X 22 Efter 52 X 33 Styrenhet med fast kopplad logik
Stack, stackpekare och stackoperationer Stack: En del av minnet som vi utnyttjar för tillfällig undanlagring. Stackpekare: Speciellt register för stackoperationer. Användning av minnet Programkod Data Register S, Stackpekare Stack Styrenhet med fast kopplad logik
Modularisering - subrutiner Huvudprogram Ett stycke kod som ”återanvänds” flera gånger. Man utför hopp ”till” och ”från” en subrutin JSR Adr Adr Subrutin JSR Adr RTS JSR Adr JSR Adr Jump to SubRoutine RTS ReTurn from Subroutine Styrenhet med fast kopplad logik
JSR/RTS Huvudprogram JSR Adr RTS JSR Adr Jump to SubRoutine S-1 S PC M(S) Adr PC OP-kod Adr JSR RTS PC Huvudprogram Stack PC S JSR Adr RTS RTS ReTurn from Subroutine M(S) PC S+1 S Styrenhet med fast kopplad logik
Spara/Återställa registerinnehåll PSH<reg> Push Register S-1 S <reg> M(S) Exempel: PSHA ”Push register A” PSHX ”Push register X” PULA ”Pull register A” PULX ”Pull register X” ... PUL<reg> Pull Register M(S) <reg> S+1 S Jämför dessa instruktioner med adresseringssätten ”pre decrement” och post increment”. Styrenhet med fast kopplad logik
Programräknar-relativ (PC-relativ) OP-kod Offset Ökande adress PC PC+1 Adress Operanden utgörs av en offset som följer omedelbart efter operationskoden. Exempel: BRA Adr ”Branch” jfr: ”Jump” BSR Adr ”Branch to subroutine” ... Adressberäkningen sker för PC+2. Adress = Offset + (PC+2) Styrenhet med fast kopplad logik
Offsetberäkning, PC-relativ adressering OP-kod Adress2 Adress1 BRA Label 30 18 31 32 33 34 35 36 37 72 Exempel: Bestäm ”Offset” för de fall ”Label” är ”Adress2” resp. ”Adress1” i vidstående figur. Lösning: Offset = Label - (PC+2) Offset = Adress2 - (PC+2) = = 72 – (33+2) = 3D Offset = Adress1 - (PC+2) = = 18 – (33+2) = E3 Styrenhet med fast kopplad logik
EXECUTE – ”BRA <offset>” Programräknare , som här pekar på offset-byten adresserar minnet, placeras också i T-registret för kommande offsetberäkning EXECUTE – ”BRA <offset>” Offseten (M), adderas till offsetens adress(T), slutligen läggs 1 till, dvs PC-offseten beräknas från nästa instruktions op-kod, placeras i R State nr RTN-beskrivning Styrsignaler PC→MA, PC→T OEPC, LDMA, LDT. 1 M+T+1→R MR, f3, f1, g0, LDR. 2 R→PC OER, LDPC, NF Ny adress (från R) placeras i PC och EXECUTE-fasen avslutas. Operationskod: 5A, tillståndskodningar: I5A*Q5, I5A*Q6, I5A*Q7 Styrenhet med fast kopplad logik
Villkorligt programflöde loop if (A=0) Z-flag ← 1; else Z-flag ← 0; A -1→ A ... DECA BNE loop A=0? JA VILLKORSTEST: if (Z-flag=0) PC ← PC+offset; else (PC ← next OP); NEJ Styrenhet med fast kopplad logik
Villkorstest, EXECUTE – ”BNE <offset>” BNE Branch Not Equal Instruktion: BNE Adr RTN: If Z = 0: PC+Offset PC Flaggor: Påverkas ej. Beskrivning: Testar Z-flaggans värde. Om Z=0 utförs ett hopp till adressen Adr = PC+Offset. Offset räknas från adressen efter branchinstruktionen, dvs vid uträkningen av hoppadressen pekar PC på operationskoden direkt efter branchinstruktionen i minnet. Om Z=1 utförs inget hopp. Nästa instruktion blir i så fall den direkt efter branchinstruktionen i minnet. Instruktionsformat: OP-kod, PC-rel offset Operationskod: 5E Observera att de två första tillstånden är identiska för samtliga villkorliga BRANCH-instruktioner Programräknare, som här pekar på offset-byten adresserar minnet, placeras också i T-registret för kommande offsetberäkning State nr RTN-beskrivning Styrsignaler PC→MA, PC→T OEPC, LDMA, LDT. 1 M+T+1→R, PC+1→PC MR, f3, f1, g0, LDR, IncPC. 2 If (Z=0) : R→PC; OER, LDPC=Z’, NF. Offseten (M), adderas till offsetens adress(T), slutligen läggs 1 till, dvs PC-offseten beräknas från nästa instruktions op-kod, placeras i R Ny adress (från R) placeras i PC ENDAST om LDPC aktiverats, dvs Z=0 och EXECUTE-fasen avslutas. Skillnaden i EXECUTE-fasen mellan villkorliga BRANCH-instruktioner är flaggtestet Styrenhet med fast kopplad logik
Villkorstest Instruktionsuppsättningen för FLEX-processorn har ett antal villkorliga hoppinstruktioner. De kan indelas i följande tre grupper: 1. Enkla villkor. Test av ett 8-bitars tal. Vid de enkla villkorliga hoppen testas innehållet i en av flaggvipporna N, Z, V eller C och hoppet utförs om villkoret är uppfyllt, dvs den aktuella flaggvippans värde, är 0 resp 1. 2. Villkor för tal utan inbyggt tecken. Jämförelse mellan två 8-bitars tal som tillhör intervallet [0, 255]. Flaggor C och Z används här. 3. Villkor för tal med inbyggt tecken. (2-komplementform) Jämförelse mellan två 8-bitars tal som tillhör intervallet [-128,127]. Flaggor N, V och Z används här. Styrenhet med fast kopplad logik
Enkla villkor Instruktion Operation Flagg-villkor Antag att ett tal ’P’ har testats, och flaggorna påverkats av testinstruktionen Instruktion Operation Flagg-villkor BEQ (Branch on Equal) Om ’P’ är 0 Z=1 BNE (Branch if Not Equal) Om ’P’ är skilt från 0 Z=0 BMI (Branch on Minus) Om ’P’ är mindre än 0 N=1 BPL (Branch on Plus) Om ’P’ är större eller lika med 0 N=0 Styrenhet med fast kopplad logik
Villkor, tal utan tecken Vi tolkar ’P’ och ’Q’ som tal utan tecken. Antag att en jämförelse utförts enligt ’P’ – ’Q’ → (Z,C), (flaggorna Z och C påverkats av instruktionen) Instruktion Operation Flaggvillkor BLO (Branch if LOwer) även BCS (Branch if Carry Set) Om ’P’ är mindre än ’Q’ C=1 BLS (Branch if Lower or Same) Om ’P’ är mindre än ’Q’ eller ’P’ är lika med ’Q’. C=1 eller Z=1 BHI (Branch if Higher) Om ’P’ är större än ’Q’ C=0 och Z=0 BHS (Branch if Higher or Same) även BCC (Branch if Carry Clear) Om ’P’ är större än ’Q’ eller ’P’ är lika med ’Q’. C=0 Styrenhet med fast kopplad logik
Villkor, tal med tecken Instruktion Operation Flaggvillkor Vi tolkar’P’ och ’Q’ som tal med tecken. Antag att en jämförelse utförts enligt ’P’ – ’Q’ → (N,Z,V), (flaggorna påverkats av instruktionen) Instruktion Operation Flaggvillkor BLT (Branch if Less Than) Om ’P’ är mindre än ’Q’ NV =1 BLE (Branch if Less than or Equal) Om ’P’ är mindre än ’Q’ eller ’P’ är lika med ’Q’ NV =1 eller Z=1 BGT (Branch if Greater Than) Om ’P’ är större än ’Q’ NV =0 eller Z=0 BGE (Branch if Greater or Equal) Om ’P’ är större än ’Q’ eller ’P’ är lika med ’Q’ NV =0 Förklara här varför inte bara N används ... Styrenhet med fast kopplad logik
FLEX- simulator Minne för program och data Assemblerprogrammering för FLEX
FLEX och omvärlden Periferienheter Dataväg Styrenhet Processor Adressbuss Dataväg CP Reg MA LDMA CP Reg A CP Reg B CP Reg T CP Reg X CP S CP PC LDA LDB LDT LDX IncS IncPC DecS LDPC D E LDS Funkt Flaggor ALU 1 1 M U X Cin g2 1 C 2 U MUX Periferienheter C 3 1 2 CP Reg R CP Reg CC LDR LDCC g1 g0 1 1 1 1 1 OEA OEB OER 1 OECC 1 OEX OES OEPC Ñ Ñ Ñ Ñ Ñ Ñ Ñ Databuss CP Reg I LDI 30 st styrsignaler från styrenhet Flaggor Styrbuss Reset Styrenhet MW CP MR Processor Assemblerprogrammering för FLEX
Periferienheter Adressbuss Databuss Styrbuss Periferi-enheter Enhet som ansluts till centralenhetens buss-system kallas ”periferienhet”. För varje periferienhet finns ett gränssnitt för in- och ut-matning (IO-interface) Adressbuss Databuss Styrbuss Periferi-enheter Minnes-system Gräns-snitt Gränssnitt Assemblerprogrammering för FLEX
Parallell utmatning Typisk tillämpning ”PÅ/AV” ”0” ”1” IO Interface Styrbuss Databuss ”1” ”0” Typisk tillämpning ”PÅ/AV” IO Interface (Ut-port) LD Logik Data Register OE LED (Light Emitting Diode) AV PÅ Assemblerprogrammering för FLEX
Parallell inmatning Typisk tillämpning: Avläs ”PÅ/AV” AV PÅ ”1” ”0” 5V Styrbuss Databuss ”1” ”0” 5V IO Interface (In-port) OE Logik Data Register LD PÅ AV Assemblerprogrammering för FLEX
FLEX - Minnesdisposition A7 A6 A5 A4 A3 A2 A1 A0 00 01 FD 1 1 1 1 1 1 1 Port1 FE 1 1 1 1 1 1 1 Port2 Minne för program och data Port1Enable = A7A6A5A4A3A2A1’A0 Port2Enable = A7A6A5A4A3A2A1A0’ FC MemoryEnable = Port1Enable’ & Port2Enable’ FD IO Portar FE IO FF RESET Startadress Assemblerprogrammering för FLEX
Port 1 - Avkodningslogik MW A0 & A1 1 & FDUT A2 ”1” A3 A4 & FDIN A5 A6 ”1” A7 MR Assemblerprogrammering för FLEX
Port 2 - Avkodningslogik MW A0 & 1 A1 & FEUT A2 ”1” A3 A4 & FEIN A5 A6 ”1” A7 MR Assemblerprogrammering för FLEX
FLEX - Realisering Port 1 Port 2 Adressbuss Databuss Styrbuss MW MR D0 A0 D1 A1 D2 A2 D3 A3 D4 A4 D5 A5 D6 A6 D7 A7 MW MR CE D0 LD D1 OE D2 D3 D4 D5 D6 D7 Logik CPU MINNE Port 1 Port 2 Adressbuss Databuss Styrbuss Assemblerprogrammering för FLEX
Periferikretsar STAA $FD LDAA $FD Assemblerprogrammering för FLEX
7-segment NBCD → 2×7-segment b7 b6 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 Assemblerprogrammering för FLEX
EXEMPEL – ”Rinnande ljus” Assemblerdirektiv ”ORG” – (Origin) Raden är en kommentar ”label” symbol för adress Listfilen skapas vid assembleringen Referens till symbolisk adress Assemblerprogrammering för FLEX
Ytterligare Assemblerdirektiv Assemblerdirektiv ”EQU” – (equate) Assemblerdirektiv ”FCB” – (form constant byte) Assemblerprogrammering för FLEX