Activer
Type
cycles
cycles (premier)
Vitesse d'exécution : ms
Français
SECTION INTVEC
B main
SECTION CODE
compteUns
; Cette fonction reçoit dans R4 le nombre à traiter
; Elle doit retourner dans R5 le nombre de '1' dans la représentation
; binaire de R4. Par exemple, si R4 = 0000 ... 0101, alors R5 doit valoir 2
; Aucun autre registre ne doit être modifié par cette fonction
;
; Idée générale : on utilise un masque avec un seul bit à 1,
; que l'on décale vers la gauche au fur et à mesure
; Si le AND entre ce masque et R4 n'est pas 0, alors c'est qu'il
; y avait un 1 à cette position dans R4, on incrémente alors R5
PUSH {R1,R2,R4}
MOV R1, #1 ; R1 sera utilisé comme masque
MOV R5, #0 ; R5 contient la réponse (le nombre de '1' dans la représentation binaire de R4)
boucle
ANDS R2, R4, R1 ; Equivalent à AND R2, R4, R1 suivi de CMP R2, #0
ADDNE R5, R5, #1 ; S'il y a un '1' à cette position, on incrémente R5
LSLS R1, R1, #1 ; Equivalent à LSL R1, R1, #1 suivi de CMP R1, #0
BNE boucle ; Après 32 LSL, la valeur de R1 sera de 0
; Si ce n'est pas le cas (condition NE) c'est qu'on n'a pas encore terminé
POP {R1,R2,R4}
BX LR
main
; On prépare la pile
LDR SP, =pile
ADD SP , SP , #20
; Tests de la fonction compteUns
MOV R4, #17
BL compteUns
MOV R4, #0
BL compteUns
MOV R4, #61
BL compteUns
MOV R4, #-2
BL compteUns
B main
; Section des donnes
SECTION DATA
pile ALLOC32 5
END