Advertisement
Guest User

Untitled

a guest
Dec 2nd, 2017
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SPARK 14.58 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.     /*setx  tampon,%l7,%l0          !Adresse du tampon
  300.    
  301.     stuw    %i2,[%l0]               !Enregistrer le nombre à l'adresse du tampon
  302.     mov     4,%l5
  303.     sub     %l5,%i1,%l1             !index de debut du nombre dans le tampon
  304.     mov     0,%l2                   !compteur de la boucle
  305.     ldx     [%i0+16],%l3            !Obtention du pointeur sur la memoire de la machine virtuelle
  306.  
  307. empile10:
  308.     add     %l1,%l2,%l4             !index actuel du tampon
  309.     ldub    [%l0+%l4],%l4           !charger octet actuel
  310.  
  311.     lduw    [%i0+4],%l5             !Obtention du pointeur de pile
  312.     stub    %l4,[%l3+%l5]           !Sauvegarder l'octet
  313.     inc     %l5                     !incrementer le pointeur de pile
  314.     stuw    %l5,[%i0+4]             !enregistrer le nouveau pointeur de pile
  315.  
  316.     inc     %l2                     !incrementer le compteur de la boucle
  317.     cmp     %l2,%i1                 !condition de la boucle
  318.     bl      empile10                !continuer si il rester des octets a empiler
  319.     nop*/
  320.  
  321.     ret
  322.     restore
  323.  
  324. !---------------------------------------------------------------------------------
  325. /*
  326.         Entrées :         %i0 : adresse de la structure machineState
  327.                           %i1 : nombre d’octets à dépiler
  328.  
  329.         Sorties :         %o0 : les octets dépilés (placés côte à côte sur 32 bits).
  330. */
  331.  
  332. Depile:
  333.     save        %sp,-208,%sp
  334.  
  335.     lduw        [%i0+4],%l1             !Obtention du pointeur de pile
  336.     ldx         [%i0+16],%l2            !Obtention du pointeur sur la memoire de la machine virtuelle
  337.  
  338.     cmp         %i1,2                   !Si cest un int
  339.     be          depile10                !branchement vers int
  340.     nop                                 !...
  341.  
  342.     !FLOAT
  343.     ldub        [%l2+%l1],%o0           ! Charge premier octet du chiffre
  344.     sll         %o0,24,%o0              ! Shift left plus significatif
  345.     dec         %l1                     ! decrementer le pointeur de pile
  346.  
  347.     ldub        [%l2+%l1],%l3           ! Charge deuxieme octet du chiffre        
  348.     sll         %l3,16,%l3              ! Shift left plus significatif
  349.     add         %o0,%l3,%o0             !add les deux premiers octets dans o0
  350.     dec         %l1                     ! decrementer le pointeur de pile
  351.  
  352.     ldub        [%l2+%l1],%l3           ! Charge 3ieme octet du chiffre
  353.     sll         %l3,8,%l3               ! Shift left plus significatif
  354.     add         %o0,%l3,%o0             !add les 3 premiers octets dans o0
  355.     dec         %l1                     ! decrementer le pointeur de pile
  356.  
  357.     ldub        [%l2+%l1],%l3           ! Charge 4ieme octet du chiffre        
  358.     add         %o0,%l3,%o0             !add les 4 premier octet dans o0
  359.     dec         %l1                     ! decrementer le pointeur de pile
  360.  
  361.     ba depileFin
  362.     nop
  363.  
  364. depile10:!INT
  365.  
  366.     ldub        [%l2+%l1],%o0           ! Charge premier octet du chiffre
  367.     sll         %o0,8,%o0               ! Shift left plus significatif
  368.     dec         %l1                     ! decrementer le pointeur de pile
  369.  
  370.  
  371.     ldub        [%l2+%l1],%l3           !charge deuxieme octet
  372.     add         %o0,%l3,%o0             !add les octets
  373.     dec         %l1                     ! decrementer le pointeur de pile
  374.  
  375. depileFin:
  376.  
  377.     stuw        %l1,[%i0+4]             !enregistrer le nouveau pointeur de pile
  378.  
  379.     ret
  380.     restore
  381.  
  382. !---------------------------------------------------------------------------------
  383. /* 
  384.     POUR les EMU
  385.  
  386.     Entrées :  %i0 : adresse de la structure instruction
  387.                 %i1 : adresse de la structure machineState
  388. */
  389.  
  390.  
  391. EmuPush:
  392.         save        %sp,-208,%sp
  393.  
  394.  
  395.         mov         %i0,%o0                 !Premier param de empile = mache state
  396.         lduw        [%i1+8],%o2             !3 paramatre = les octect a empiler sur 32 biit
  397.  
  398.         lduw        [%i1+16],%l1            !Obtention du fl
  399.         cmp         %l1,0
  400.         be          EmuPush10               !Branche is cest un int
  401.         nop
  402.  
  403.         mov         4,%o1                   !si cest un float Param2 = 4 octect
  404.  
  405.  
  406.         ba          EmuPushFin
  407.         nop
  408.  
  409. EmuPush10:
  410.  
  411.         mov         2,%o1                   !si cest un int Param2 = 2 octect
  412.        
  413. EmuPushFin:
  414.  
  415.         call        Empile                  !Empile la valeur
  416.         nop
  417.        
  418.  
  419.         mov        0,%i0
  420.         ret
  421.         restore
  422. !---------------------------------------------------------------------------------
  423. EmuWrite:
  424.         save        %sp,-208,%sp
  425.  
  426.         mov         %i0,%o0                 !Premier param de depile = mache state
  427.  
  428.         lduw        [%i1+8],%l1             !Obtention du type float ou int
  429.         cmp         %l1,1
  430.         be          EmuWrite10              !Branche is cest un int
  431.         nop
  432.  
  433.  
  434.         ba          EmuWrite20              !Si cest un float
  435.         nop
  436.  
  437. EmuWrite10:
  438.        
  439.         mov         2,%o1                   !param 2 2 octet si un int
  440.  
  441.         call        Depile                  !Depile la val a imprimer
  442.         nop
  443.  
  444.  
  445.         mov         %i0,%l1                 !l1 = valeur depiler
  446.  
  447.         setx    printint,%l7,%o0
  448.         mov     %l1,%o1
  449.         call    printf
  450.         nop
  451.        
  452.         ba          EmuWriteFin             !
  453.         nop
  454.  
  455. EmuWrite20:
  456.  
  457.         mov         4,%o1                   !param 2 4 octet si un float
  458.    
  459.         call        Depile                  !Depile la val a imprimer
  460.         nop
  461.  
  462.         mov         %i0,%l1                 !l1 = valeur depiler
  463.  
  464.          setx   printfloat,%l7,%o0
  465.          mov    %l1,%o1
  466.          call   printf
  467.          nop
  468.  
  469.  
  470. EmuWriteFin:
  471.        
  472.        
  473.         mov        0,%i0
  474.         ret
  475.         restore
  476. !---------------------------------------------------------------------------------      
  477. EmuPop:
  478.         save        %sp,-208,%sp
  479.        
  480.        
  481.         mov        1,%i0
  482.         ret
  483.         restore
  484. !---------------------------------------------------------------------------------      
  485. EmuRead:
  486.         save        %sp,-208,%sp
  487.        
  488.        
  489.         mov        1,%i0
  490.         ret
  491.         restore
  492.        
  493.        
  494. !---------------------------------------------------------------------------------
  495. EmuAdd:
  496.         save        %sp,-208,%sp
  497.        
  498.        
  499.         mov        1,%i0
  500.         ret
  501.         restore
  502. !---------------------------------------------------------------------------------        
  503. EmuSub:
  504.         save        %sp,-208,%sp
  505.        
  506.        
  507.         mov        1,%i0
  508.         ret
  509.         restore
  510. !---------------------------------------------------------------------------------        
  511. EmuMul:
  512.         save        %sp,-208,%sp
  513.        
  514.        
  515.         mov        1,%i0
  516.         ret
  517.         restore
  518. !---------------------------------------------------------------------------------        
  519. EmuDiv:
  520.         save        %sp,-208,%sp
  521.        
  522.        
  523.         mov        1,%i0
  524.         ret
  525.         restore
  526.        
  527. !---------------------------------------------------------------------------------        
  528. EmuBz:
  529.         save        %sp,-208,%sp
  530.        
  531.        
  532.         mov        1,%i0
  533.         ret
  534.         restore
  535. !---------------------------------------------------------------------------------      
  536. EmuBn:
  537.         save        %sp,-208,%sp
  538.        
  539.        
  540.         mov        1,%i0
  541.         ret
  542.         restore
  543. !---------------------------------------------------------------------------------
  544. EmuJmp:
  545.         save        %sp,-208,%sp
  546.        
  547.        
  548.         mov        1,%i0
  549.         ret
  550.         restore
  551.        
  552.  
  553.  
  554.  
  555.  
  556.                
  557. .section ".rodata"                                        !Section Read Only Data
  558.                                                                         !Chaînes de caractères et constantes
  559.  
  560.         txt:         .asciz "%d\n"
  561.         subtxt:         .asciz "SUB\n"
  562.         multxt:         .asciz "MUL\n"
  563.         addtxt:         .asciz "ADD\n"
  564.         pushtxt:         .asciz "PUSH\n"
  565.         divtxt:         .asciz "DIV\n"
  566.         printint:       .asciz "-Print: %d\n"
  567.         printfloat:     .asciz "-Print: %f\n"
  568.  
  569. .section "bss"
  570.  
  571.                 .align 8
  572. tampon:        .skip 4*8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement