commit 81b7ced78fdb6bfa128c0a150572008376c33b72
parent 9d7f31df2bfd8c5aa5e2f8fdaf90f177ff0c0eeb
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Thu, 9 Dec 2010 16:20:59 +0100
Exemples d'asm pour l'emm***eur.
Diffstat:
| A | exemples-asm.lisp | | | 90 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 90 insertions(+), 0 deletions(-)
diff --git a/exemples-asm.lisp b/exemples-asm.lisp
@@ -0,0 +1,89 @@
+'(;; r0 := 42
+ (mov (constant 42) (register r0))
+
+ ;; mem[500] := 42
+ (mov (constant 42) (memory 500))
+
+ ;; mem[500] := mem[4+r0]
+ (mov (indexed 4 r0) (memory 500))
+
+ ;; mem[4+r0] := mem[r0]
+ (mov (indirect-register r0) (indexed 4 r0))
+
+ ;; r1 := mem[mem[42]]
+ (mov (indirect-constant 42) (register r1))
+
+ ;; r1 := mem[mem[4+r0]]
+ (mov (indirect-indexed 4 r0) (register r1))
+
+ ;; mem[mem[4+r0]] := r1
+ (mov (register r1) (indirect-indexed 4 r0))
+
+ ;; mem[sp] := r0
+ (push (register r0))
+
+ ;; Au chargement, mem[5152] := 112
+ ;; db === define byte
+ ;; Au lieu d'insérer l'opcode, on insère 112.
+ (db 112) ;; Ici c'est l'adresse 5152
+
+ ;; r0 := mem[@label42] + r0
+ ;; identique à : r0 := mem[1234] + r0
+ ;; variable est juste un nom "pratique"
+ (add (memory (label variable 3)) r0)
+
+ ;; Traduction de tout le bloc qui suit :
+ ;; Le segment de code contient après chargement, avant exécution :
+ ;; 0 : [call (memory 2)]
+ ;; 1 : [0]
+ ;; 2 : [add (memory 1) (register r0)]
+ ;;
+ ;; 0 : [Opcode de call]
+ ;; 1 : [Typecode de memory et nil]
+ ;; 2 : [2] ;; 1er param
+ ;; 3 : [rien, valeur au pif...] ;; 2e param
+ ;; ====
+ ;; 4 : [0]
+ ;; ====
+ ;; 5 : [Opcode de add]
+ ;; 6 : [Typecode de memory et register]
+ ;; 7 : [1]
+ ;; 8 : [Regcode de r0]
+ ;;
+ ;; Le tableau des labels est (séquenciellement) :
+ ;; #(nil nil nil nil nil) ;; avant ligne 0
+ ;; #(nil nil nil (0) nil) ;; call
+ ;; #(nil nil 1 (0) nil) ;; label
+ ;; #(nil nil 1 (0) nil) ;; db
+ ;; #(nil nil 1 2 nil) ;; label, on remplace à l'adresse 0
+ ;; #(nil nil 1 2 nil) ;; add
+ (mov (memory (label variable 0)) (memory (label variable 1)))
+;; (call (memory (label function 3))) ;; adresse 0
+ (label variable 2) ;; vide
+ (db (constant 0)) ;; adresse 1
+ (label function 3) ;; vide
+ (add (memory (label variable 2)) (register r0))) ;; adresse 2
+
+Pour les labels : Un seul tableau :
+#(nil
+ nil
+ (56 12 1)
+ 1234
+ nil
+ nil)
+
+Utilisation d'un (label x) :
+(defun get-label-position (x)
+ (if (listp (aref les-labels x))
+ (progn (push adresse-courante (aref les-labels x))
+ 0)
+ (aref les-labels x)))
+
+(defun set-label-position (x pos)
+ (when (numberp (aref les-labels x))
+ (error "Label ~a a déjà été défini !" x))
+ ;; "réparer" les références en avant
+ (dolist (i (aref les-labels x))
+ (setf (aref memory i) pos))
+ ;; définir pour les utilisations futures (ref arrières).
+ (setf (aref les-labels x) pos))
+\ No newline at end of file