Lien entre matériel et logiciel

Type d'instructions

Les instructions d'un microprocesseur sont souvent nombreuses mais élémentaires.

Il existe différents types d'instructions :

    • opérations arithmétiques ou logiques : elles sont en lien avec l'UAL : addition, complémentation...
    • opérations d'échanges ou de transfert : sauver l'accumulateur, charger l'accumulateur avec une donnée....
    • opérations liées au fonctionnement du processeur : arrêt logiciel, masquage d'interruption...


Dans certains cas, les opérations ne nécessitent pas de d'opérande et le code machine de l'instruction se limite à un octet. Exemple : incrémenter A (INCA). On parle d'adressage implicite.


D'autres instructions nécessitent un opérande de 1 octet spécifié immédiatement à la suite de l'instruction. Exemple : ajouter $20 à A (LDAA #$20 en assembleur 6811). Il s'agit d'un adressage immédiat.


Pour d'autres instructions encore, l'opérande est spécifié par l'adresse mémoire dans laquelle il se trouve. Exemple : mettre le contenu de la case mémoire 1000 dans A (LDAA $1000). Il s'agit d'un adressage direct (adresse sur un octet) ou un adressage étendu (adresse sur 2 octets).


Comparaison : programmation en assembleur et en C

En C, toute variable doit être déclarée :

Par exemple : char monVar;

Cela permet de réserver un espace mémoire dans la mémoire.

En assembleur, le programmeur doit faire l'effort de réserver ses cases mémoires lui même. Pour associer un nom à l'adresse de la case mémoire, il doit utiliser la pseudo instruction EQU.

Exemple :

PortA EQU $1000

DDRA EQU $1001

DDRG EQU $1003

PortG EQU $1002


En C, pour trouver, l'adresse de la case mémoire renfermant une variable, il faut utiliser le caractère &

Ainsi, &maVar rend l'adresse où se trouve la variable monChar.

Dans cet exemple, maVar=4 et &maVar=00882AD0


En assembleur, on précise l'adresse de rangement d'une valeur.

 L'équivalent de maVar=4 serait si maVar est stockée en $1000 :

ldaa #$04

staa $1000

L'écriture par défaut (sans EQU) utilise donc directement l'adresse de stockage

Un pointeur est une variable qui contient l'adresse d'une variable

En C, la déclaration d'un pointeur se fait par :

char *pVar(0)

Exemple d'affectation de variable :

char temp;

pVar = &maVar;

temp = *pVar;


A la fin de l'exécution, temp=maVar

En assembleur, on dispose de registres d'index (X et parfois Y)  qui contiennent l'adresse d'une case mémoire contenant la variable.

Exemple : la case mémoire $1000 contient $04

adVar EQU $1000

on affecte à X l'adresse de la case mémoire contenant $04

   ldx #advar

   ldaa ,x

A aura la valeur $04 à la fin de l'exécution