La pico-Machine



La pico-machine inventée par Pierre Weis et Xavier Leroy comme exemple de programme Caml, dans le livre Le langage Caml. Elle est écrite en Caml Light.

L'architecture

Une programme assembleur est une suite d'instructions. Chaque instruction peut aussi être précédée d'une étiquette (de la forme   [a-zA-z0-9_]* ) séparée de l'instruction par le caractère   : . Au lancement, l'exécution commence à la première instruction plutôt qu'à une étiquette conventionnelle.

La mémoire comporte une seule zone dynamique. Le registre pointeur de pile sp est initialisé au début du programme à l'adresse nn est la taille de la mémoire en bytes. C'est-à-dire que sp pointe sur le premier mot en dehors de la mémoire.

Les adresses basses peuvent donc être librement utilisées pour effectuer de l'allocation dynamique.

Registres et modes d'adressage

r nom de registre (r 0, r 1, ... r 31)
a constante entière
o r ou o

Le jeu d'instructions

Syntaxe Effet
add r1, o, r2 r1 + o ® r2
sub r1, o, r2 r1 - o ® r2
mult r1, o, r2 r1 × o ® r2
div r1, o, r2 r1 ÷ o ® r2
and r1, o, r2 r1 land o ® r2
or r1, o, r2 r1 lor o ® r2
xo r r1, o, r2 r1 lxor o ® r2
shl r1, o, r2 r1 lsl o ® r2
shr r1, o, r2 r1 lsr o ® r2
slt r1, o, r2 r1 < o ® r2
sle r1, o, r2 r1 £ o ® r2
seq r1, o, r2 r1 = o ® r2
load r1, o, r2 tas.(r1 + o) ® r2
store r1, o, r2 tas.(r1 + o) ¬ r2
jmp o, r pc+1 ® r Ù o ® pc
braz r, a saut en a si r = 0
branz r, a saut en a si r ¹ 0
scall n appel système numéro n
stop n arrêt de la machine
read lit un entier et le place dans r 1
write écrit l'entier contenu dans r 1

Les instructions read et write sont des pseudo instructions et s'expanse respectivement scall 0 et scall 1 (les seuls appels sytèmes implémentés).

Exemple

fact.asm
# Le programme principal 
        
read                    # lecture de l'argument (dans r 1)
        
jmp     factra        # calcul de la factorielle
        
write                   # écriture du résultat (r 1)
        
stop                            

# La fonction factorielle(N)
# L'argument N est dans r 1. Le résultat est mis dans r 1.
fact:   braz    r 1, fact_0     # N = 0 ?
        
sub     sp, 8, sp       # réserve deux places dans la pile
        
store   sp, 0, ra       # sauvegarde de l'adresse de retour
        
store   sp, 4, r 1      # et de la valeur de N
        
sub     r 1, 1, r 1
        
jmp     factra        # appel récursif sur N-1
        
load    sp, 4, r 2      # récupération de la valeur de N
        
mult    r 1, r 2, r 1   # calcul de N * fact(N-1)
        
load    sp, 0, ra       # récupération de l'adresse de retour
        
add     sp, 8, sp       # et de la place en pile
        
jmp     rar 0         # retour à l'appelant
fact_0add     r 0, 1, r 1     # mettre 1 dans r1
        
jmp     rar 0         # retour à l'appelant

Mise en oeuvre

Fabriquer un fichier exécutable:
        ~remy/bin/pico_asm fact.asm fact.o

Exécuter le fichier:
        ~remy/bin/pico_exec fact.o






This document was translated from LATEX by HEVEA.