Advertisement
Guest User

Untitled

a guest
Dec 2nd, 2017
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SPARK 11.09 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.         stuw        %i2,[%l0]                                !Enregistrer le nombre à l'adresse du tampon
  301.         sub         4,%i1,%l1                                 !index de debut du nombre
  302.         mov         0,%l2                                         !compteur de la boucle
  303.         ldx                [%i0+16],%l3                        !Obtention du pointeur sur la memoire de la machine virtuelle
  304.  
  305. empile10:
  306.         add         %l1,%l2,%l4                                !index actuel du tampon
  307.         ldub         [%l0+%l4],%l4                         !charger octet actuel
  308.  
  309.         lduw        [%i0+4],%l5                                !Obtention du pointeur de pile
  310.         stub         %l4,[%l3+%l5]                        !Sauvegarder l'octet
  311.         inc         %l5                                         !incrementer le pointeur de pile
  312.         stuw         %l5,[%i0+4]                         !enregistrer le nouveau pointeur de pile
  313.  
  314.         inc         %l2                                                !incrementer le compteur de la boucle
  315.         cmp         %l2,%i1                                        !condition de la boucle
  316.         bl                 empile10                                !continuer si il rester des octets a empiler
  317.         nop
  318.  
  319.         ret
  320.         restore
  321.  
  322.  
  323. /*
  324.         Entrées :         %i0 : adresse de la structure machineState
  325.                                 %i1 : nombre d’octets à dépiler
  326.         Sorties :         %o0 : les octets dépilés (placés côte à côte sur 32 bits).
  327. */
  328. Depile:
  329.         save        %sp,-208,%sp
  330.  
  331.         ret
  332.         restore
  333.  
  334.  
  335.  
  336.  
  337.  
  338. EmuPush:
  339.         save        %sp,-208,%sp
  340.        
  341.        
  342.         mov        0,%i0
  343.         ret
  344.         restore
  345.        
  346. EmuWrite:
  347.         save        %sp,-208,%sp
  348.        
  349.        
  350.         mov        1,%i0
  351.         ret
  352.         restore
  353.        
  354. EmuPop:
  355.         save        %sp,-208,%sp
  356.        
  357.        
  358.         mov        1,%i0
  359.         ret
  360.         restore
  361.        
  362. EmuRead:
  363.         save        %sp,-208,%sp
  364.        
  365.        
  366.         mov        1,%i0
  367.         ret
  368.         restore
  369.        
  370.        
  371.        
  372. EmuAdd:
  373.         save        %sp,-208,%sp
  374.        
  375.        
  376.         mov        1,%i0
  377.         ret
  378.         restore
  379.        
  380. EmuSub:
  381.         save        %sp,-208,%sp
  382.        
  383.        
  384.         mov        1,%i0
  385.         ret
  386.         restore
  387.        
  388. EmuMul:
  389.         save        %sp,-208,%sp
  390.        
  391.        
  392.         mov        1,%i0
  393.         ret
  394.         restore
  395.        
  396. EmuDiv:
  397.         save        %sp,-208,%sp
  398.        
  399.        
  400.         mov        1,%i0
  401.         ret
  402.         restore
  403.        
  404.        
  405. EmuBz:
  406.         save        %sp,-208,%sp
  407.        
  408.        
  409.         mov        1,%i0
  410.         ret
  411.         restore
  412.        
  413. EmuBn:
  414.         save        %sp,-208,%sp
  415.        
  416.        
  417.         mov        1,%i0
  418.         ret
  419.         restore
  420.  
  421. EmuJmp:
  422.         save        %sp,-208,%sp
  423.        
  424.        
  425.         mov        1,%i0
  426.         ret
  427.         restore
  428.        
  429.  
  430.  
  431.  
  432.  
  433.                
  434. .section ".rodata"                                        !Section Read Only Data
  435.                                                                         !Chaînes de caractères et constantes
  436.  
  437.         txt:         .asciz "%d\n"
  438.         subtxt:         .asciz "SUB\n"
  439.         multxt:         .asciz "MUL\n"
  440.         addtxt:         .asciz "ADD\n"
  441.         pushtxt:         .asciz "PUSH\n"
  442.         divtxt:         .asciz "DIV\n"
  443.  
  444. .section "bss"
  445.  
  446.                 .align 8
  447. tampon:        .skip 4*8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement