Files
Yggdrasil/docs/bachelor/arm/PLA.md
T
2023-11-21 22:16:42 +01:00

167 lines
4.9 KiB
Markdown

# Tailles
Nom valable uniquement pour l'architecture ARM, attention certain nom peuvent changer pour d'autres architecture
|Nom |Taille |
|-----------|-------|
|Nibble | 4 bits|
|Byte | 8 bits|
|Halfword |16 bits|
|Word |32 bits|
|Double word|64 bits|
# Bases
## Decimal
{digits}
<u>Exemple:</u>
ex: 154
## Hexadecimal
0x_{hex_digits}
&{hex_digits}
<u>Exemple:</u>
0x9A
&9A
## Octal
0{octal_digits}
8_{octal_digits}
<u>Exemple:</u>
0232
8_232
## Binary
2_{binary_digits}
0b{binary_digits}
<u>Exemple:</u>
2_10011010
0b10011010
# Directives
## EQU
- La directive *EQU* assigne une constante numérique au nom symbolique *name*
- La directive *EQU* définit une constante, appelée constante d'assemblage (assembly-time constant)
```armasm
MAX_TEMP EQU 99
BUFFER_SIZE EQU 20*16
MOV r0, #MAX_TEMP ; remplace MOV r0, #99
MOV r1, #BUFFER_SIZE ; remplace MOV r1, #320
```
## GBLx
- La directive *GBLA* déclare une variable globale arithmétique initialisée à 0
- La directive *GBLL* déclare une variable globale logique initialisée à `{FALSE}`
- La directive *GBLS* déclare une variable globale de type chaîne de caractères initialisés comme une chaîne vide ""
## EXPORT & GLOBAL
- La directive *EXPORT* déclare à l'éditeur des liens que le nom symbolique peut-être référencé
- Dans un autre objet
- Dans un autre fichier
- La directive *GLOBAL* est un synonyme
``` armasm
AREA Example, CODE, READONLY
EXPORT DoAdd ; Export the function name
; DoAdd to be used by
; external modules.
DoAdd ADD r0, r0, r1
```
## EXTERN & IMPORT
- La directive *EXTERN* informe l'assembleur que le nom symbolique n'est pas défini dans le fichier courant
- Le nom symbolique *symbole* est traité comme une adresse
- Sa valeur est définie lors de l'opération d'édition des liens
- Avant l'opération d'édition des liens, sa valeur est zéro
``` armasm
AREA Example, CODE, READONLY
EXTERN __C_INITIALIZE ; If C++library linked, gets
; the adress of __C_INITIALIZE
LDR r0, __C_INITIALIZE ; In not linked, adress is zeroed
CMP r0, #0 ; Test if zero
BEQ noCLinked ; Branch on the result
```
## DCB
- La directive *DCB*
- Réserve un ou plusieurs [bytes](#Tailles) en mémoire
- définit la valeur initiale de ces positions mémoires
- Lors de l'exécution du programme (runtime), les valeurs de ces positions mémoires peuvent être changées
``` armasm
nbChar DCB 24, 32
cString DCB "C_string", 0
```
>[!warning]
>Si la directive ***DCB*** est suivie par une instruction, l'usage de la directive ***[ALIGN](#ALIGN-amp-ORG)*** est indispensable
![](img%2FPasted%20image%2020231116153738.png)
## DCW
- La directive *DCW*
- Réserve un ou plusieurs [halfword (16bits)](#Tailles) en mémoire à une adresse paire
- Définit la valeur initiale de ces positions mémoires
``` armasm
number EQU 10
data DCW -255, 2*number
```
>[!warning]
>Si la directive ***DCW*** est suivie par une instruction, l'usage de la directive ***[ALIGN](#ALIGN-amp-ORG)*** est indispensable
![](img%2FPasted%20image%2020231116154303.png)
## DCD
- La directive *DCD*
- Réserve un ou plusieurs [word (32 bits)](#Tailles) en mémoire à une adresse multiple de 4
- Définit la valeur initiale de ces positions mémoires
```armasm
data1 DCD 1, 5, 20 ; Defines 3 words containing
; decimal values 1,5,and 20
data2 DCD data1 + 4 ; Defines 1 word containing 4 +
; the address of the label data1
```
![](img%2FPasted%20image%2020231116154853.png)
## SPACE
- La directive *SPACE* réserve un bloc mémoire initialisé à zéro
- La taille du bloc mémoire est exprimée en byte
```armasm
AREA MyData, DATA, READWRITE
buffer SPACE 255 ; Define 255 bytes of zeroed store
```
>[!warning]
>Si la directive ***SPACE*** est suivie par une instruction, l'usage de la directive ***[ALIGN](#ALIGN-amp-ORG)*** est indispensable
![](img%2FPasted%20image%2020231116155200.png)
## ALIGN & ORG
- La directive *ALIGN* aligne la position courante à un multiple de *expr*, en ajoutant si nécessaire des bytes de bourrage
```armasm
label1 DCB 1 ; PC now misaligned
ALIGN ; Ensure that Func1 addresses
Func1 ; now aligned on 4-byte boundary
MOV r5, #0x5
... ... ; Code
MOV pc, lr ; Code
ALIGN 8 ; Now aligned on 8-byte boundary
rout2 ... ... ; Code
```
- La directive *ORG* fixe la valeur absolue de la position courante
```armasm
ORG 0x4000 ; instructions start at addr 0x4000
MOV r5, #0x5
... ... ; Code
MOV pc, lr ; Code
ORG 0x8000 ; data start at addr 0x8000
Data1 DCD 12
Data2 DCD 0
```