PRESERVE8 THUMB ; ====================== zone de réservation de données, ====================================== ;Section RAM (read only) : area mesdata,data,readonly ;directive AREA name,attr1,attr2 : dis a l'assembleur d'assembler une nouvelle zone de code de nom "name", de type "data" en lecture seulement ;Section RAM (read write): area maram,data,readwrite export VarTime VarTime dcd 0 ; VarTime est une adresse qui pointe sur une variable de 4octets, initialisée à 0 (int VarTime = 0 en C) ; =============================================================================================== ;constantes (équivalent du #define en C) TimeValue equ 900000 ; donne la valeur 900000 à TimeValue EXPORT Delay_100ms ; la fonction Delay_100ms est rendue publique donc utilisable par d'autres modules. ;Section ROM code (read only) : area moncode,code,readonly ; REMARQUE IMPORTANTE ; Cette manière de créer une temporisation n'est clairement pas la bonne manière de procéder : ; - elle est peu précise ; - la fonction prend tout le temps CPU pour... ne rien faire... ; ; Pour autant, la fonction montre : ; - les boucles en ASM ; - l'accés écr/lec de variable en RAM ; - le mécanisme d'appel / retour sous programme ; ; et donc possède un intérêt pour débuter en ASM pur Delay_100ms proc ldr r0,=VarTime ldr r1,=TimeValue str r1,[r0] ; place la valeur stockée dans le registre r1 (TimeValue) en mémoire vive à l'adresse VarTime BoucleTempo ldr r1,[r0] subs r1,#1 ;on soustrait 1 à la valeur de r1, le s va nous permettre de sortir de la boucle qui va commencer lorsqu'on va arriver à l'instruction bne str r1,[r0] bne BoucleTempo ;tant que le flag Z est égal à 0, on refait la boucle à partir de BoucleTempo bx lr ; branch to link register : le compteur programme (adresse mémoire en cours d'execution) est écrasé par la valeur présente dans l'adresse de retour (lr) endp END