Programmes plus complexesâïž
Exercice 8
Le programme de l'exercice 7 permet de rĂ©aliser une division euclidienne. Nous allons maintenant faire un programme qui permet de faire une division par 2. Pour cela nous allons utiliser l'algorithme suivant, oĂč a
est le nombre Ă diviser :
b â 0
tant que a > b:
a â a - 1
b â b + 1
Ăcrire un programme rĂ©alisant cet algorithme.
La bonne façon de diviser par 2
En fait, la division par 2 en binaire est trĂšs simple. Il suffit dâenlever le bit de droite.
Pour cela, on peut utiliser lâinstruction LSR dest, op1, op2
qui met dans dest
la valeur de op1
oĂč les op2
derniers bits ont été enlevés.
Ainsi LSR R0, R0, #1
divise R0
par 2.
Exercice 9
Ăcrire un programme en assembleur qui triple la valeur de R0
. Le résultat doit se trouver dans R0
.
Indice
Il faut obligatoirement utiliser un autre registre.
Exercice 10
Ăcrire un programme en assembleur qui calcule dans R1
la durée de vol de la suite de Syracuse obtenue en partant de R0
. Ne pas utiliser R2
, parce que vous en aurez besoin pour l'exercice suivant.
Pour rappel, l'algorithme est :
Tant que U > 1:
Si U est pair:
U â U/2
Sinon:
U â 3U+1
Exercice 11
Modifier le programme prĂ©cĂ©dent pour quâil stocke dans R2
la valeur maximale obtenue dans la suite de Syracuse en partant de R0
.
Exercice 12
Ăcrire un programme en assembleur qui dĂ©termine si R0
est divisible par R1
. Si câest le cas, mettre 1 dans R2
, sinon mettre 0.
Exercice 13
Ăcrire un programme en assembleur qui calcule le plus grand entier \(n\) tel que \(n^2 \leq\) R0
. Vous pouvez pour cela stocker la valeur de \(n\) dans R1
et de \(n^2\) dans R2
. On rappelle aussi que \((n + 1)^2 = n^2 + n + n + 1\).