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))