Datorteknik
Tomas Nordström
Föreläsning 3
För utveckling av verksamhet, produkter och livskvalitet.
Föreläsning 3 (+4?)
•  Assembler
•  ARM
•  Instruktioner
2
Assembler
•  Vi har sett hur man kan skriva in kod genom att
skriva direkt i 1:or och 0:or. Ganska omständligt.
Lätt att göra fel. Ingen "intuitiv" koll på vad koden
gör. Bättre: Översätt varje rad till något vi själva
förstår.
•  En översättning från 1:or och 0:or till ord som ger
en bättre känsla för vad instruktionen gör,
mnemonics. Ett datorprogram översätter dessa
ord till 1:or och 0:or. "Språket" man då skriver i
kallas assembler.
3
Assembler forts.
•  Programmering mha instruktioner som är CPUberoende.
•  Rader i koden kan ges olika namn – labels/
programlägen
•  Assembler är ett programmeringsspråk för
programmering på lägsta, hårdvaranära nivån.
Programmering sker med sk. instruktioner. De
instruktioner som finns beror på hårdvaran.
Assembler är alltså ett maskinberoende språk.
Språket klassas som lågnivåspråk.
•  Alla grundkonstruktioner från högnivåspråk t ex
while, for, if måste skapas utifrån existerande
instruktioner.
4
ARM - Programmers model
•  Direktiv/instruktioner
•  Speciell "kod", assemblerdirektiv, finns för att hjälpa till vid
översättningen (assembleringen) till maskinkod (1:or och
0:or)
•  Assemblerdirektiven är inte processorspecifika, utan
assemblerspecifika.
•  Typiska sådana direktiv (uppmaningar) till assemblatorn är:
•  Säga var koden börjar resp. slutar. ORG resp. END
•  Definiera upp logiska namn på konstanter som används ofta EQU
•  Sätta logiska etiketter, labels, på vissa rader (programlägen som då
blir minnesplatser dit man kan referera)
•  Säga var koden skall hamna fysiskt i minnet
5
Assembler - exempelkod
; Memory Postions ------------------------------!
START
EQU
0x20000000 ; Start av SRAM!
PIOA_PER EQU
0x400E0C00 ; PIO Enable Register!
PIOA_PDSR EQU
0x400E0C3C ; Pin Data Status Register!
; Initiation code ------------------------------!
THUMB!
ORG
START
!
; Initiate PortA input ------------------------!
MAIN
LDR
R0,=PIOA_PER!
LDR
R1,=0XC0000!
STR
R1,[R0]
; enable PIOA!
LDR
R0,=DATA1
; Let R0 point to data!
; Read and manipulate data from portA (buttons)!
LDRb R1,[R0]
; load data into R1!
SUB
R1,R1,#1
; adjust data!
MOV
R5,#1
; set bit 0 to 1!
MOV
R6,R5, LSL R1
; shift the one R1 number of times!
AND
R6,R6,#0x0F
; mask out bit 0-4 in R6!
LDR
R2,=PIOA_PDSR!
LDR
R3,[R2]
; read portA/buttons !
LSR
R3,R3,#18
; move buttonflags to bit 1-0!
AND
R3,R3,#0x3
; mask buttons!
ORR
R3,R3,R6
; merge data!
SLUT
STRb R3,[R0]
; save data!
STOP
B
STOP!
DATA1
DCB
4!
DATA2
DC8
1!
END!
6
ARM assembler
Vanligaste direktiv för ARM
•  Namn EQU tal
; Ersätter namnet Namn med talet tal.
; OBS! Tar ingen minnesplats
•  Namn DCB tal
; Deklarerar en byte i minnet på den adress
; där Namn hamnar
•  Namn DS8 X
; Reserverar plats för X antal 8-bitars resp
•  Namn DS32 X
; 32-bitars tal på den adress där Namn hamnar
•  ORG X
; Låter koden efteråt börja på adressen X
•  END
; Avslutar assemblerkoden
7
Assemblering
•  Översättningen från assembler till maskinkod sker
med en teknik som heter 2-stegs assemblering.
•  Pass l -Första genomgång:
Hela koden gås igenom en gång och bestämmer vilka
adresser alla labels ska ha. Dessa lagras i det som kallas en
symboltabell. Går att räkna ut mha ORG-direktiven
•  Pass2 - Andra genomgång:
Översätter koden till maskinkod samt ersätter "lablama"
med resp. adress från symboltabellen. Färdig!
8
Assembler vs Maskinkod
• 
• 
• 
• 
• 
Assemblerkod – Program som
mha mnemonics beskriver ett
vilka maskininstruktioner som
ska utföras, använder
adressoberoende labels.
Utvecklas oftast inte på
målsystemet.
• 
• 
Maskinkod - De 1:or och 0:or
som laddas ner i datorns minne
Maskinkod laddas ner från PC
till målprocessorns minne, i
vårt fall via en liten låda som
pratar USB med datorn och
JTAG med målsystemet.
Assemblerkod översätts med en assemblator till maskinkod.
Måste använda processorspecifikt utvecklingsverktyg för
assemblering och kunna ladda ner till maskinkoden till målsystem.
Vi använder IAR Embedded Workbench.
Assembler är det språk eller "verktyg" som vi kommer att använda
för att programmera med i den här kursen.
9
Flödesschema - assemblering
Assemblerkod
1-Pass
symboltabell
LDR R1,R1,R2!
LABEL=0x2000F02
!
2-Pass
Översättning
till maskinkod
Maskinkod laddas till målsystemet
110010101011011
!
111100100011101
!
10
Pseudoinstruktioner
Syntetiska instruktioner
• 
• 
Mellan direktiv och instruktioner
Assemblatorn kan översätta en inskriven instruktion till flera instruktioner
som processorn kan tolka. En sådan instruktion, som inte är någon riktig,
kallas ibland en pseudoinstruktion.
• 
Ex: Instr. MOV har begränsade tal som inargument. T ex MOV R1, #255
Större tal än 255 kan inte läggas in.
Lösning: Pseudoinstr. LDR R3,=49500 Här kan vi ha ett 32-bitars tal som
inargument trots att instruktionslängden bara är 32 bitar. Om talet är stort
blir översättningen LDR R3, [PC, #offset] Själva talet (här 49500)
placeras efter själva koden (efter END) och assemblatorn räknar ut avstånd
från instr. till var talet placeras (offset).
Är talet mindre än 9 bitar översätts instr. till MOV.
• 
• 
11
Sammanfattning Assembler
•  Programmeringsspråk på lägsta nivån för processorer.
•  Processorspecifik. Måste känna till processorn väl. Viktigt för
att känna till begränsningar.
•  Möjlighet att använda labels. Behöver inte koda med
absolutadresser.
•  Använder logiska namn för instruktioner, mnemonics.
•  Pseudoinstruktioner-mellanting mellan direktiv och
instruktioner.
•  Översätts med en assemblator till maskinkod. Maskinkod
läggs ner i processoms minne.
12
ARM
•  RISC-processor
•  32-bitars arkitektur (ALU, interna register och
databuss)
•  Tre-operands instruktioner (eller två+ett immed.)
•  Load-Store struktur. Allt flyttas till register och
arbetas med där, sen tillbaka till minnet.
•  16 generella register - får användas till vad man
vill
•  Flexibel kompakt instruktionsuppsättning. Alla
instruktioner kan utföras villkorligt (unikt för ARM)
13
ARM orginal
•  Alla instruktioner är 32 bitar långa
•  Ett flexibelt instruktionsset där instruktioner kan
utföras villkorligt (bit 31-28) samt sätta PSR på
begäran (S)
•  Inbyggd skiftning av operand2 i alla instruktioner.
•  Instruktioner för blockförflyttning av data, dvs
minnesblock kan flyttas till grupper av register och
tvärtom.
14
ARM Architecture roadmap
15
Vilken arkitektur är min ARM?
• 
16
ARM Cortex M3
• 
• 
• 
Key features of the Cortex-M3 core are:
ARMv7-M architecture
Instruction Sets
• 
• 
• 
• 
• 
• 
• 
• 
• 
Thumb (entire)
Thumb-2 (entire)
1-cycle 32-bit hardware multiply, 2-12 cycle 32-bit hardware divide, saturated
math support
3-stage pipeline with branch speculation
1 to 240 physical interrupts, plus NMI
12 cycle interrupt latency; no shadow registers, state saved on
stack
Integrated sleep modes
1.25 DMIPS/MHz
90 nm implementation: 32 µW/MHz; 0.12 mm2
17
Thumb
•  Thumb instructions are a sequence of half-word-aligned
half-words
•  Each Thumb instruction is either
•  a 16-bit half-word in that stream
•  A 32-bit instruction consisting of two half-words in that stream
•  If bits [15:11] of the half-word being decoded take on
any of the following values
• 
• 
• 
• 
• 
0b11101
0b11110
0b11111
then half-word is the first half-word of a 32-bit instruction
otherwise the half-word is a 16-bit instruction
•  See ARM ARM A5.1, A5.5, A5-13
18
19
20
Thumb-2
• 
21
16bit Thumb-2
• 
22
Thumb-2 Implementation
• 
23
32bit Instruction Encoding
• 
24
ARM and 16-bit Instruction Encoding
• 
25
Thumb-2
• 
[ARM Cortex-M3 Instruction Set & Architecture]
26
Instruction Encoding
ADD immediate
28
Nyckeldokument
• 
180 sidor sammanfattning
Av Cortex M3
ARMs manual, på 410 sidor för Cortex M3
31
ATMEL SAM3U manual,
1187 sidor
ARM Cortex M3
Register
• 
[ARM Cortex-M3 Devices, Generic User Guide, 2010]
32
ARM Cortex M3
Specialregister
[ARM Cortex-M3 Devices,
Generic User Guide, 2010]
•  The Program Status Register (PSR) combines:
•  Application Program Status Register (APSR)
•  Interrupt Program Status Register (IPSR)
•  Execution Program Status Register (EPSR).
•  These registers are mutually exclusive bitfields in
the 32-bit PSR. The bit assignments are:
33
Flags
• 
34
Memory Model
35
ARM Cortex M3
Instruktioner
Totalt 4 sidor!
• 
[ARM Cortex-M3 Devices, Generic User Guide, 2010]
37
• 
[ARM Cortex-M3 Devices, Generic User Guide, 2010]
39
ARM Cortex M3
Instruktionsklasser
•  Ladda/Skriv till minnet
•  Databehandling
• 
• 
• 
• 
Skiftoperationer
Logiska operationer
Aritmetiska och test instruktioner
Flytta mellan register och ladda in små konstanter till
register
•  Hopp
•  Övriga instruktioner
40
ARM Cortex M3
Vilkorsstyrning
• 
Alla instruktioner kan
utföras på villkor. Lägg till
villkorsflaggorna efter
instruktionen.!
41
Conditional Execution and Flags
• 
42
ARM Cortex M3
Instruktioner – Load/Store
43
• 
44
• 
45
• 
46
• 
47
Ladda/Spara
Exempel:
ADR R1, TextMessage
!; Write address value of a location
!
!
!
!
!; labelled as TextMessage to R1!
LDR R8, [R10] !
!; Loads R8 from the address in R10.!
LDRNE R2, [R5, #960]! !; Loads (conditionally) R2 from a word 960 bytes
!
!
!; above the address in R5, and increments R5 by 960!
STR R2, [R9,#const-struc] ; const-struc is an expression evaluating to a!
!
!
!; constant in the range 0-4095.!
STRH R3, [R4], #4
!; Store R3 as halfword data into address in R4,
!
!
!; then increment R4 by 4!
LDRD R8, R9, [R3, #0x20] ; Load R8 from a word 8 bytes above the address in
!
!
!; R3, and load R9 from a word 9 bytes !
!
!
!
!; above the address in R3!
STRD R0, R1, [R8], #-16 ; Store R0 to address in R8, and store R1 to a word
!
!
!; 4 bytes above the address in R8, and then
!
!
!
!; decrement R8 by 16.!
49
ARM Cortex M3
Instruktioner –
Databehandling
• 
50
ARM Cortex M3
Instruktioner – Databehandling
•  Skiftoperationer
•  ASR, LSR, LSL, ROR, RRX!
•  Logiska operationer
•  AND, ORR, EOR, BIC, ORN!
•  Aritmetiska och test instruktioner
• 
• 
• 
• 
• 
ADD, ADC, SUB, SUBC, RSB, !
CMP, CMN, TST, TEQ, CLZ!
MUL, MLA, MLS, SDIV, SMLAL, SMULL, UMLAL, UMULL!
SSAT, USAT!
BFC, BFI, SBFX, SXTB, SXTH, UBFX, UXTB, UXTH!
51
ARM Cortex M3
Instruktioner – Databehandling
•  Flytta mellan register och ladda in små konstanter
till register
•  MOV, MVN, MOVW
•  MOVT
•  REV, REV16, REVSH, RBIT
52
ARM Cortex M3
Instruktioner – Skiftoperationer
•  ASR #3
•  LSR #3
•  LSL #3
53
ARM Cortex M3
Instruktioner – Skiftoperationer
• 
ROR #3
•  RRX
54
ARM Cortex M3
Instruktioner – Logiska operationer
AND, ORR, EOR, BIC, and ORN
•  Logical AND, OR, Exclusive OR, Bit Clear, and OR
NOT. !
Examples:!
AND
ORREQ
ANDS
EORS
BIC
ORN
ORNS
R9,
R2,
R9,
R7,
R0,
R7,
R7,
R2, #0xFF00!
R0, R5!
R8, #0x19!
R11, #0x18181818!
R1, #0xab!
R11, R14, ROR #4!
R11, R14, ASR #32!
55
ARM Cortex M3
Instruktioner – Aritmetiska operationer
ADD, ADC, SUB, SBC, and RSB!
•  Add, Add with carry, Subtract, Subtract with carry,
and Reverse Subtract.
Exempel:!
• 
• 
• 
• 
ADD R2, R1, R3!
SUBS R8, R6, #240 ;
RSB R4, R4, #1280 ;
ADCHI R11, R0, R3 ;
!
!
!;
Sets the flags on the result!
Subtracts contents of R4 from 1280!
Only executed if C flag set and Z
flag clear.!
56
ARM Cortex M3
Instruktioner – Flytta mellan register
MOV and MVN!
•  Move and Move NOT.
Exempel!
• 
• 
• 
• 
• 
• 
MOVS R11, #0x000B
MOV R1, #0xFA05
MOVS R10, R12
MOV R3, #23 !
MOV R8, SP !
MVNS R2, #0xF
!
!
!;
!;
!;
!;
!;
!;
Write value
Write value
Write value
Write value
Write value
Write value
0xF) to the
of
of
in
of
of
of
R2
0x000B to R11, flags get updated!
0xFA05 to R1, flags are not updated!
R12 to R10, flags get updated!
23 to R3!
stack pointer to R8!
0xFFFFFFF0 (bitwise inverse of
!
and update flags.!
57
ARM Cortex M3
Instruktioner - Hopp
• 
• 
• 
• 
B, BL, BX, BLX
CBZ, CBNZ
IT
TBB, TBH
58
•  B, BL, BX, and BLX
•  Branch instructions. L with linking, X based on
register
59
•  Exempel
B loopA
BLE ng !
B.W target
BEQ target
BEQ.W target
BL funC
!
BX LR !
BXNE R0
BLX R0 !
!
!;
!;
!;
!;
!;
!;
!;
!;
!;
!;
!;
Branch to loopA!
Conditionally branch to label ng!
Branch to target within 16MB range!
Conditionally branch to target!
Conditionally branch to target within 1MB!
Branch with link (Call) to function funC,
!
return address stored in LR!
Return from function call!
Conditionally branch to address stored in R0!
Branch with link and exchange (Call) !
!
to a address stored in R0.!
!
!
60
ARM Cortex M3
Instruktioner - Övrigt
• 
61
Enkelt villkor
if (tal==23){!
!<kod l> }!
<kod2>!
!
!
!
if (tal!=23){!
!<kod l> }!
<kod2>!
!
!CMP Rl, #23 ; (R1)- 23!
!BNE KOD2 ; om inte lika hoppa förbi!
!<kod l> ; annars utför!
KOD2 <kod2>!
!
!
!CMP Rl, #23 ; (R1)- 23!
!BEQ EXIT
; om lika, hoppa förbi!
!<kod l>!
EXIT ---!
!
62
if-else sats
!CMP Rl, R2!
if (tal==tal2){!
!BEQ KOD1 ; om
!<kod l> }!
KOD2 !<kod2>!
Else {!
!B SLUT!
!<kod2>}!
KOD1 !<kodl>!
!
SLUT ---!
!
!
lika hoppa till kod1!
63
Användning av villkorade instruktioner
• 
64
for-loop
!LDR R0,#0!
for (i=0; i<25; i++)
!
LOOP !CMP R0,#25!
{!
!BGE EXIT!
<vad som skall utföras>!
!<vad som skall utföras>!
}!
!ADD R0,R0,#1!
<fortsättning på koden>!
!B LOOP!
EXIT <fortsättning på koden>!
!
!
!
65
while-sats
While(tal!=25)!
LOOP !CMP R0,#25!
{!
!BEQ EXIT!
<tal förändras på något sätt>
!
!<R0 förändras…>!
}!
!B LOOP!
<fortsättning på koden>! EXIT <fortsättning på koden>!
!
!
!
66