Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2017
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SPARK 16.85 KB | None | 0 0
  1. .global Decode
  2. .global EmuPush
  3. .global EmuWrite
  4. .global EmuPop
  5. .global EmuRead
  6. .global EmuAdd
  7. .global EmuSub
  8. .global EmuMul
  9. .global EmuDiv
  10. .global EmuBz
  11. .global EmuBn
  12. .global EmuJmp
  13.  
  14. .section ".text"
  15.  
  16. Decode:        
  17.         save        %sp,-208,%sp        
  18.         lduw        [%i1],%l1                !Obtention du compteur ordinal
  19.         ldx         [%i1+16],%l0        !Obtention du pointeur sur la memoire de la machine virtuelle
  20.         ldub        [%l0+%l1],%l0        !Lecture du premier octet de l'instruction courante
  21.        
  22.  
  23.         nop
  24.        
  25.         cmp                %l0,0                        !Est-ce l'instruction HALT? (0x00)
  26.         be decodeHalt
  27.         nop
  28.        
  29.        
  30.         srl %l0, 2, %l2
  31.         sll %l2, 2, %l2
  32.        
  33.        ! mov  %l1,%o1        !Lecture du premier octet de l'instruction courante
  34.        ! setx        txt,%l7, %o0
  35.        ! call        printf
  36.        ! nop
  37.        
  38.         cmp %l2, 0x40
  39.         be decodePush
  40.         nop
  41.  
  42.         cmp %l2, 0x20
  43.         be decodeWrite
  44.         nop
  45.        
  46.         cmp %l2, 0x48
  47.         be decodeAdd
  48.         nop
  49.        
  50.         cmp %l2, 0x4c
  51.         be decodeSub
  52.         nop
  53.        
  54.         cmp %l2, 0x50
  55.         be decodeMul
  56.         nop
  57.        
  58.         cmp %l2, 0x54
  59.         be decodeDiv
  60.         nop
  61.        
  62.        
  63.  
  64.         !mov  %l0,%o1        !Lecture du premier octet de l'instruction courante
  65.         !call        printf
  66.         !nop
  67.        
  68.         !bnz         decodeError                !sinon, le reste n'est pas encore supporte: Erreur.
  69.         !nop
  70.  
  71.        
  72.  
  73. decodeSuccess:
  74.                
  75.         mov                0,%i0                        !code d'erreur 0: decodage reussi
  76.         ret                
  77.         restore        
  78.        
  79.        
  80. decodeHalt:
  81.         stw                %g0,[%i0]                !type d'instruction: systeme (0)
  82.         stw                %g0,[%i0+4]                !numero d'operation: 0 (HALT)
  83.         ba decodeSuccess
  84.         nop
  85.  
  86. decodeWrite:
  87.  
  88.         mov     0,%l2          
  89.         stw     %l2,[%i0]                            !mode 00
  90.  
  91.         mov     4,%l2                                !4 = 100 binaire
  92.         stw     %l2,[%i0+4]                          !operation = 100 (WHRITE)
  93.  
  94.         sll     %l0,29,%l2
  95.         srl     %l2,29,%l2                          !va chercher les 3 dernier bit de format    (001 ou 011)
  96.         stw     %l2,[%i0+8]                         !operande %d(001) 0u %f(011)
  97.  
  98.                                                     !cc non utiliser
  99.                                                     !fl non utiliser
  100.      
  101.         mov     1,%l2
  102.         stw     %l2,[%i0+20]                        !Size 1
  103.  
  104.         ba decodeSuccess
  105.         nop
  106.        
  107. decodePush:
  108.  
  109.        
  110.  
  111.         mov     1,%l2          
  112.         stw     %l2,[%i0]                            !mode 01
  113.  
  114.         mov     0,%l2          
  115.         stw     %l2,[%i0+4]                          !operation: 0 (PUSH)
  116.  
  117.                                                      !CC est toujours 0
  118.                                    
  119.  
  120.         sll     %l0,31,%l2
  121.         srl     %l2,31,%l2                          !va chercher si un int ou float
  122.         cmp     %l2,0                               !Si cest un int
  123.         be      decodePush10
  124.         nop
  125.  
  126.         !FLOAT
  127.  
  128.  
  129.         mov     1,%l2          
  130.         stw     %l2,[%i0+16]                             !FL = 1 (FLOAT)
  131.  
  132.  
  133.         lduw        [%i1],%l1                       !Obtention du compteur ordinal
  134.         ldx         [%i1+16],%l0                    !Obtention du pointeur sur la memoire de la machine virtuelle
  135.  
  136.         add     %l0,%l1,%l2                         !l2 adresse courante
  137.  
  138.         ldub    [%l2+1],%l3                         ! Charge premier octet du chiffre
  139.         sll     %l3,24,%l3                          ! Shift left plus significatif
  140.  
  141.         ldub    [%l2+2],%l4                         ! Charge deuxieme octet du chiffre 
  142.         sll     %l4,16,%l4                          ! Shift left plus significatif
  143.         add     %l3,%l4,%l3                         !add les deux premier octet dans l3
  144.  
  145.         ldub    [%l2+3],%l4                         ! Charge 3ieme octet du chiffre
  146.         sll     %l4,8,%l4                           ! Shift left plus significatif
  147.         add     %l3,%l4,%l3                         !add les 3 premier octet dans l3
  148.  
  149.         ldub    [%l2+4],%l4                         ! Charge 4ieme octet du chiffre
  150.         add     %l3,%l4,%l3                         !add les 4 premier octet dans l3
  151.  
  152.  
  153.         !ldub   [%l2+2],%l4                         !charge deuxieme octet
  154.         !add    %l3,%l4,%l3                         !add les octets
  155.  
  156.         stw     %l3,[%i0+8]                         !add operand
  157.  
  158.         mov     5,%l2
  159.         stw     %l2,[%i0+20]                        !Size 5
  160.  
  161.         ba decodeSuccess
  162.         nop
  163.  
  164. decodePush10:!INT
  165.        
  166.         mov     0,%l2          
  167.         stw     %l2,[%i0+16]                        !FL = 0 (INT)
  168.  
  169.         lduw    [%i1],%l1                           !Obtention du compteur ordinal
  170.         ldx     [%i1+16],%l0                        !Obtention du pointeur sur la memoire de la machine virtuelle
  171.        
  172.         add     %l0,%l1,%l2                         !l2 adresse courante
  173.         ldub    [%l2+1],%l3                         ! Charge premier octet du chiffre
  174.         sll     %l3,8,%l3                           ! Shift left plus significatif
  175.  
  176.  
  177.  
  178.         ldub    [%l2+2],%l4                         !charge deuxieme octet
  179.         add     %l3,%l4,%l3                         !add les octets
  180.  
  181.         stw     %l3,[%i0+8]                         !add operand
  182.  
  183.         mov     3,%l2
  184.         stw     %l2,[%i0+20]                        !Size 3
  185.  
  186.            
  187.         ba decodeSuccess
  188.         nop
  189.  
  190. decodeAdd:
  191.  
  192.         setx        addtxt,%l7, %o0
  193.         call        printf
  194.         nop
  195.  
  196.         mov     2,%l2          
  197.         stw     %l2,[%i0]                            !mode 10
  198.  
  199.         mov     2,%l2          
  200.         stw     %l2,[%i0+4]                          !operation: 0010 (ADD)
  201.  
  202.  
  203.         sll     %l0,31,%l2
  204.         srl     %l2,31,%l2                          !va chercher si un int ou float
  205.         stw     %l2,[%i0+16]                        !FL = int ou float
  206.  
  207.         mov     1,%l2
  208.         stw     %l2,[%i0+20]                        !Size 1
  209.  
  210.  
  211.        
  212.         ba decodeSuccess
  213.         nop
  214.  
  215. decodeSub:
  216.         setx        subtxt,%l7, %o0
  217.         call        printf
  218.         nop
  219.  
  220.         mov     2,%l2          
  221.         stw     %l2,[%i0]                            !mode 10
  222.  
  223.         mov     3,%l2          
  224.         stw     %l2,[%i0+4]                          !operation: 0011 (SUB)
  225.  
  226.         sll     %l0,31,%l2
  227.         srl     %l2,31,%l2                          !va chercher si un int ou float
  228.         stw     %l2,[%i0+16]                        !FL = int ou float
  229.  
  230.         mov     1,%l2
  231.         stw     %l2,[%i0+20]                        !Size 1
  232.  
  233.                
  234.         ba decodeSuccess
  235.         nop
  236.  
  237. decodeMul:
  238.         setx        multxt,%l7, %o0
  239.         call        printf
  240.         nop
  241.  
  242.         mov     2,%l2          
  243.         stw     %l2,[%i0]                            !mode 10
  244.  
  245.         mov     4,%l2          
  246.         stw     %l2,[%i0+4]                          !operation: 0100 (MUL)
  247.  
  248.  
  249.         sll     %l0,31,%l2
  250.         srl     %l2,31,%l2                          !va chercher si un int ou float
  251.         stw     %l2,[%i0+16]                        !FL = int ou float
  252.  
  253.         mov     1,%l2
  254.         stw     %l2,[%i0+20]                        !Size 1
  255.                
  256.         ba decodeSuccess
  257.         nop
  258.  
  259. decodeDiv:
  260.         setx        divtxt,%l7, %o0
  261.         call        printf
  262.         nop
  263.  
  264.         mov     2,%l2          
  265.         stw     %l2,[%i0]                            !mode 10
  266.  
  267.         mov     5,%l2          
  268.         stw     %l2,[%i0+4]                          !operation: 0101 (DIV)
  269.  
  270.  
  271.         sll     %l0,31,%l2
  272.         srl     %l2,31,%l2                          !va chercher si un int ou float
  273.         stw     %l2,[%i0+16]                        !FL = int ou float
  274.  
  275.         mov     1,%l2
  276.         stw     %l2,[%i0+20]                        !Size 1
  277.  
  278.                
  279.         ba decodeSuccess
  280.         nop
  281.        
  282. decodeError:
  283.        
  284.         mov        1,%i0                !code d'erreur 1: instruction illegale.
  285.         ret
  286.         restore
  287.  
  288. !---------------------------------------------------------------------------------
  289.                
  290. /*
  291.     Entrées :  %i0 : adresse de la structure machineState
  292.                 %i1 : nombre d’octets à empiler
  293.                 %i2 : les octets à empiler (placés côte à côte sur 32 bits).
  294.     Sorties :   aucune.
  295. */
  296. Empile:
  297.     save        %sp,-208,%sp
  298.  
  299.     lduw        [%i0+4],%l1             !Obtention du pointeur de pile
  300.     ldx         [%i0+16],%l2            !Obtention du pointeur sur la memoire de la machine virtuelle
  301.  
  302.     cmp         %i1,2                   !Si cest un int (2 octets)
  303.     be          empile10                !branchement vers int
  304.     nop                                 !...
  305.  
  306.  
  307.  
  308.     !FLOAT (4 octets)
  309.     sll         %i2,24,%l0              !Obtenir l'octet le moins significatif, partie 1
  310.     srl         %l0,24,%l0              !Obtenir l'octet le moins significatif, partie 2
  311.     stub         %l0,[%l2+%l1]           !Empiler l'octet
  312.     inc         %l1                     !Incrementer le pointeur de pile
  313.  
  314.    
  315.  
  316.     sll         %i2,16,%l0              !Obtenir l'octet le deuxieme moins significatif, partie 1
  317.     srl         %l0,24,%l0              !Obtenir l'octet le deuxieme moins significatif, partie 2
  318.     stb         %l0,[%l2+%l1]           !Empiler l'octet
  319.     inc         %l1                     !Incrementer le pointeur de pile
  320.  
  321.  
  322.  
  323.     sll         %i2,8,%l0               !Obtenir l'octet le deuxieme plus significatif, partie 1
  324.     srl         %l0,24,%l0              !Obtenir l'octet le deuxieme plus significatif, partie 2
  325.     stub         %l0,[%l2+%l1]           !Empiler l'octet
  326.     inc         %l1                     !Incrementer le pointeur de pile
  327.  
  328.  
  329.     srl         %i2,24,%l0              !Obtenir l'octet le plus significatif
  330.     stb         %l0,[%l2+%l1]           !Empiler l'octet
  331.     inc         %l1                     !Incrementer le pointeur de pile
  332.  
  333.    
  334.  
  335.     ba empileFin
  336.     nop
  337.  
  338. empile10:!INT (2 octets)
  339.        
  340.  
  341.     sll         %i2,24,%l0              !Obtenir l'octet le moins significatif, partie 1
  342.     srl         %l0,24,%l0              !Obtenir l'octet le moins significatif, partie 2
  343.     stub         %l0,[%l2+%l1]           !Empiler l'octet
  344.     inc         %l1                     !Incrementer le pointeur de pile
  345.  
  346.   setx  printint,%l7,%o0
  347.         mov     %l0,%o1
  348.         call    printf
  349.         nop
  350.  
  351.  
  352.     sll         %i2,16,%l0              !Obtenir l'octet le moins significatif, partie 1
  353.     srl         %l0,24,%l0              !Obtenir l'octet le moins significatif, partie 2
  354.     stub         %l0,[%l2+%l1]           !Empiler l'octet
  355.     inc         %l1                     !Incrementer le pointeur de pile
  356.  
  357.          setx   printint,%l7,%o0
  358.         mov     %l0,%o1
  359.         call    printf
  360.         nop
  361.  
  362. empileFin:
  363.  
  364.     stuw        %l1,[%i0+4]             !enregistrer le nouveau pointeur de pile
  365.  
  366.  
  367.     ret
  368.     restore
  369.  
  370. !---------------------------------------------------------------------------------
  371. /*
  372.         Entrées :         %i0 : adresse de la structure machineState
  373.                           %i1 : nombre d’octets à dépiler
  374.  
  375.         Sorties :         %o0 : les octets dépilés (placés côte à côte sur 32 bits).
  376. */
  377.  
  378. Depile:
  379.     save        %sp,-208,%sp
  380.  
  381.     lduw        [%i0+4],%l1             !Obtention du pointeur de pile
  382.     ldx         [%i0+16],%l2            !Obtention du pointeur sur la memoire de la machine virtuelle
  383.  
  384.     cmp         %i1,2                   !Si cest un int (2 octets)
  385.     be          depile10                !branchement vers int
  386.     nop                                 !...
  387.  
  388.     !FLOAT (4 octets)
  389.     dec         %l1                     ! decrementer le pointeur de pile
  390.     ldub        [%l2+%l1],%o0           ! Charge premier octet du chiffre
  391.     sll         %o0,24,%o0              ! Shift left plus significatif
  392.  
  393.     dec         %l1                     ! decrementer le pointeur de pile
  394.     ldub        [%l2+%l1],%l3           ! Charge deuxieme octet du chiffre        
  395.     sll         %l3,16,%l3              ! Shift left plus significatif
  396.     add         %o0,%l3,%o0             !add les deux premiers octets dans o0
  397.  
  398.     dec         %l1                     ! decrementer le pointeur de pile
  399.     ldub        [%l2+%l1],%l3           ! Charge 3ieme octet du chiffre
  400.     sll         %l3,8,%l3               ! Shift left plus significatif
  401.     add         %o0,%l3,%o0             !add les 3 premiers octets dans o0
  402.  
  403.     dec         %l1                     ! decrementer le pointeur de pile
  404.     ldub        [%l2+%l1],%l3           ! Charge 4ieme octet du chiffre        
  405.     add         %o0,%l3,%o0             !add les 4 premier octet dans o0
  406.  
  407.     ba depileFin
  408.     nop
  409.  
  410. depile10:!INT (2 octets)
  411.    
  412.     dec         %l1                     ! decrementer le pointeur de pile
  413.     ldub        [%l2+%l1],%o0           ! Charge premier octet du chiffre
  414.     mov         %o0,%l5
  415.    
  416.     sll         %l5,8,%l5               ! Shift left plus significatif
  417.  
  418.     setx    printint,%l7,%o0
  419.         mov     %l5,%o1
  420.         call    printf
  421.         nop
  422.  
  423.    
  424.  
  425.     dec         %l1                     ! decrementer le pointeur de pile
  426.     ldub        [%l2+%l1],%l3           !charge deuxieme octet
  427.     add         %l5,%l3,%l5             !add les octets
  428.  
  429.  
  430.     setx    printint,%l7,%o0
  431.         mov     %l5,%o1
  432.         call    printf
  433.         nop
  434.  
  435.         mov     %l5,%i0
  436.  
  437.         setx    tampon,%l7,%l0
  438.         stw     %l5,[%l0]
  439.  
  440.  
  441.  
  442. depileFin:
  443.  
  444.     stuw        %l1,[%i0+4]             !enregistrer le nouveau pointeur de pile
  445.  
  446.     ret
  447.     restore
  448.  
  449. !---------------------------------------------------------------------------------
  450. /* 
  451.     POUR les EMU
  452.  
  453.     Entrées :  %i0 : adresse de la structure instruction
  454.                 %i1 : adresse de la structure machineState
  455. */
  456.  
  457.  
  458. EmuPush:
  459.         save        %sp,-208,%sp
  460.  
  461.  
  462.         mov         %i1,%o0                 !Premier param de empile = mache state
  463.         lduw        [%i0+8],%o2             !3 paramatre = les octect a empiler sur 32 biit
  464.  
  465.         lduw        [%i0+16],%l1            !Obtention du fl
  466.         cmp         %l1,0
  467.         be          EmuPush10               !Branche is cest un int
  468.         nop
  469.  
  470.         mov         4,%o1                   !si cest un float Param2 = 4 octect
  471.  
  472.  
  473.         ba          EmuPushFin
  474.         nop
  475.  
  476. EmuPush10:
  477.  
  478.         mov         2,%o1                   !si cest un int Param2 = 2 octect
  479.        
  480. EmuPushFin:
  481.  
  482.         call        Empile                  !Empile la valeur
  483.         nop
  484.        
  485.  
  486.         mov        0,%i0
  487.         ret
  488.         restore
  489. !---------------------------------------------------------------------------------
  490. EmuWrite:
  491.         save        %sp,-208,%sp
  492.  
  493.         mov         %i1,%o0                 !Premier param de depile = mache state
  494.  
  495.         lduw        [%i0+8],%l1             !Obtention du type float ou int
  496.         cmp         %l1,1
  497.         be          EmuWrite10              !Branche is cest un int
  498.         nop
  499.  
  500.  
  501.         ba          EmuWrite20              !Si cest un float
  502.         nop
  503.  
  504. EmuWrite10:
  505.  
  506.        
  507.        
  508.         mov         2,%o1                   !param 2 2 octet si un int
  509.  
  510.         call        Depile                  !Depile la val a imprimer
  511.         nop
  512.  
  513.  
  514.         !mov            %i0,%l1                 !l1 = valeur depiler
  515.         setx        tampon,%l7,%l1
  516.         lduw        [%l1],%o1
  517.  
  518.    
  519.  
  520.         setx    printint,%l7,%o0
  521.         !mov    %i0,%o1
  522.         call    printf
  523.         nop
  524.        
  525.         ba          EmuWriteFin             !
  526.         nop
  527.  
  528. EmuWrite20:
  529.  
  530.  
  531.  
  532.         mov         4,%o1                   !param 2 4 octet si un float
  533.    
  534.         call        Depile                  !Depile la val a imprimer
  535.         nop
  536.  
  537.         !mov            %i0,%l1                 !l1 = valeur depiler
  538.  
  539.          setx   printfloat,%l7,%o0
  540.          mov    %i0,%o1
  541.          call   printf
  542.          nop
  543.  
  544.  
  545. EmuWriteFin:
  546.        
  547.        
  548.         mov        0,%i0
  549.         ret
  550.         restore
  551. !---------------------------------------------------------------------------------      
  552. EmuPop:
  553.         save        %sp,-208,%sp
  554.        
  555.        
  556.         mov        1,%i0
  557.         ret
  558.         restore
  559. !---------------------------------------------------------------------------------      
  560. EmuRead:
  561.         save        %sp,-208,%sp
  562.        
  563.        
  564.         mov        1,%i0
  565.         ret
  566.         restore
  567.        
  568.        
  569. !---------------------------------------------------------------------------------
  570. EmuAdd:
  571.         save        %sp,-208,%sp
  572.        
  573.        
  574.         mov        1,%i0
  575.         ret
  576.         restore
  577. !---------------------------------------------------------------------------------        
  578. EmuSub:
  579.         save        %sp,-208,%sp
  580.        
  581.        
  582.         mov        1,%i0
  583.         ret
  584.         restore
  585. !---------------------------------------------------------------------------------        
  586. EmuMul:
  587.         save        %sp,-208,%sp
  588.        
  589.        
  590.         mov        1,%i0
  591.         ret
  592.         restore
  593. !---------------------------------------------------------------------------------        
  594. EmuDiv:
  595.         save        %sp,-208,%sp
  596.        
  597.        
  598.         mov        1,%i0
  599.         ret
  600.         restore
  601.        
  602. !---------------------------------------------------------------------------------        
  603. EmuBz:
  604.         save        %sp,-208,%sp
  605.        
  606.        
  607.         mov        1,%i0
  608.         ret
  609.         restore
  610. !---------------------------------------------------------------------------------      
  611. EmuBn:
  612.         save        %sp,-208,%sp
  613.        
  614.        
  615.         mov        1,%i0
  616.         ret
  617.         restore
  618. !---------------------------------------------------------------------------------
  619. EmuJmp:
  620.         save        %sp,-208,%sp
  621.        
  622.        
  623.         mov        1,%i0
  624.         ret
  625.         restore
  626.        
  627.  
  628.  
  629.  
  630.  
  631.                
  632. .section ".rodata"                                        !Section Read Only Data
  633.                                                                         !Chaînes de caractères et constantes
  634.  
  635.         txt:         .asciz "%d\n"
  636.         subtxt:         .asciz "SUB\n"
  637.         multxt:         .asciz "MUL\n"
  638.         addtxt:         .asciz "ADD\n"
  639.         pushtxt:         .asciz "PUSH\n"
  640.         divtxt:         .asciz "DIV\n"
  641.         printint:       .asciz "-Print: %d\n"
  642.         printfloat:     .asciz "-Print: %f\n"
  643.  
  644. .section "bss"
  645.  
  646.                 .align 8
  647. tampon:        .skip 4*8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement