PRESERVE8 THUMB ; ====================== zone de réservation de données, ====================================== ;Section RAM (read only) : area mesdata,data,readonly ; Déclaration de la variable ;Section RAM (read write): area maram,data,readwrite VarTime dcd 0 ; Réserve 32 bits en mémoire pour Vartime et on lui affecte la valeur 0 EXPORT VarTime ;On rend la variable globale pour pouvoir l'observer avec le débugger ; =============================================================================================== ;constantes (équivalent du #define en C) TimeValue equ 900000 ; TimeValue = 900000 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 ; début de procédure ldr r0,=VarTime ; Stockage de l'adresse de VarTime dans r0 ldr r1,=TimeValue ; Stockage de l'adresse de TimeValue r1 str r1,[r0] ; Ecriture de la valeur stockée dans r1 dans r0 BoucleTempo ; début de la boucle ldr r1,[r0] ; Stockage de la valeur pointée par r0 dans r1 subs r1,#1 ; Désincrémentation de la valeur de r1 str r1,[r0] ; Ecriture de la valeur de r1 dans r0 bne BoucleTempo ; "Branch on Not Equal" --> Effectue un saut vers BoucleTempo si la valeur de r1 est différente de 0, sinon continue bx lr ; renvoie la valeur de lr endp END