Advertisement
1fractal

Untitled

Mar 23rd, 2020
2,962
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 5.76 KB | None | 0 0
  1. .data
  2. buffer: .space 32
  3. start_msg: .asciiz "Choisir le mode d'emploi\n1:\tValidation d'un numero CB.\n2:\tGenerer un numéro CB.\n3:\tSortir.\n"
  4. exit_msg: .asciiz "Programme terminé avec success\n"
  5. luhn: .asciiz "\n\nLuhn algorithm:"
  6. luhn_success: "success\n"
  7. luhn_failure: "echec\n"
  8. nl: .asciiz "\n"
  9. insert_cb_nb_msg: .asciiz "inserer un numéro CB: max 32 caracteres\n"
  10.  
  11. .text
  12.  
  13. .globl __main
  14. j       __main              # jump to __main
  15.  
  16. __validate:
  17.     li      $v0, 9                      # $v0 = 9
  18.     la      $a0, 32    
  19.     syscall                             # alocate 32 bytes
  20.     move    $s0, $v0                    # $s0 = $v0 | cb_d
  21.  
  22.     # ask for cb
  23.     li      $v0, 4                      # $v0 = 4
  24.     la      $a0, insert_cb_nb_msg       # $a0 = insert_cb_nb_msg
  25.     syscall
  26.  
  27.     #read cb
  28.     li      $v0, 8                      # $v0 = 8
  29.     la      $a0, buffer                 # $a0 = buffer
  30.     li      $a1, 32                     # $a1 = 32
  31.     syscall
  32.     move    $s1, $a0                    # $s1 = $v0 | cb
  33.  
  34.  
  35.     # parse string to int (array)
  36.     # $t1 -> size
  37.     # $s1 -> address of cb ($s1)
  38.     # $t2 -> address of cb_d ($s0)
  39.     li          $t1, 0                  # $t1 = 0 int array  size | i = 0
  40.     move        $t2, $s0
  41.     move        $t3, $s1                # $t2 = $s0 | $t2 = cb_d
  42.     __validate_parse_loop:
  43.         add     $t3, $s1, $t1           # $s1 = $s1 + 1 |  cb + 1
  44.         lb      $t6, 0($t3)             # $t6 = itt[i]
  45.  
  46.         beq     $t6, '\n', __validate_parse_loop_exit   # if $t6 == 0 then __validate_parse_loop_exit
  47.        
  48.         subi    $t6, $t6, 48            # $t6 = $t6 - 0x30  
  49.         sb      $t6, 0($t2)             #
  50.  
  51.         add     $t2, $t2, 1             # $s0 = $s0 + 1  | cb_d + 1
  52.  
  53.         addi    $t1, $t1, 1             # $t1 = $t1 + 1  | size++
  54.        
  55.         b       __validate_parse_loop           # branch to __validate_parse_loop
  56.                        
  57.      __validate_parse_loop_exit:
  58.     # subi  $t1, $t1, 1         # $t1 = $t1 - 1
  59.     ##############
  60.     # set key to s3
  61.     # set size to s2
  62.     ##############
  63.     move        $s2 $t1   # $s2 = size
  64.     add         $t1 $s0 $s2
  65.     sub         $t1 $t1 1    
  66.     lb          $s3, 0($t1)     # s3 = key
  67.  
  68.     ################
  69.     #### reverse array
  70.     subi        $s2, $s2, 2         # size -2 | escape key
  71.    
  72.     add         $t1 $s0 $s2
  73.     move        $t0 $s0  
  74.     __validate_reverse_arr:
  75.         lb      $t2 0($t0)
  76.         lb      $t3 0($t1)
  77.  
  78.         sb      $t2  0($t1)
  79.         sb      $t3  0($t0)
  80.  
  81.         addi    $t0 $t0 1
  82.         addi    $t1 $t1  -1
  83.         blt     $t0 $t1 __validate_reverse_arr  
  84.     __validate_reverse_arr_exit:
  85.  
  86.  
  87. ######## test #####
  88.  
  89.     li              $v0, 11     # system call #4 - print string
  90.     la              $a0, '\n'
  91.     syscall             # execute
  92.     syscall             # execute
  93.    
  94.    
  95.     move            $t2 $s0
  96.     li              $t3 0
  97.     __print:
  98.  
  99.         bgt         $t3 $s2 __print_exit
  100.         add         $t2 $s0 $t3
  101.  
  102.         lb          $t4, 0($t2)     #
  103.         add         $t4 $t4 48     
  104.         addi        $t3, $t3, 1         # $t3 = $t3 + 1
  105.         b           __print
  106.     __print_exit:
  107. ######### \test #####
  108.  
  109.  
  110.  
  111.  
  112.  
  113.     ################
  114.     #todo: div modulo
  115.     # etapes  3-5 Luhn alg
  116.     li              $t7 0               # somme = 0
  117.     li              $t6 1               # mod 2
  118.     add             $t1 $s0 $s2         # end
  119.     move            $t0 $s0             #start | t0 = cb_d
  120.     __validate_mult_sub_loop:
  121.         bgt         $t0 $t1 __validate_mult_sub_loop_exit  
  122.  
  123.         andi        $t6 $t6 0x01    # mod 2
  124.         lbu         $t2 0($t0)
  125.  
  126.         beq         $t6 0x0 __validate_mult_sub_loop_branch_even
  127.  
  128.         add         $t2 $t2 $t2    # *cb_d *= 2
  129.         bleu        $t2, 0x09, __validate_mult_sub_loop_branch_even # if chifre *2 <= 9 then branch
  130.         subu        $t2 $t2 0x09
  131.  
  132.         __validate_mult_sub_loop_branch_even:
  133.             addu    $t7 $t7 $t2         # somme des chifres
  134.             addi    $t6 $t6 1
  135.                        
  136.             addi    $t0 $t0 1
  137.         b           __validate_mult_sub_loop
  138.     __validate_mult_sub_loop_exit:
  139.  
  140.     li          $t0 10
  141.     div         $t7 $t0
  142.     mfhi        $t1
  143.    
  144.     bnez        $t1 __validate_mod_zero
  145.         subu $t1 $t2 $t1  # t1 != 0
  146.     __validate_mod_zero: # t1 = 0
  147.  
  148.     li          $v0 4
  149.     la          $a0 luhn
  150.     syscall
  151.  
  152.     beq         $t1 $s3 __validate_l_succes
  153.         la      $a0 luhn_failure
  154.         syscall
  155.         b       __validate_l_exit
  156.  
  157.     __validate_l_succes:
  158.         la      $a0 luhn_success
  159.         syscall
  160.         b       __validate_l_exit
  161.  
  162.     __validate_l_exit:
  163.  
  164.  
  165.  
  166.  
  167.  
  168. ######### test #####
  169.  
  170. #     li        $v0, 11     # system call #4 - print string
  171. #     la        $a0, '\n'
  172. #     syscall               # execute
  173. #     syscall               # execute
  174.  
  175. #     move    $t2 $s0
  176. #     li      $t3 0
  177. #     __print:
  178.  
  179. #         bgt $t3 $s2 __print_exit
  180. #         add $t2 $s0 $t3
  181.  
  182. #         lb            $t4, 0($t2)     #
  183. #         add         $t4 $t4 48
  184. #         li            $v0, 11     # system call #1 - print int
  185. #         move      $a0, $t4
  186. #         syscall               # execute
  187.  
  188.  
  189. #         addi  $t3, $t3, 1         # $t3 = $t3 + 1
  190. #         b __print
  191. #     __print_exit:
  192. # ######### \test #####
  193.  
  194.  
  195.  
  196.  
  197.     #todo: free heap
  198.  
  199.     j _ask_loop
  200. ##### \validate
  201.  
  202.  
  203. __generate:
  204.  
  205.     li $v0 1
  206.     li $a0 6
  207.     syscall
  208.  
  209.  
  210.  
  211.     j _ask_loop
  212.  
  213.    
  214. __main:
  215.  
  216.     #ask for mode
  217.    
  218.     _ask_loop:
  219.  
  220.         li $v0 4
  221.         la $a0 start_msg
  222.         syscall
  223.  
  224.         #read mode (int)
  225.         li $v0 5
  226.         syscall
  227.  
  228.         beq     $v0, 3, exit    # if $v0 == 3 then exit
  229.         beq     $v0, 1, __validate  # if $v0 == 1 then __validate
  230.         beq     $v0, 2, __generate  # if $v0 == 2 then __generge
  231.         b       _ask_loop           # branch to _ask_loop
  232.        
  233.        
  234.  
  235.  
  236.  
  237.  
  238. exit:
  239.     li      $v0, 4      # $v0 = 4
  240.     la      $a0, exit_msg       #
  241.     syscall
  242.  
  243.     li      $v0, 10     # $v0 = 10
  244.     syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement