www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

exemples-asm.lisp (2566B)


      1 '(;; r0 := 42
      2   (mov (constant 42) (register r0))
      3   
      4   ;; mem[500] := 42
      5   (mov (constant 42) (memory 500))
      6   
      7   ;; mem[500] := mem[4+r0]
      8   (mov (indexed 4 r0) (memory 500))
      9   
     10   ;; mem[4+r0] := mem[r0]
     11   (mov (indirect-register r0) (indexed 4 r0))
     12   
     13   ;; r1 := mem[mem[42]]
     14   (mov (indirect-constant 42) (register r1))
     15   
     16   ;; r1 := mem[mem[4+r0]]
     17   ;; TODO : ou bien mem[4+mem[r0]] ???
     18   (mov (indirect-indexed 4 r0) (register r1))
     19   
     20   ;; mem[mem[4+r0]] := r1
     21   (mov (register r1) (indirect-indexed 4 r0))
     22   
     23   ;; mem[sp] := r0
     24   (push (register r0))
     25   
     26   ;; Au chargement, mem[5152] := 112
     27   ;; db === define byte
     28   ;; Au lieu d'insérer l'opcode, on insère 112.
     29   (db 112) ;; Ici c'est l'adresse 5152
     30 
     31   ;; r0 := mem[@label42] + r0
     32   ;; identique à : r0 := mem[1234] + r0
     33   ;; variable est juste un nom "pratique"
     34   (add (memory (label variable 3)) r0)
     35 
     36   ;; Traduction de tout le bloc qui suit :
     37   ;; Le segment de code contient après chargement, avant exécution :
     38   ;; 0 : [call (memory 2)]
     39   ;; 1 : [0]
     40   ;; 2 : [add (memory 1) (register r0)]
     41   ;; 
     42   ;; 0 : [Opcode de call]
     43   ;; 1 : [Typecode de memory et nil]
     44   ;; 2 : [2] ;; 1er param
     45   ;; 3 : [rien, valeur au pif...] ;; 2e param
     46   ;; ====
     47   ;; 4 : [0]
     48   ;; ====
     49   ;; 5 : [Opcode de add]
     50   ;; 6 : [Typecode de memory et register]
     51   ;; 7 : [1]
     52   ;; 8 : [Regcode de r0]
     53   ;; 
     54   ;; Le tableau des labels est (séquenciellement) :
     55   ;; #(nil nil nil nil nil) ;; avant ligne 0
     56   ;; #(nil nil nil (0) nil) ;; call
     57   ;; #(nil nil 1 (0) nil)   ;; label
     58   ;; #(nil nil 1 (0) nil)   ;; db
     59   ;; #(nil nil 1 2 nil)     ;; label, on remplace à l'adresse 0
     60   ;; #(nil nil 1 2 nil)     ;; add
     61   (mov (memory (label variable 0)) (memory (label variable 1)))
     62 ;;  (call (memory (label function 3))) ;; adresse 0
     63   (label variable 2)                 ;; vide
     64   (db (constant 0))                  ;; adresse 1
     65   (label function 3)                 ;; vide
     66   (add (memory (label variable 2)) (register r0))) ;; adresse 2
     67 
     68 Pour les labels : Un seul tableau :
     69 #(nil
     70   nil
     71   (56 12 1)
     72   1234
     73   nil
     74   nil)
     75 
     76 Utilisation d'un (label x) :
     77 (defun get-label-position (x)
     78   (if (listp (aref les-labels x))
     79       (progn (push adresse-courante (aref les-labels x))
     80              0)
     81     (aref les-labels x)))
     82 
     83 (defun set-label-position (x pos)
     84   (when (numberp (aref les-labels x))
     85     (error "Label ~a a déjà été défini !" x))
     86   ;; "réparer" les références en avant
     87   (dolist (i (aref les-labels x))
     88     (setf (aref memory i) pos))
     89   ;; définir pour les utilisations futures (ref arrières).
     90   (setf (aref les-labels x) pos))