Вы находитесь на странице: 1из 23

7.

FAMILIA DE PROCESOARE “ARM”

7.1. ARM – caracteristici generale

Primul procesor ARM a fost dezvoltat de Acorn Computers Limited, Cambridge, England, 1983 – 1985:
Acorn RISC Machine.

A devenit ulterior acronimul de la Advanced RISC Machine.

Versiunile arhitecturilor ARM:

V1 ARM1
V2 ARM2
V2a ARM2aS ARM3
V3 ARM6 ARM600 ARM610 ARM7 ARM700 ARM710
V4T ARM7TDMI ARM710T ARM720T ARM740T
V4 StrongARM ARM8 ARM810
V4T ARM9TDMI ARM920T ARM940T
V5TE ARM9E-S ARM10TDMI ARM1020E Intel XScale
V6 ARM1136J-S ARM1136JF-S

Microcontrolere - Capitolul 7 1
Corneliu BURILEANU ©
Comparaţie cu predecesoarele RISC Berkeley RISC I şi II şi Stanford MIPS:

Asemănări:
• Acces în memorie cu instrucţiuni LOAD – STORE
• Instrucţiuni cu format fix pe 32 de biţi
• Prelucrarea datelor fără acumulator dedicat
• Puţine moduri de adresare

Deosebiri :
• Setul de lucru de registre nu este de 32 de registre şi nu există ferestre de registre
• Instrucţiunile nu durează toate o singură stare
• Nu se foloseşte tehnica întârzierii salturilor pentru a preveni blocarea Unităţii de control

De fapt, ARM este o combinaţie CISC – RISC. Setul de instrucţiuni are caracteristici CISC
mai mult decât RISC

Microcontrolere - Capitolul 7 2
Corneliu BURILEANU ©
7.2. ARM – modurile de lucru

Utilizator usr Modul normal de execuţie a programelor

Moduri privilegiate:

Sistem sys Rulează procese ale sistemului de operare

Moduri care tratează excepţii:

Răspuns rapid la întreruperi fiq transfer rapid de date

Răspuns normal la întreruperi irq răspuns normal la cereri de întreruperi

Supervizor svc mod protejat pentru sistemul de operare

Abort abt implementează mecanismul de protecţie în


memoria virtuală
Nedefinit und emulare soft a coprocesoarelor hardware

Microcontrolere - Capitolul 7 3
Corneliu BURILEANU ©
7.3. ARM – Setul de registre

Cele mai multe registre sunt nededicate (multifuncţionale).

Sunt registre pe 32 de biţi .

Un procesor ARM are în total 37 de registre fizice distincte:

- 31 de „registre generale” incluzând numărătorul de program;


- 6 registre de stare.

Microcontrolere - Capitolul 7 4
Corneliu BURILEANU ©
Modurile de lucru
Moduri privilegiate
Moduri care tratează excepţii
Utilizator Sistem Supervizor Abort Nedefinit Întreruperi Într. rapide
R0 R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8 R8_fiq
R9 R9 R9 R9 R9 R9 R9_fiq
R10 R10 R10 R10 R10 R10 R10_fiq
R11 R11 R11 R11 R11 R11 R11_fiq
R12 R12 R12 R12 R12 R12 R12_fiq
R13 R13 R13_svc R13_abt R13_und R13_irq R13_fiq
R14 R14 R14_svc R14_abt R14_und R14_irq R14_fiq
PC PC PC PC PC PC PC

CPSR CPSR CPSR CPSR CPSR CPSR CPSR


SPSR_svc SPSR_abt SPSR_und SPSR_irq SPSR_fiq

Microcontrolere - Capitolul 7 5
Corneliu BURILEANU ©
R0 – R7 sunt registre fizice. (8)

R8 – R14 sunt registre logice – în sensul ca pot fi translatate în registre fizice diferite, astfel:

R8 – R12 pot fi translatate în câte 2 registre fizice; (10)


R13 şi R14 pot fi translatate în câte 6 registre fizice. (12)

R15 este registru fizic. (1)


-----
(31)

CPSR este registru fizic. (1)

SPSR este registru logic ce poate fi translatat în 5 registre fizice. (5)


-----
(6)

Microcontrolere - Capitolul 7 6
Corneliu BURILEANU ©
R13: indicator de stivă nededicat: SP

R14: „registru de legătură”: LR ;


conţine adresa de reîntoarcere din subprograme
MOV PC, LR
sau
BX LR

R15 este numărătorul de program PC:


• poate fi registru general de date
• când e citit dă adresa instrucţiunii curente plus 8B
• ultimii 2 biţi sunt zero
• când se scrie în acest registru rezultatul e un salt la adresa înscrisă în R15;
ultimii 2 biţi trebuie să fie zero

CPSR este „registrul de stare al programului curent”. În modurile care tratează excepţii,
acest registru este trecut în SPSR – “registrul de stare al programului salvat”.

Microcontrolere - Capitolul 7 7
Corneliu BURILEANU ©
31 30 29 28 27 7 6 5 4 3 2 1 0
N Z C V Q I F T M4 M3 M2 M1 M0

N – negativ

Z – zero

C – transport

V – depăşire

Q – depăşire pentru instrucţiuni DSP

I – validarea întreruperilor normale

F – validarea întreruperilor rapide

T – indică trecerea la setul de instrucţiuni „Thumb”

M4 – M0 – indică modurile de lucru

Microcontrolere - Capitolul 7 8
Corneliu BURILEANU ©
Setul de lucru conţine (indiferent de modul de lucru):

- 15 registre generale: R0 – R14;

- 1 numărător de program: R15 ≡ PC;

- 1 sau 2 registre de stare: CPSR şi SPSR_mod.

unde mod semnifică unul dintre


modurile care tratează excepţii.

Microcontrolere - Capitolul 7 9
Corneliu BURILEANU ©
7.4. ARM – Memoria şi porturile

Adresare liniară: AF ≡ adr32

Memoria are 4 GB, sau 2Gw sau 1Gdw; informaţiile sunt aliniate

Adresele instrucţiunilor:
• Salturi: AFsalt ← AF curentă
curentă + 8 + offset
• Secvenţial: AF instr. următoare ← AF instr.
instr. urmă curentă + 4
instr. curentă

Se folosesc atât „micul indian” cât şi „marele indian”. Nu există instrucţiuni specifice pentru
trecerea de la o convenţie la alta. Există un terminal de intrare pentru a configura convenţia
care se potriveşte cu memoria folosită

Porturile sunt organizate ca locaţii de memorie („memory – mapped I/O”)

Microcontrolere - Capitolul 7 10
Corneliu BURILEANU ©
Moduri de adresare

Adresa pentru accesul în memorie (LOAD / STORE) are 2 părţi:

• registru bază: oricare registru general R0 – R15


în cazul R15 (PC) avem, de fapt, o adresare relativă
• offset (AE):
• imediat: o constantă (întreg fără semn) care se adună sau se scade la registrul bază
• registru: un registru general R0 – R14 care se adună sau scade la registrul bază
• registru deplasat: un registru general R0 – R14 care este deplasat cu un număr de celule
indicat printr-o valoare imediată, iar rezultatul se adună sau scade la registrul bază

Indiferent de tipul de offset, există trei moduri de a combina cele 2 entităţi:


• offset: cele 2 entităţi se adună sau se scad:
AF ← (r) ± AE
• pre-indexare: cele 2 entităţi se adună sau se scad; apoi registru bază este actualizat cu
noua adresă, ceea ce permite indexarea automată într-un şir:
AF ← (r) ± AE
(r) ← (r) ± AE

• post-indexare: se foloseşte doar registrul bază pentru adresare; apoi registru bază este
actualizat cu cele 2 entităţi se adună sau se scad, ceea ce permite indexarea automată într-un şir:
AF ← (r)
(r) ← (r) ± AE

Microcontrolere - Capitolul 7 11
Corneliu BURILEANU ©
7.5. ARM – Setul de instrucţiuni

7.5.1. Condiţionarea execuţiei instrucţiunilor

Aproape toate instrucţiunile ARM sunt, de fapt, decizii simple: sunt testate fanioanele N, Z, C, V
din CPSR şi dacă este îndeplinită condiţia, instrucţiunile se desfăşoară normal

Instrucţiunile conţin în format un câmp de 4 biţi [31:28] care codifică condiţia testată
Format Mnemonic Semnificaţie Fanion testat
[31:28]
0000 EQ Egal (Z) ← 1
0001 NE Non-egal (Z) ← 0
0010 CS/HS Mai mare sau egal, numere fără semn (C) ← 1
0011 CC/LO Mai mic, numere fără semn (C) ← 0
0100 MI Negativ (minus) (N) ← 1
0101 PL Pozitiv sau zero (plus) (N) ← 0
0110 VS Depăşire (V) ← 1
0111 VC Non-depăşire (V) ← 0
1000 HI Mai mare, numere fără semn (C) ← 1 & (Z) ← 0
1001 LS Mai mic sau egal, numere fără semn (C) ← 0 ∀ (Z) ← 1
1010 GE Mai mare sau egal, numere cu semn (N) ← 1 & (V) ← 1
1011 LT Mai mic, numere cu semn (N) ← 1 & (V) ← 0
1100 GT Mai mare, numere cu semn (N) ← 0 & (V) ← 0
1101 LE Mai mic sau egal, numere cu semn (N) ← 0 & (V) ← 1
1110 AL Necondiţionat -
1111 NV Rezervat pentru instr. suplimentare -

Microcontrolere - Capitolul 7 12
Corneliu BURILEANU ©
7.5.2. Salturi

Salturi propriu-zise în ecartul a 32 MB


Pot fi realizate şi prin înscrierea unei valori în R15 ≡ PC

Apelul de subprograme cu instrucţiuni similare („Branch with Link”) tot în ecartul a 32 MB


Adresa de revenire va fi în R14 ≡ LR

„Branch and Exchange”:


(PC) ← (r)
if (PC)0 ≡ 1 se trece în setul de instrucţiuni Thumb

Încărcarea a 4 octeţi direct în R15 ≡ PC echivalează cu un salt lung în toată memoria de 4 GB


Dacă în prealabil (LR) ← (PC) se generează un apel de subprogram în toată memoria de 4 GB

Microcontrolere - Capitolul 7 13
Corneliu BURILEANU ©
Salturi condiţionate:

B necondiţionat
BAL Întotdeauna
BEQ Egal
BNE Non-egal
BPL Plus
BMI Minus
BCC Salt dacă transport e 0
BLO Mai mic (fără semn)
BCS Salt dacă transport e 1
BHS Mai mare sau egal (fără semn)
BVC Salt dacă depăşire e 0
BVS Salt dacă depăşire e 1
BGT Mai mare (cu semn)
BGE Mai mare sau egal (cu semn)
BLT Mai mic (cu semn)
BLE Mai mic sau egal (cu semn)
BHI Mai mare (fără semn)
BLS Mai mic (fără semn)

Microcontrolere - Capitolul 7 14
Corneliu BURILEANU ©
Exemple:

B eticheta ; salt la eticheta

BCC eticheta ; salt condiţionat de (C) ← 0

BEQ eticheta ; salt condiţionat de (Z) ← 1

MOV PC,#0 ; (R15) ← 0

BL proc ; apel de procedură

MOV PC,LR ; (R15) ← (R14) ;return

MOV LR,PC ; (R14) ← (R15) ;gata pentru return

LDR PC,=proc ; (R15) ← adr(proc) ;încarcă o adresă pe 32 biţi în


;numărătorul de program

Microcontrolere - Capitolul 7 15
Corneliu BURILEANU ©
7.5.3. Prelucrări de date
Toţi operanzii sunt pe 32 biţi

Rezultatul este pe 32 biţi şi va fi un registru

Nu există acumulator; registrele pentru operanzi şi rezultat sunt separate

AND (d) ← (s) & operand


EOR (d) ← (s) ⊕ operand
SUB (d) ← (s) - operand
RSB (d) ← operand - (s)
ADD (d) ← (s) + operand
ADC (d) ← (s) + operand + (C)
SBC (d) ← (s) – operand – NOT(C)
RSC (d) ← operand - (s) – NOT(C)
TST (s) & operand
TEQ (s) ⊕ operand
CMP (s) - operand
CMN (s) + operand
ORR (d) ← (s) ∀ operand
MOV (d) ← (s)
BIC (d) ← (s) & NOToperand
MVN (d) ← NOT(s)
în care:
• (d) şi (s) sunt registre generale
• operand este o valoare imediată sau un registru general care poate fi şi deplasat

Microcontrolere - Capitolul 7 16
Corneliu BURILEANU ©
Deplasări:

LSL deplasare logică stânga


LSR deplasare logică dreapta
ASL deplasare aritmetică stânga
ASR deplasare aritmetică dreapta
ROR rotaţie dreapta
RRX rotaţie dreapta o poziţie folosind C

Setarea fanioanelor se face opţional (cu excepţia comparaţiilor) se face indicând în asamblor
un „S” la mnemonică; de exemplu ADDS

Microcontrolere - Capitolul 7 17
Corneliu BURILEANU ©
7.5.4. Înmulţiri

Două clase de înmulţiri:


• 32 ← 32 * 32
• 64 ← 32 * 32
Înmulţire „normală”:
• MUL operanzii sunt în 2 registre generale, rezultatul este trunchiat la 32 biţi şi stocat în alt registru
• MLA operanzii sunt în 2 registre generale, se adună conţinutul uni al treilea registru, rezultatul este
trunchiat la 32 biţi şi stocat în al patrulea registru „înmulţire cu acumulare”)

Înmulţire „lungă”:
• SMULL operanzii sunt în 2 registre generale şi rezultatul, pe 64 biţi este stocat
în alte 2 registre concatenate; numerele sunt întregi cu semn
• UMULL operanzii sunt în 2 registre generale şi rezultatul, pe 64 biţi este stocat
în alte 2 registre concatenate; numerele sunt întregi fără semn
• SMLAL operanzii sunt în 2 registre generale, la rezultat se adună conţinutul
a 2 registre concatenate şi rezultatul este stocat în aceste al treilea şi al patrulea registru;
numerele sunt întregi cu semn
• UMLAL operanzii sunt în 2 registre generale, la rezultat se adună conţinutul
a 2 registre concatenate şi rezultatul este stocat în aceste al treilea şi al patrulea registru;
numerele sunt întregi fără semn

Microcontrolere - Capitolul 7 18
Corneliu BURILEANU ©
Exemple:

MUL R4, R2, R1 ; (R4) ← (R2)*(R1)

MLA R7, R8, R9, R3 ; (R7) ← (R8)*(R9) + (R3)

SMULL R4, R8, R2, R3 ; (R4)↑(R8) ← (R2)*(R3)

UMULL R6, R8, R0, R1 ; (R6)↑(R8) ← (R0)*(R1)

UMLAL R5, R8, R0, R1 ; (R5)↑(R8) ← (R0)*(R1) + (R5)↑(R8)

Microcontrolere - Capitolul 7 19
Corneliu BURILEANU ©
7.5.5. Instrucţiuni aritmetice speciale

CLZ înscrie într-un registru numărul de cifre binare 0 ale unui operand din alt registru,
începând cu msb şi până la primul 1

Determină câte deplasări stânga sunt necesare pentru normalizarea unui operand

Determină bitul cu prioritatea maximă într-o mască binară

Exemple:

CLZ R4, R2

Microcontrolere - Capitolul 7 20
Corneliu BURILEANU ©
7.5.6. Accesul în memorie

Tipuri de instrucţiuni LOAD / STORE:


• 8 sau 32 biţi, întregi fără semn
• 16 biţi întregi fără semn, 16 sau 8 biţi, întregi cu semn

Se folosesc modurile de adresare amintite

LDR Încarcă 32 biţi într-un registru general


LDRB Încarcă 8 biţi într-un registru general
LDRH Încarcă 16 biţi (întreg fără semn) într-un registru general
LDRSB Încarcă 8 biţi (întreg cu semn) într-un registru general
LDRSH Încarcă 16 biţi (întreg cu semn) într-un registru general
STR Memorează 32 biţi dintr-un registru de uz general
STRB Memorează 8 biţi dintr-un registru de uz general
SRH Memorează 16 biţi dintr-un registru de uz general

LDM Încarcă un subset sau toate registrele generale


STRM Memorează un subset sau toate registrele generale

SWP Inter-schimbă 32 biţi între registre şi memorie


SWPB Inter-schimbă 8 biţi între registre şi memorie

Microcontrolere - Capitolul 7 21
Corneliu BURILEANU ©
Exemple:
LDR R1, [R0] ; (R1) ← ((R0))
LDR R8, [R3,#4] ; (R8) ← ((R3) + 4)
LDR R12, [R13,#-4] ; (R12) ← ((R13) - 4)
STR R2, [R1,#0x100] ; ((R1) +100H) ← (R2)
LDRB R5,[R9] ; (R5) ← 000000 ↑((R9))
LDR R11, [R3,R5,LSL #2] ; (R11) ← ((R3) + (R5)*4)
LDR R1, [R0,#4]! ; (R1) ← ((R0) + 4)
; (R0) ← (R0) + 4
STRB R7, [R6,#-1]! ; ((R6) -1) ← (R7)
; (R6) ← (R6) – 1
LDR R3, [R9], #4 ; (R3) ← ((R9))
; (R9) ← (R9)+4
STR R2, [R5],#8 ; ((R5)) ← (R2)
; (R5) ← (R5) + 8
LDR R0, [PC,#40] ; (R0) ← ((PC) + 40 + 8)
LDR R0, [R1], R2 ; (R0) ← ((R1))
; (R1) ← (R1) + (R2)
SWP R12, R10, [R9] ; (R12) ← ((R9))
; ((R9)) ← (R10)
SWP R1, R1, [R9] ; (R1) ↔ ((R9))
Microcontrolere - Capitolul 7 22
Corneliu BURILEANU ©
7.5.7. Comunicarea cu coprocesorul

Suportă până la 16 coprocesoare logice

Fiecare coprocesor poate avea până la 16 registre proprii de mărimi diverse

Coprocesoarele au arhitecturi RISC, cu instrucţiuni care


• execută operaţii interne cu registrele
• accesează memoria cu LOAD şi STORE
• schimbă date cu registrele nucleului ARM

Coprocesoarele pot fi adăugate pe cip sau pe placă.


Cel mai adesea se folosesc coprocesoare pentru gestionarea memoriei şi accesul în memoriile cache.

CDP p5, 2, c12, c10, c3, 4 ;iniţiază operaţii cu date la coprocesorul 5


;primul byte de cod este 2 iar al doilea byte
;de cod este 4; c12 este registru destinaţie
;şi c10, c3 sunt registre sursă
MRC p15, 5, R4, c0, c2, 3 ;transferă date de la coprocesorul 15;
;primul byte de cod este 5 iar al doilea byte
; de cod este 3; R4 este registru destinaţie,
; iar c0, c2 sunt registre sursă

Microcontrolere - Capitolul 7 23
Corneliu BURILEANU ©

Вам также может понравиться