Simulation des principales structures de programme
Page réalisée par:
Philippe Moreau
UPJV

SI --- ALORS ---- SINON

Remarques:

- les étiquettes SI: , ALORS: , FIN_ALORS: , FIN_SINON: sont inutiles pour l'écriture du programme, mais peuvent permettre (au brouillon) de faciliter la traduction de la structure SI--- ALORS --- SINON.

- En règle générale cette structure sera réduite à: - ou encore, en faisant passer la séquence du "SINON" avant celle du "ALORS"

Exemple:

Traduire

SI D0=0 ALORS
D1 ← D1 + D2
SINON
D1 ← D1 + D3
FINSI

version1
SI:
CMP#0,D0
BNESINON
ALORS:
ADDD2,D1
FIN_ALORS:
BRAFINSI
SINON:
ADDD3,D1
FIN_SINON:
FINSI:
ou bien
CMP#0,D0
BNESINON
ADDD2,D1
BRAFINSI
SINON:
ADDD3,D1
FINSI:

ou encore

CMP#0,D0
BEQALORS
ADDD3,D1
BRAFINSI
ALORS:
ADDD2,D1
FINSI:

La boucle POUR


Exemple:

Faire une boucle d'attente qui se réalise 2000 fois

Donc "traduire":
Pour D0 ← 1 jusqu'à 2000 faire
 
 
FinPour
par:
POUR:
MOVE#1,D0
B_POUR:
CMP#2001,D0
BEQFINPOUR
ADD#1,D0
BRAB_POUR
FINPOUR:
ou encore en "décomptant":
MOVE#2000,D0
B_POUR:
CMP#0,D0
BEQFINPOUR
ADD#-1,D0
BRAB_POUR
FINPOUR:

Bien que les labels portent la mention "Pour", nous venons en fait d'écrire le principe de la boucle TANT QUE. (test d'arrêt placé en début de boucle)

la boucle REPETE ---- JUSQU'A


Remarque: Ici encore, l'étiquette FIN_REPETE est inutile mais permet de visualiser la fin de la séquence de boucle.

Exemple:

décrémenter le registre D0 jusqu'à ce que celui-ci soit nul

Donc "traduire":
Repète
 D0 ← D0 - 1
Jusqu'à D0=0
par:
REPETE:
ADD#-1,D0
CMP#0,D0
BNEREPETE
ou encore en:
REPETE:
ADD#-1,D0
BNEREPETE

Remarque: dans le dernier cas, on se sert du fait que l'addition (ADD) agit sur le bit Z du registre d'état pour tester ce bit avec BNE

Additif:

L'instruction DBRA

syntaxe:

DBRA Dn,Destination

Action réalisée:

On décrémente le registre Dn et si Dn est différent de -1 on effectue un branchement à Destination


Exemple d'utilisation: souvent on est amené à compter un certain nombre d'itérations. Exemple: on avait écrit une boucle qui se réalisait 2000 fois en décomptant.

Ce que l'on a écrit:
MOVE#2000,D0
B_POUR:
CMP#0,D0
BEQFINPOUR
ADD#-1,D0
BRAB_POUR
FINPOUR:
aurait pu s'écrire:
MOVE#1999,D0
REPETE:
ADD#-1,D0
CMP#-1,D0
BNEREPETE
ou encore:
MOVE#1999,D0
BOUCLE:
DBRABOUCLE

Les sous programmes

En assembleur la notion de procédure ou fonction (au sens vu dans le langage algorithmique) n'existe pas. Par contre il existe la notion de sous programmes; l'équivalent des procédures ou fonctions mais sans passage de paramètres ni notion de variables locales. Si l'on veut utiliser ces notions, il faudra les implanter (simuler).

Additif:

Les instructions JSR et RTS

syntaxe:

JSR Destination

Action réalisée:

On note sur la pile l'adresse de la ligne courante et on effectue un branchement à Destination


syntaxe:

RTS

Action réalisée:

On récupère l'adresse qui est sur la pile pour s'y rendre (après un JSR permet de revenir à l'endroit de l'appel



si dans le programme principal on trouve:
Séquence 1 d'instructions
JSRSSPRG
Séquence 2 d'instructions
et à un autre endroit dans le programme
SSPRG:
Séquence 3 d'instructions
RTS

Les séquences d'instructions seront alors exécutées dans l'ordre suivant:

Séquence 1 - Séquence 3 - Séquence 2