87 lines
3.8 KiB
Markdown
87 lines
3.8 KiB
Markdown
# Intro
|
||
## Mode de fonctionnement
|
||
A l'initialisation du processeur, le mode "system" est activé
|
||
|
||
|Processor mode|Notation|Description|
|
||
|---|---|---|
|
||
|User|\_usr|The normal program execution mode|
|
||
|FIQ|\_fiq|Designed to support a high-speed transfer or channel process|
|
||
|IRQ|\_irq|Used for general–purpose interrupt handling|
|
||
|Supervisor|\_svc|A protected mode for the operating system|
|
||
|Abort|\_abt|Used to implement virtual memory and/or memory coprocessor|
|
||
|Undefined|\_und|Used to support software emulation of hardware coprocessor|
|
||
|System|\_sys|Used to run privileged operating system tasks|
|
||
|
||
## Les registres du processeur ARM
|
||
![[Pièces jointes/Pasted image 20230928150906.png]]
|
||
### Rôle des registres
|
||
- Les registres `r0` à `r12`sont libre pour un usage général
|
||
- Le registre `r13`appelé `SP`(Stack Pointer) sert comme pointeur de pile propre à chaque mode
|
||
- Le registre `r14` appelé `LR`(Link Register) mémorise l'adresse de retour lors d'un appel de fonction
|
||
- Le registre `r15`appelé `PC`(Program Counter) pointe sur la prochaine instruction à exécuter
|
||
- `CPSR`(Current Program Status Register) est le registre d'états courant du processeur
|
||
- `SPSR` (Saved Program Status Register) est le registre de sauvegarde de l'ancien registre d'états
|
||
|
||
### Registres `CPSR`et `SPSR`
|
||
Les registres `CPSR`et `SPSR`regroupent:
|
||
- Les fanions concernant la plus récente opération réalisée par l'ALU
|
||
- Les bits d'acceptation ou de refus d'interruptions électriques
|
||
- Le mode du processeur codé sur 5 bits
|
||
- Le bit d'activation du jeu d'instructions Thumb
|
||
![[Pièces jointes/Pasted image 20231120100133.png]]
|
||
|
||
## Les fanions
|
||
A chaque opération mathématique ou logique, l'ALU peut positionner des fanions
|
||
- **N** `Negative` - Nombre négatif. C'est le bit de signe du nombre en complément à 2
|
||
- **Z** `Zero` - Nombre = 0. Utilisé généralement avec des compteurs pour effectuer des boucles
|
||
- **C** `Carry` - Retenue ou dépassement de capacité lors d'opérations sur des nombres logiques
|
||
- **V** `oVerflow` - Dépassement de capacité lors d'opérations arithmétiques en complément à 2
|
||
>[!warning]
|
||
>Toute les instructions n'affectent pas tous les fanions
|
||
|
||
## Exécution conditionnelle
|
||
Chaque instruction du processeur ARM peut-être exécutée sous condition
|
||
- Pour rendre une instruction conditionnelle, il suffit d'ajouter deux lettres à sa mnémonique
|
||
- L'opcode de chaque instruction comprend un champ "condition"
|
||
|
||
```packetdiag
|
||
packetdiag {
|
||
colwidth = 32;
|
||
node_height = 15;
|
||
28-31: Cond;
|
||
}
|
||
```
|
||
|
||
```armasm
|
||
CMP r0, r1 ; Update flags based on r0 - r1
|
||
ADDGT r0, r0, #4 ; If r0 greater than r1 THEN r0 = r0 + 4
|
||
; ELSE ADDGT is skipped
|
||
ADDLT r1, r1, #4 ; IF r0 less than r1 THEN r1 = r1 + 4
|
||
; ELSE ADDLT is skipped
|
||
```
|
||
![[Pièces jointes/Pasted image 20230928151308.png]]
|
||
# Instructions de branchement
|
||
## Instruction B
|
||
`B{cond} label`
|
||
|
||
Le champ offset autorise un saut de $\pm$ 32 Mbytes $(2^{24}<<2) /2$
|
||
|
||
|
||
|
||
|
||
# Carry
|
||
Pour déterminer si une opération active le flag de carry, interprétez les deux arguments comme des entiers non signés.
|
||
## Addition (inclus CMN)
|
||
Le flag `C`est set à $1$ si l'addition produit un carry sinon le flag et set à $0$.
|
||
|
||
Soit l'addition $x+y$ avec $x$ et $y$ interprété comme entier non signé. Si $x+y$ est trop grand pour être représenté comme un entier de 32 bit, `C` est set à $1$. Si $x+y$ peut être représenté comme un entier de 32 bit, `C` est set à $0$.
|
||
|
||
## Soustraction (inclus CMP)
|
||
Le flag `C` est set à $0$ si la soustraction produit un borrow (p ex. si le résultat en non signé underflow). Sinon le flag est set à $1$.
|
||
|
||
Soit la soustraction $x-y$ avec $x$ et $y$ interprété comme entiers non signé. Si $x<y$, le résultat devrait être négatif, `C` est set à $0$. Si $x\geq y$, `C` est set à $1$.
|
||
$$\begin{align}
|
||
x < y &\to C=0 \\
|
||
x \geq y &\to C=1
|
||
\end{align}$$
|