Files
Yggdrasil/infotro/SEm/ASM.md
T
2024-01-28 19:13:10 +01:00

87 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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}$$