167 lines
4.9 KiB
Markdown
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
|
|
|
|

|
|
|
|
|
|
|
|
## 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
|
|
|
|

|
|
|
|
## 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
|
|
```
|
|

|
|
|
|
## 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
|
|
|
|

|
|
|
|
## 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
|
|
```
|
|
|