# 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} Exemple: ex: 154 ## Hexadecimal 0x_{hex_digits} &{hex_digits} Exemple: 0x9A &9A ## Octal 0{octal_digits} 8_{octal_digits} Exemple: 0232 8_232 ## Binary 2_{binary_digits} 0b{binary_digits} Exemple: 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 ```