Aller au contenu

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 :

Algorithme de division par 2
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 :

L'algorithme de la suite de Syracuse
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\).