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 |