170 likes | 411 Views
HC11 & Programmering i Assembler. Högnivå språk. Maskin kod. Assembler. MCU. Maskinkod (Binärkod). De kombinationer av 1:or och 0: som finns lagrade i programminnet och som processorn jobbar med. Representerar de instruktioner och data som processorn förstår och kan utföra.
E N D
HC11 & Programmering i Assembler Högnivåspråk Maskinkod Assembler MCU
Maskinkod (Binärkod) • De kombinationer av 1:or och 0: som finns lagrade i programminnet och som processorn jobbar med. • Representerar de instruktioner och data som processorn förstår och kan utföra Ex (i hexadecimal form). CE10008610A7218604A723 Maskinkoden är dock svårförståelig för oss människor så vi har satt namn på de kombinationer som representerar instruktioner; Assembler.
Assembler • Ett slags programmeringsspråk som använder ordliknande symboler • Assemblatorn översätter ”orden” till talvärden (asm maskinkod) • Syntax och symboler assemblatorspecifika. Ex. CE10008610A7218604A723 CE1000 = ldx #0x1000 ;Ladda indexregister X med 0x10008610 = ldaa #0x10 ;Ladda AccA med värdet 10A721 = staa 0x21,x ;Lagra värdet i AccA på adressen 0x21 + det värde som finns i indexregister X.8604 = ldaa #0x04A723 = staa 0x23,x
Syntax LABEL OPKOD OPERAND(ER) ;KOMMENTAR Ex START LDAA #0x0F ;Start av program STAA 0xFF ADDA 0x0F BRA START ;Hoppar till START • Label: Förbättrar läsbarheten, Ger oss möjlighet att hänvisa till olika delar av koden. Skiljer på versaler/gemener • Opkod: (Mnemoniac): Instruktionerna i ”kompakt engelsk form”. • Operanderna: 0 – 3 st. Separeras med komma. Uttryck tillåtna. T.ex: LDAA #VAR1 + 3
Operander • Normalt adresser (syftar till adressernas innehåll)Ex: BRA 0x0F BEQ START ADDA 0xFF ;Adderar AccA med värdet som finns på adressen 0xFF. Resultatet AccA • # indikerar ett värde/konstantEx: ADDA #0xFF ;Adderar AccA med 0xFF. Resultatet AccA • Representation. 5 sorter:
HC11 & Assembler • Ur programmeringssynpunkt består HC11:an av adresskartan + arbetsregister • Assemblerprogrammering består (till 99 %) av manipulering och förflyttning av data i arbetsregistren och på adresskartan. • Arbetsregistren finns INTE på adresskartan.Åtkomst sker via speciella instruktioner. Ex: LDAA #0x33 • Länkfilen berättar för länkaren var olika programsegment ska placeras
Arbetsregistren/Accumulatorer • 7 till antalet. Ligger alldeles intill ALU:n. Instruktioner på dessa är snabba… • Accumulator A, 8 bitar • Accumulator B, 8 bitar • Accumulator D (Acca + AccB) , 16 bitar • Indexregister X, 16 bitar • Indexregister Y, 16 bitar • Stackpekaren, 16 bitar • Programpekaren, 16 bitar • Statusregistret, 8 bitar Se HIP s 3.1.7
Asseblerdirektiv 1 • Förutom assemblerinstruktioner innehåller assemblerkod assemblerdirektiv, direktiv till assemblatorn hur den ska ”bete” sig i vissa lägen. Jämförbar med # i C. • Bl. a: • Var i minnet ska kod placeras • Definitioner • Andra kod-filer som ska inkluderas m.m • Används av både assemblator och länkaren
Assemblerdirektiv 2 • EQU / DEFINE CONFIG EQU 0X903F • NAME • PUBLIC PUBLIC ANOTHER_FUNCTION • RSEG RSEG CODE ;Överlåter åt länkaren att placera koden där länkfilen beskriver. • ORG ORG 0x1000 ;Absolut adressering • DS.B / DC.B Array1 DS.B 10 • END • IF / ELSE / ENDIF
Assemblerinstruktioner In/ut ur register/minne LDAA, STAB Flytta, Byta TAB, TBA, TSX Stacken PSHB, PULA Matematiska ADDA. SUBB, MUL, IDIV Öka/Minska INCA, DECB Jämförelse CBA, CMPA Logiska/Bitmanipulera ANDB, ORAA, NEGB, BCLR Skift LSLA, LSRA, ROLA, ASLA Programflöde grenval BNE, BEQ, BHI, BLO (tittar på statusregistret) subrutin JSR, RTS, JMP, RTI Övrigt NOP
Adresseringssätt(mode) • Immediate Själva värdet som argument LDAA #0xAA • Extended Adressen (2 byte) som argument LDD 0xBB00 • Direct Adressen (1 byte) som argument LDAA 0x33 • Indexed Adressen som finns i ett indexregister(2 byte) + offset LDD 4,x • Inherent Verkar enbart på registren INCB • Relative Adressen är ett offset från PC BEQ LIKA (i praktiken låter man assemblatorn beräkna offset)
Statusregister 1 • Innehåller flaggor(bitar) som indikerar status och resultat av vissa instruktioner • Bit Namn Instruktion som påverkarC Carry ADD, SUBV 2:nd Complement overflowZ Zero SUB, CMPN Negativ SUB, ADDH Half Carry ADDS, X, I Indikerar/styr bl.a. interrupt
Statusregister 2 • Många instruktioner läser bitar i statusregistret och agerar utifrån värdet. • Ex: BEQ, BNE, BPL osv. Tittar på bl.a Z & N- flaggorna.
Ex. Instruktioner • LDA • STA • CMP • BEQ • BRA / JMP • JSR / RTS
Subrutiner Ex: Main LDAA #0xFF JSR my_function STAA my_variable ;0xAA sparas till ;my_variable . . My_function LDAA #0xAA RTS END
Länkfilen • Berättar för länkaren var olika avsnitt i koden ska läggas: • Variabler bör tex läggas på adresser där programmet får ändra värdena (RAM) • Programmet/Konstanter bör läggas på adresser där det finns minne som behåller informationen även efter ett strömavbrott (ROM), liksom interruptvektorerna • Berättar också vilken processor
Exempel TINY Tiny.S07 ;A nonsens exampleprogram!! NAME main PUBLIC main RSEG TDATANUMBER DS.B 1BUFFER DS.B 10 RSEG TCODEmain LDS #0xFF LDX #NUMBER LDY #BUFFERfinish BRA finish END Tinyvect.S07 EXTERN main RSEG TCODEdummy RTI RSEG INTVECT DC.W dummy DC.W dummy DC.W dummy . . DC.W main ;resetvector END Tiny.xcl -c68hc11-Z(CODE)INTVECT=FFD6 ;Vectortabellen-Z(CODE)TCODE=E000 ;Programkoden börjar på adress 0xE000-Z(DATA)TDATA=0 ;Variablerna staplas efter vaandra med start på 0x0000