logo Prof-TC.png
Des cours, des TP, des exercices corrigés pour les élèves du lycée
Recherche
SECONDE - PC
SCIENCES PREMIERE
SCIENCES TERMINALE
PREMIERE PC
SCIENCES & LABO
ANCIENNES TS
KHOLLES MPSI
Langage machine
 

Qu'est ce?
 
Le processeur fonctionne avec des micros-instructions que nous étudierons en terminale. Ces micros instructions qui décrivent chacune une étape du cycle du processeur permettent de créer le langage de programmation le plus proche du processeur: l'assembleur. Ce langage placé en mémoire morte de l'ordinateur ne contient pas beaucoup d'instructions mais permet de faire fonctionner le bios puis tout le système d'exploitation.

Chaque instruction du langage assembleur est stockée à une adresse mémoire et se décompose en 2 parties: le code de l'opération qui donne l'opération à exécuter et une adresse pour l'opérande (son argument). Par exemple "add X" additionne le contenu de la mémoire X au contenu debug de l'accumulateur.

Dans la machine virtuelle que nous allons utiliser, comme il y a plusieurs registres, il y aura souvent un opérande de plus pour préciser le registre utilisé. Cette machine virtuelle est sur 32 bits, ce qui permet des commandes qui choisissent le registre.

Les instructions
 
Nous allons utiliser le simulateur d'assembleur de Peter Higginson: http://www.peterhigginson.co.uk/AQA/.

Cette machine virtuelle simule une architecture de 32 bits. L'instruction Halt n'existe pas en pratique.

Voici la liste des instructions:
- LDR Rd, adresse mémoire: charge la valeur de l'adresse dans le registre Rd. Exemple ldr R0, 100 charge le contenu de l'adresse 100 dans le registre 0. Important, si on écrit ldr r0, [r1]: c'est le contenu du registre r1 qui donne l'adresse à lire et à placer en r0. La première solution c'est l'adressage direct, la seconde l'adressage indirect.
- STR Rd, adresse mémoire: place le contenu du registre Rd à l'adresse mémoire.
- ADD Rd, Rn, opérande: additionne opérande et Rn et place le résultat dans Rd. Opérande peut être un nombre (précédé de dièse) ou la valeur d'un registre Rm.
- SUB Rd, Rn, operand2: idem mais soustraction.
- MOV Rd, operand2: copie la valeur de opérande dans Rd.
- CMP Rn, operand2: effectue la comparaison entre Rn et l'opérande. Attention, cette instruction ne traite pas le résultat de la comparaison! C'est le rôle de la commande suivante.
- B condition étiquette: la condition peut être EQ:Equal to, NE:Not equal to, GT:Greater than, LT:Less than. L'étiquette est un nom que nous choisissons pour savoir où sauter si la condition est réalisée. Par exemple cmp R1,R0, puis BEQ suite va faire: "si R0=R1" aller à la ligne suite. Remarquez que si l'égalité n'est pas vraie...on passe automatiquement à la ligne de code suivante. Pour indiquer ou est la ligne suite, on tape sur une ligne vide suite suivi de :. Soit suite:.
- B étiquette: saut sans condition à la ligne nommée étiquette.
- AND Rd, Rn, opérande: effectue un AND (bits à bits !) entre opérande et Rn et place la réponse dans Rd.
- ORR Rd, Rn, opérande: effectue un OR (bits à bits !) entre opérande et Rn et place la réponse dans Rd.
- EOR Rd, Rn, opérande: effectue un XOR (bits à bits !) entre opérande et Rn et place la réponse dans Rd.
- MVN Rd, opérande: effectue un NOT (bits à bits !) sur opérande et place la réponse dans Rd.
- LSL Rd, Rn, operand2: déplace les bits de Rn de 'opérande' bits vers la gauche et stocke dans Rd (multiplication par 2, souvenez vous!).
- LSR Rd, Rn, operand2: déplace les bits de Rn de 'opérande' bits vers la droite et stocke dans Rd (division par 2!).
- HALT: arrêt du programme.
- int Rd,2: attend un nombre en entrée.
- out Rd, nombre: affiche à l'écran. out Rd,4 affiche un nombre signé ou non(Rd,5). Rd,6 affiche en hexadécimal et Rd,7 affiche un caractère.

Remarque: Pour saisir un hexadécimal taper suivant le modèle 0xnnn

Exemples
 
Commençons par un exemple très simple proposé dans logiciel. L'utilisateur va entrer deux nombres, et le programme va afficher leur somme.
 
INP R0,2
INP R1,2
ADD R2,R1,R0
OUT R2,4
HALT

Voici un code plus complexe et commenté. Il sert à chercher le maximum d'un tableau de nombres. Vous devrez taper à l'adresse 180 l'adresse du début du tableau. Le tableau est considéré comme fini dès qu'il y a un zéro.

Les commentaires sont précédés de /

 
            ldr R0,180                   /l'adresse 180 contient le début du tableau
            mov R1,#1                  /place 1 dans R1, sert à incrémenter l'index
            ldr r2,188                    /en r2 je stocke la valeur de fin de liste
            ldr r10,[r0]                  /r10 sera le registre de lecture
            ldr r11, [r0]                 /r11 le registre contenant le max
debut:                                     /debut tant que
            cmp r10,r2
            beq fin                        /si on est fin de liste, aller à fin
            add r0,r1,r0                /on incrémente l'index
            cmp r10,r11
            blt pasnewmax          /si r10>r11 on
            mov r11,r10                /met r10 dans r11
pasnewmax:                          /fin si, reprise code
            ldr r10, [r0]                 /chargement valeur suivante
            b debut                       /fin tant que
fin:
            out r11,4                     /affiche max liste
            halt

Date de création : 07/03/2021 16:02
Dernière modification : 07/03/2021 16:02
Catégorie : INFORMATIQUE - Architecture
Page lue 1290 fois
Précédent  
  Suivant

SECONDE - SNT
PREMIERE NSI
PYTHON - ARDUINO
SCIENCES
INFORMATIQUE