diff --git a/exemples-asm.lisp b/exemples-asm.lisp new file mode 100644 index 0000000..935a291 --- /dev/null +++ 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