# 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