  NAME    main
        
  PUBLIC  __iar_program_start
  SECTION .intvec : CODE (2)
  CODE32
        
__iar_program_start
  
  B main   

  SECTION .text : CODE (2)
  CODE32
  
AdresseDebut
  ; Q1: Décrivez ce que fait fonctionACopier
  ; R1: 
fonctionACopier             
  
  MOV   R2, #0xFF00         
  
  ; Q2: Cette opération de décalage est équivalente à quelle opération arithmétique?
  ; R2: 
  ASR   R2, R2, #8
  ADD   R2, R2, #0xFF00       
  MOV   R1, #0
  
  ; Q3: À quoi correspond la valeur dans R3 après l'exécution de cette instruction?
  ; R3: 
  ADD   R3, PC, #-4
Boucle
  ; Q4: Décrivez ce que font les deux prochaines instructions (CMP et MOVEQ).
  ; R4: 
  CMP   R1, R2  
  MOVEQ R1, #0
  
  ADD   R1, R1, #1
  
  ; Q5: Peut-on remplacer cette instruction par "B Boucle"?
  ;     En d'autres mots, le programme continuera-t-il à s'exécuter en mémoire RAM 
  ;     ou bien retournera-t-il en ROM ? Est-ce que les expressions comme 
  ;     fonctionACopier réfèrent à des adresses mémoires absolues ou relatives ?
  ; R5: 
  MOV   PC, R3              
AdresseFin                  
                            
main
  LDR   SP, =MaPile         ; Préparons une pile (de 32 octets)
  ADD   SP, SP, #32         ; La pile descend, donc il faut commencer à la fin
  
  ; Q6: Pourquoi charge-t-on R0, R1, et R2 de telle façon?
  ; R6: 
  LDR   R0, =FonctionEnRAM  
  LDR	R1, =AdresseDebut   
  LDR 	R2, =AdresseFin     
  
  ; Q7: Pourquoi a-t-on besoin de cette instruction?
  ; R7: 
  SUB	R2, R2, R1
  
  ; Q8: Que fait l'instruction BL? Pourquoi n'utilise-t-on pas "B CopieMemoire"?
  ; R8: 
  BL    CopieMemoire  
  
  ; Q9: Une autre instruction pourrait remplacer celle-ci et atteindre le même 
  ;     résultat. Laquelle?
  ; R9: 
  MOV PC, R0
 
; -----------------------------------------------------------
; La fonction CopieMemoire reçoit les arguments/paramètres suivants:
; R0 - Adresse de destination
; R1 - Adresse de source
; R2 - Nombre d'octets à copier
CopieMemoire
  ; Écrivez le code de la fonction CopieMemoire (jusqu’à l’instruction BX LR).
  ; Aucune modification au code dans le reste du fichier asm.s n'est nécessaire. 

  ; Vous pouvez assumer que R2 contient toujours un multiple de 4. 
  ; Votre fonction doit fonctionner correctement si R2 contient 0 (même si ça n’est pas le cas ici). 

  ; Votre code doit contenir au moins un commentaire toutes les trois lignes 
  ; de code assembleur, qui décrit le fonctionnement de votre programme. 
  ; Tout programme sans commentaire se verra attribuer la note de 0. 

  ; Votre fonction CopieMemoire ne doit pas modifier le contenu des registres. 
  ; Cela inclut R0, R1, et R2, qui sont utilisés pour passer des arguments à la 
  ; fonction, et tout autre registre du micro-processeur que vous déciderez d’utiliser. 
  ; Indice : vous disposez d’une pile de 32 octets, elle pourrait vous être fort utile ! 

  BX LR
; -----------------------------------------------------------
  
  SECTION  `.noinit`:DATA(2)

; Q10: Quelle est l'adresse de début (premier octet) et de fin (dernier octet) 
;      de la variable FonctionEnRAM?
; R10: 
FonctionEnRAM	DS32	50 
MaPile          DS32    8  ; Pile de 32 octets. 

  END