be_chti/PjtKEIL_StepDeb_1/Src/Delay.s
2023-04-07 18:16:39 +02:00

74 lines
No EOL
1.8 KiB
ArmAsm

; Pile par 8 bit
PRESERVE8
; instruction set comme ARM set
; il est principalement sur 16 bit
THUMB
; ====================== zone de réservation de données, ======================================
;Section RAM (read only) :
area mesdata,data,readonly
;Section RAM (read write):
area maram,data,readwrite
; On donne une zone mémoire à VarTime (elle est aligné)
VarTime dcd 0
; ===============================================================================================
;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
; On charge la valeur du poiteur
ldr r0,=VarTime
EXPORT VarTime
ldr r1,=TimeValue
; On initialise un pointeur sur TimeValue
str r1,[r0]
BoucleTempo
; On charge la valeur pointer par le pointeur passer en argument
; R1 à le nombre de boucle qu'il reste à faire (TimeValue)
ldr r1,[r0]
; On enlève à r1 1 pour tester la fin de la boucle
subs r1,#1
str r1,[r0]
; si la valeur est non nul on relance la boucle, car pas terminer
bne BoucleTempo
; sinon on fini la fonction
; lr pointe l'endroit qui à appeller la fonction
; on y retourne à la fin de la fonction
bx lr
endp
END