Advertisement
Guest User

Untitled

a guest
Nov 30th, 2017
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SPARK 3.64 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. /**
  17.     %i0 = Pointeur sur une structure instruction
  18.     %i1 = Pointeur sur une structure machine state
  19. **/
  20. Decode:
  21.     save    %sp,-208,%sp   
  22.     lduw    [%i1],%l1       ! Obtention du compteur ordinal
  23.     ldx     [%i1+16],%l0    ! Obtention du pointeur sur la memoire de la machine virtuelle
  24.     mov     %l0,%l2
  25.     ldub    [%l0+%l1],%l0   ! Lecture du premier octet de l'instruction courante
  26.  
  27.     cmp     %l0,0x40        ! Est-ce l'instruction PUSH? (0x40)
  28.     be      decodePush
  29.     nop
  30.  
  31.     cmp     %l0,0x21
  32.     be      decodeWrite
  33.     nop
  34.  
  35.     cmp     %l0,0           ! Est-ce l'instruction HALT? (0x00)
  36.     bnz     decodeError     ! sinon, le reste n'est pas encore supporte: Erreur.
  37.     nop                     !...
  38.  
  39.     ! Opération HALT
  40.     stw     %g0,[%i0]       ! type d'instruction: systeme (0) - (MODE / machine.h)
  41.     stw     %g0,[%i0+4]     ! numero d'operation: 0 (HALT) - (OPÉRATION / machine.h)
  42.        
  43.     ba      decodeEnd
  44.     nop
  45.  
  46. decodePush:
  47.    
  48.     mov     1,%l0           ! ...
  49.     stw     %l0,[%i0]       ! Met le type d'instruction: 1
  50.  
  51.     mov     0,%l0           ! ...
  52.     stw     %l0,[%i0+4]     ! Met le numero d'operation: 0 (PUSH)
  53.  
  54.     mov     3,%l0           ! ...
  55.     stw     %l0,[%i0+20]    ! Met la taille de l'opération push dans l'instruction
  56.  
  57.     add     %l2,%l1,%l2     ! ...
  58.     ldub    [%l2 + 1],%l3   ! Charge le premier octet du chiffre
  59.     sll     %l3,4,%l3       ! Shift left
  60.  
  61.     ldub    [%l2 + 2],%l0   ! Charge le deuxieme octet du chiffre
  62.     add     %l3,%l0,%l3     ! Additione les deux octets
  63.  
  64.     stw     %l3,[%i0+8]     ! Stock le chiffre
  65.  
  66.     ba      decodeEnd
  67.     nop
  68.  
  69. decodeWrite:
  70.     mov     0,%l0           ! ...
  71.     stw     %l0,[%i0]       ! Met le type d'instruction: 1
  72.  
  73.     mov     4,%l0           ! ...
  74.     stw     %l0,[%i0+4]     ! Met le numero d'operation: 0 (PUSH)
  75.  
  76.     mov     1,%l0           ! ...
  77.     ! stw       %l0,[%i0+20]    ! Met la taille de l'opération write dans l'instruction
  78.  
  79.     ba      decodeEnd
  80.     nop
  81.  
  82.  
  83. decodeEnd:
  84.     mov     0,%i0           ! code d'erreur 0: decodage reussi
  85.  
  86.     ret    
  87.     restore
  88.    
  89.    
  90.    
  91. decodeError:
  92.  
  93.     mov 1,%i0       !code d'erreur 1: instruction illegale.
  94.     ret
  95.     restore
  96.  
  97. /**
  98.     %i0 = Adresse de la structure machine state
  99.     %i1 = Nombre d'octet à empiler
  100.     %i2 = Les octets à empiler placer côte à côte sur 32 bits
  101.  
  102.     Sortie:
  103.     Aucune
  104. **/
  105. Empile:
  106.     save    %sp,-208,%sp
  107.  
  108.     setx    print1,%l7,%o0
  109.     call printf
  110.     nop
  111.  
  112.     ret
  113.     restore
  114.  
  115. /**
  116.     %i0 = Adresse de la structure machine state
  117.     %i1 = Nombre d'octet à dépiler
  118.    
  119.     Sortie:
  120.     %o0 = Les octets dépiler placer côte à côte sur 32 bits
  121. **/
  122. Depile:
  123.     save    %sp,-208,%sp
  124.  
  125.     ret
  126.     restore
  127.  
  128. EmuPush:
  129.     save    %sp,-208,%sp
  130.    
  131.     ! Doit Empiler la valeur
  132.     ! ...
  133.  
  134.     ! lduw  [%i1],%l1       ! Obtention du pointeur de la pile
  135.     ! ! stw     5,[%l1 +]           ! Met 5 dans la pile
  136.  
  137.    
  138.  
  139.     ! setx  printPush,%l7,%o0
  140.     ! mov   %l1,%o1
  141.     ! call  printf
  142.     ! nop
  143.    
  144.     mov 0,%i0
  145.     ret
  146.     restore
  147.    
  148. EmuWrite:
  149.     save    %sp,-208,%sp
  150.    
  151.     ! Dépile et print
  152.     !depile
  153.     !%i0 = octet dépiler sur 32 bits (4 octets)
  154.  
  155.     mov 0,%i0
  156.     ret
  157.     restore
  158.    
  159. EmuPop:
  160.     save    %sp,-208,%sp
  161.    
  162.    
  163.     mov 1,%i0
  164.     ret
  165.     restore
  166.    
  167. EmuRead:
  168.     save    %sp,-208,%sp
  169.    
  170.    
  171.     mov 1,%i0
  172.     ret
  173.     restore
  174.    
  175.    
  176.    
  177. EmuAdd:
  178.     save    %sp,-208,%sp
  179.    
  180.    
  181.     mov 1,%i0
  182.     ret
  183.     restore
  184.    
  185. EmuSub:
  186.     save    %sp,-208,%sp
  187.    
  188.    
  189.     mov 1,%i0
  190.     ret
  191.     restore
  192.    
  193. EmuMul:
  194.     save    %sp,-208,%sp
  195.    
  196.    
  197.     mov 1,%i0
  198.     ret
  199.     restore
  200.    
  201. EmuDiv:
  202.     save    %sp,-208,%sp
  203.    
  204.    
  205.     mov 1,%i0
  206.     ret
  207.     restore
  208.    
  209.    
  210. EmuBz:
  211.     save    %sp,-208,%sp
  212.    
  213.    
  214.     mov 1,%i0
  215.     ret
  216.     restore
  217.    
  218. EmuBn:
  219.     save    %sp,-208,%sp
  220.    
  221.    
  222.     mov 1,%i0
  223.     ret
  224.     restore
  225.  
  226. EmuJmp:
  227.     save    %sp,-208,%sp
  228.    
  229.    
  230.     mov 1,%i0
  231.     ret
  232.     restore
  233.    
  234.  
  235. .section ".rodata"
  236.  
  237.     print1: .asciz "-Empile-\n"
  238.     print2: .asciz "-Print: %d\n"
  239.     printPush: .asciz "-Push: %s\n"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement