PRESERVE8 THUMB ; ====================== zone de réservation de données, ====================================== ;Section RAM (read only) : area mesdata,data,readonly ;Section RAM (read write): area maram,data,readwrite VarTime dcd 0 EXPORT VarTime ; =============================================================================================== ;constantes (équivalent du #define en C) TimeValue equ 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 ldr r0,=VarTime ; r0 prend la valeur VarTime = 0 ici la premiere adresse est 0x20000000 en RAM dans simulation ldr r1,=TimeValue ; r1 prend la valeur TimeValue = 900000 str r1,[r0] ; la valeur 32bits contenue dans r1 est copiée en RAM à l'adresse spécifiée dans r0 BoucleTempo ldr r1,[r0] ; la valeur 32bits située à l'adresse spécifiée dans r0 est recopiée dans r1 subs r1,#1 ; r1 prend la valeur r1 - 1 = 899999 str r1,[r0] ; la valeur 32bits contenue dans r1 est copiée en RAM à l'adresse spécifiée dans r0 bne BoucleTempo ; if z = 0 faire BoucleTempo; Z: Set to 1 when r1 is zero, otherwise cleared to 0 bx lr ; indirect jump to [LR] endp END