Guest User

Untitled

a guest
May 15th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 13.89 KB | None | 0 0
  1.             .data
  2. #   A:                  .space 1024                                 #первое число
  3. #   B:                  .space 1024                                 #второе число
  4.     Temp:               .space 1024                                 #запасной массив
  5. #   S:                  .space 4
  6.     First:              .asciiz "Input format: \nFirst number(press Enter)\n"
  7.     Sign:               .asciiz "Sign(press Enter)\n"
  8.     Second:             .asciiz "Second number(press Enter)\n"
  9.     Enter:              .asciiz "\n"
  10.     A:                  .asciiz "28\n"
  11.     B:                  .asciiz "2\n"
  12.     S:                  .asciiz "*\n"
  13.     A_size:             .word 0
  14.     B_size:             .word 0
  15.     Temp_size:          .word 0
  16.                                
  17.  
  18.             .text
  19. #v0 - syscall parameter
  20. #a0 - syscall paramter(print)
  21. main:
  22.  
  23.     la      $a0, First
  24.     li      $v0, 4
  25.     syscall
  26.     nop
  27.     la      $a0, Sign
  28.     li      $v0, 4
  29.     syscall
  30.     nop
  31.     la      $a0, Second
  32.     li      $v0, 4
  33.     syscall
  34.  
  35. #   la      $a0, A              #ввод первого числа
  36. #   li      $a1, 1024
  37. #   li      $v0, 8
  38. #   syscall
  39. #   nop
  40.  
  41. #   la      $a0, S              #ввод знака
  42. #   li      $a1, 1024
  43. #   li      $v0, 8
  44. #   syscall
  45. #   nop
  46.  
  47. #   la      $a0, B              #ввод второго числа
  48. #   li      $a1, 4
  49. #   li      $v0, 8
  50. #   syscall
  51. #   nop
  52.    
  53.  
  54.     la      $t1, A             
  55.     li      $t2, 0              # $t2 - размер числа A
  56.  
  57. A_loop:
  58.     lb      $t3, ($t1)
  59.     beq     $t3, 10, end_A_loop
  60.     addu    $t1, $t1, 1
  61.     addu    $t2, $t2, 1
  62.     b       A_loop
  63. end_A_loop:
  64.     nop
  65.  
  66. ################################
  67. ##вывод размера числа A
  68. ##  move    $a0, $t2
  69. ##  li      $v0, 1
  70. ##  syscall
  71. ###############################
  72.  
  73.     la      $t1, B
  74.     li      $t3, 0              # $t3 - размер числа B
  75.  
  76.  
  77. B_loop:
  78.     lb      $t4, ($t1)
  79.     beq     $t4, 10, end_B_loop
  80.     addu    $t1, $t1, 1
  81.     addu    $t3, $t3, 1
  82.     b       B_loop
  83. end_B_loop:
  84.     nop
  85.  
  86. ################################
  87. ##вывод размера числа B
  88. ##  move    $a0, $t3
  89. ##  li      $v0, 1
  90. ##  syscall
  91. ################################
  92.  
  93.     sw      $t2, A_size
  94.     sw      $t3, B_size
  95.     la      $t1, A
  96.     nop
  97.     add     $t4, $t1, $t2               # $t1 - указатель на начало массива A, $t4 - указатель на конец массива А  
  98.     sub     $t4, $t4, 1
  99.  
  100. Rotate_A_loop:                          # переворот числа А
  101.     ble     $t4, $t1, end_Rotate_A_loop
  102.     lb      $t5, ($t1)      #элемент слева
  103.     lb      $t6, ($t4)      #элемент справа
  104.     nop
  105.     sb      $t6, ($t1)      #меняем местами
  106.     sb      $t5, ($t4)      #меняем местами
  107.     add     $t1, $t1, 1
  108.     sub     $t4, $t4, 1
  109.     b       Rotate_A_loop
  110. end_Rotate_A_loop:
  111.     nop
  112.  
  113. #################################
  114. ##вывод перевернутого числа A   
  115. ##  la      $a0, A
  116. ##  li      $v0, 4
  117. ##  syscall
  118. ##все работает
  119. #################################
  120.  
  121.     la      $t1, B
  122.     add     $t4, $t1, $t3
  123.     sub     $t4, $t4, 1
  124.  
  125. Rotate_B_loop:                          # переворот числа В
  126.     ble     $t4, $t1, end_Rotate_B_loop
  127.     lb      $t5, ($t1)
  128.     lb      $t6, ($t4)
  129.     nop
  130.     sb      $t6, ($t1)
  131.     sb      $t5, ($t4)
  132.     add     $t1, $t1, 1
  133.     sub     $t4, $t4, 1
  134.     b       Rotate_B_loop
  135. end_Rotate_B_loop:
  136.     nop
  137. ##################################
  138. ##вывод перевернутого числа B
  139. ##  la      $a0, B
  140. ##  li      $v0, 4
  141. ##  syscall
  142. ##Все работает
  143. ##################################
  144.  
  145.  
  146.     la      $t0, A                      # указатель на начало A
  147.     la      $t1, B                      # указатель на начало B
  148.    
  149.     lw      $t2, A_size                 #размер A
  150.     lw      $t3, B_size                 #размер B
  151.  
  152.    
  153.     add     $t0, $t0, $t2               #указатель на конец A
  154.     add     $t1, $t1, $t3               #указатель на конец B
  155.     li      $t4, '0'
  156.  
  157. ###################################
  158. ##Вывод размеров чисел A и B
  159. ##  move    $a0, $t2
  160. ##  li      $v0, 1
  161. ##  syscall
  162. ##  nop
  163. ##  move    $a0, $t3
  164. ##  li      $v0, 1
  165. ##  syscall
  166. ##  nop
  167. ##Тут все правильно
  168. ###################################    
  169.  
  170. Add_A_Zero:
  171.     bge     $t2, $t3, end_Add_A_Zero
  172.     nop
  173.     add     $t2, $t2, 1
  174.     sb      $t4, ($t0)                  #добавляем 0, но че-та он тут не хочет добавляться(вроде теперь работает)
  175.     nop
  176.     add     $t0, $t0, 1
  177.     b       Add_A_Zero
  178.     nop
  179. end_Add_A_Zero:
  180.     nop
  181.  
  182.     sw      $t2, A_size
  183.     li      $t4, '0'
  184.  
  185. #############################################
  186. ##вывод числа A(возможно с нулями)
  187. ##  la      $a0, Enter
  188. ##  li      $v0, 4
  189. ##  syscall
  190. ##
  191. ##  la      $a0, A
  192. ##  li      $v0, 4
  193. ##  syscall
  194. ##тут херня полная(вроде теперь пашет)
  195. #############################################
  196.    
  197.  
  198.  
  199. ##есть размер B больше(равен) A, то выход
  200. Add_B_Zero:
  201.     bge     $t3, $t2, end_Add_B_Zero
  202.     nop
  203.     add     $t3, $t3, 1
  204.     sb      $t4, ($t1)
  205.     add     $t1, $t1, 1
  206.     b       Add_B_Zero
  207.     nop
  208. end_Add_B_Zero:
  209.     nop
  210.  
  211.     sw      $t3, B_size
  212.  
  213. #############################################
  214. ##вывод числа B(возможно с нулями)
  215. ##  la      $a0, Enter
  216. ##  li      $v0, 4
  217. ##  syscall
  218. ##  la  $a0, B
  219. ##  li      $v0, 4
  220. ##  syscall
  221. ##тут херня полная(вроде теперь пашет)
  222. #############################################
  223.    
  224.     la      $t0, S
  225.     lb      $t1, ($t0)
  226.     la      $a0, A
  227.     la      $a1, B
  228.     beq     $t1, '+', MAKE_SUM
  229.     beq     $t1, '-', MAKE_SUB
  230.     beq     $t1, '*', MAKE_MULT
  231.  
  232.     nop
  233.  
  234. MAKE_SUM:
  235.     jal     f_MAKE_SUM
  236.     nop
  237.     b       PRINT
  238.     nop
  239.  
  240. MAKE_SUB:
  241.     jal     f_MAKE_SUB
  242.     nop
  243.     b       PRINT
  244.     nop
  245.  
  246. MAKE_MULT:
  247.     jal     f_MAKE_MULT
  248.     nop
  249.     b       PRINT
  250.     nop
  251.  
  252. ################
  253. ###f_MAKE_SUM###
  254. ################
  255.  
  256. f_MAKE_SUM:
  257.     sub     $sp, $sp, 32    #всякая фигня чтобы работала функция
  258.     sw      $ra, 28($sp)
  259.     sw      $ra, 24($sp)
  260.     add     $fp, $fp, 32
  261.  
  262.     move    $t0, $a0        # число A
  263.     move    $t1, $a1        # число B
  264.     la      $t2, Temp       # для ответа
  265.     lw      $t3, A_size
  266.     li      $t4, 0          #текущий размер массива
  267.     li      $t5, 0          #переходящий десяток
  268.    
  269. BEGIN_SUM:
  270.     bge     $t4, $t3, END_SUM
  271.     nop
  272.     lb      $t6, ($t0)      #циферка числа A
  273.     nop
  274.     sub     $t6, $t6, '0'   #делаем из символа циферку
  275.  
  276.     lb      $t7, ($t1)      #циферка числа B
  277.     nop
  278.     sub     $t7, $t7, '0'   #делаем циферку
  279.  
  280.     add     $t6, $t6, $t7   #сумма двух циферок
  281.     add     $t6, $t6, $t5   #прибавляем остаток, если он есть
  282.  
  283.     bge     $t6, 10, MAKE_CARRY     #если вся сумма больше 10, надо сделать ее меньше 10, и записать в остаток десятки
  284.     nop
  285.     li      $t5, 0          #зануляем остаток, так как он либо ноль, либо в следующей функции он станет таким как надо, железно
  286.  
  287.     MAKE_CARRY:
  288.         blt     $t6, 10, END_MAKE_CARRY
  289.         nop
  290.         sub     $t6, $t6, 10    #отнимаем 10
  291.         add     $t5, $t5, 1     #и прибавляем единичку к переходящему остатку
  292.         b       MAKE_CARRY
  293.         nop
  294.  
  295.     END_MAKE_CARRY:
  296.         nop
  297.        
  298.     add     $t6, $t6, '0'
  299.     sb      $t6, ($t2)
  300.     add     $t2, $t2, 1
  301.     add     $t0, $t0, 1
  302.     add     $t1, $t1, 1
  303.     add     $t4, $t4, 1
  304.    
  305.     b   BEGIN_SUM
  306.     nop
  307. END_SUM:
  308.         nop
  309.    
  310.     add     $t5, $t5, '0'
  311.     sb      $t5, ($t2)
  312.     add     $t4, $t4, 1
  313.     sw      $t4, Temp_size
  314.  
  315.     li      $v0, 0 
  316.     lw      $ra, 28($sp)
  317.     lw      $ra, 24($sp)
  318.     add     $sp, $sp, 32
  319.     jr      $ra
  320.     nop
  321.  
  322. ########################
  323. ###end of f_MAKE_MULT###
  324. ########################
  325.  
  326.  
  327. ################
  328. ###f_MAKE_SUB###
  329. ################
  330.  
  331. f_MAKE_SUB:
  332.     sub     $sp, $sp, 32        #опять фигня чтобы работала функция
  333.     sw      $ra, 28($sp)
  334.     sw      $ra, 24($sp)
  335.     add     $fp, $fp, 32
  336.  
  337.     move    $t0, $a0        #число A
  338.     move    $t1, $a1        #число B
  339.  
  340.     la      $t2, Temp
  341.     lw      $t3, A_size
  342.     li      $t4, 0          #размер ответа
  343.     li      $t5, 0          #переходящий остаток(десяток) или как там его
  344.  
  345. BEGIN_SUB:
  346.     bge     $t4, $t3, END_SUB
  347.     lb      $t6, ($t0)      #вычитатель
  348.     nop
  349.     lb      $t7, ($t1)      #вычитаемое
  350.     nop
  351.     sub     $t6, $t6, '0'
  352.     sub     $t7, $t7, '0'   #сделали чиселки из символов
  353.  
  354.     add     $t5, $t5, $t6   #прибавили(ну а точнее отняли то скока у нас было в остатке позаимствованно)
  355.     sub     $t5, $t5, $t7   #вычли вычитаемое
  356.  
  357.     blt     $t5, 0, MAKE_SUB_CARRY  #если вычли и у нас отрицательное
  358.     nop
  359.  
  360. MAKE_ANS:                   #если все хорошо с остатком, записываем в ответ
  361.     add     $t5, $t5, '0'   #делаем символ
  362.     sb      $t5, ($t2)
  363.     li      $t5, 0          #равен единице, потому что ничего не осталось
  364.     b       END_CARRY
  365.     nop
  366.  
  367. MAKE_SUB_CARRY:                 #если вычли и у нас отрицательное
  368.     add     $t5, $t5, 10
  369.     add     $t5, $t5, '0'
  370.     sb      $t5, ($t2)
  371.     li      $t5, -1         #на будущее, нам надо будет это отнять
  372.     nop
  373. END_CARRY:
  374.     nop
  375.  
  376.     add     $t0, $t0, 1
  377.     add     $t1, $t1, 1
  378.     add     $t2, $t2, 1
  379.     add     $t4, $t4, 1
  380.     nop
  381.     b       BEGIN_SUB
  382.     nop
  383.    
  384. END_SUB:
  385.     nop
  386.  
  387.     sw      $t4, Temp_size
  388.     li      $v0, 0
  389.     lw      $ra, 28($sp)
  390.     lw      $fp, 24($sp)
  391.     add     $sp, $sp, 32
  392.     jr      $ra
  393.     nop
  394.  
  395. ####################
  396. ###END_f_MAKE_SUB###
  397. ####################
  398.  
  399. #################
  400. ###f_MAKE_MULT###       #отвратительно тут все
  401. #################
  402.  
  403. f_MAKE_MULT:
  404.     sub     $sp, $sp, 32
  405.     sw      $ra, 28($sp)
  406.     sw      $fp, 24($sp)
  407.     sw      $s0, 20($sp)
  408.     add     $fp, $fp, 32
  409.  
  410.     move    $t0, $a0    #массив A
  411.     lw      $t3, A_size #размер A
  412.     add     $t0, $t0, $t3   #указатель на конец
  413.     sub     $t0, $t0, 1
  414.  
  415. DELETE_ZEROS_IN_A:      #удаляем добавленные вначале нолики, чтобы не умножалось на ноль и не было бяки
  416.     lb      $t8, ($t0)
  417.     nop
  418.     bne     $t8, '0', END_DELETE_ZEROS_IN_A
  419.     nop
  420.     sub     $t0, $t0, 1
  421.     sub     $t3, $t3, 1
  422.     b       DELETE_ZEROS_IN_A
  423.     nop
  424. END_DELETE_ZEROS_IN_A:
  425.     nop
  426.  
  427.     move    $t1, $a1
  428.     lw      $s1, B_size #размер B, другой регистр, чтоб проще отличать, умножение все-таки труднова-то
  429.     add     $t1, $t1, $s1
  430.     sub     $t1, $t1, 1
  431.  
  432. DELETE_ZEROS_IN_B:
  433.     lb      $t8, ($t1)
  434.     nop
  435.     bne     $t8, '0', END_DELETE_ZEROS_IN_B
  436.     nop
  437.     sub     $t1, $t1, 1
  438.     sub     $t3, $t3, 1
  439.     b       DELETE_ZEROS_IN_B
  440.     nop
  441. END_DELETE_ZEROS_IN_B:
  442.     nop
  443.  
  444.     li      $t8, 0
  445.     la      $t2, Temp
  446.     add     $t8, $t3, $s1  
  447.     li      $t6, 0          #cимвол из A
  448.     sw      $zero, Temp_size
  449.  
  450. BEGIN_FIRST_MULT:           #подготовка к великим делам
  451.     beq     $t6, $t3, END_FIRST_MULT
  452.     nop
  453.     move    $t1, $a1
  454.     la      $t2, Temp   #ответ
  455.     li      $t5, 0      #переходящий остаток 
  456.     li      $t7, 0      #символ из B
  457.     li      $t4, 0
  458.     add     $t4, $t4, $t6   #размер ответа
  459.     add     $t2, $t2, $t6   #переходим на нее
  460.  
  461. BEGIN_SECOND_MULT:      #собственно, само умножение
  462.     beq     $t7, $s1, END_SECOND_MULT
  463.     nop
  464.     lb      $t8, ($t0)  #цифра A
  465.     nop
  466.     sub     $t8, $t8, '0'
  467.    
  468.     lb      $t9, ($t1)  #цифра B
  469.     nop
  470.     sub     $t9, $t9, '0'
  471.  
  472.     mul     $t8, $t8, $t9   #наконец-то умножаем
  473.     add     $t5, $t5, $t8   #прибавляем остаток, еа
  474.     li      $t8, 10         #все для остатка, родимого
  475.     div     $t5, $t8        #остаток
  476.     lb      $t8, ($t2)      #загружаем байт из ответа
  477.     mfhi    $t5            
  478.     beq     $t8, 0, PERFECT_END #если он пустой, прибавляем остаток и записываем   
  479.     nop
  480.     sub     $t8, $t8, '0'   #иначе вычитаем чтобы получить циферку
  481.  
  482. PERFECT_END:
  483.     add     $t5, $t5, $t8
  484.  
  485.     ble     $t5, 9, CARRY_LESS_10   #так как надо складывать, смотрим, больше 9 у нас или меньше
  486.     nop
  487.  
  488. CARRY_GREATER_10:
  489.     sub     $t5, $t5, 10
  490.     add     $t5, $t5, '0'
  491.     sb      $t5, ($t2)
  492.     li      $t5, 1
  493.     b       END_CARRY_IN_MULT
  494.     nop
  495.  
  496. CARRY_LESS_10:
  497.     add     $t5, $t5, '0'
  498.     sb      $t5, ($t2)
  499.     li      $t5, 0
  500. END_CARRY_IN_MULT:
  501.  
  502.     move    $t8, $t5        #t5 в $t8
  503.     mflo    $t5             #загружаем скока десятков было
  504.     add     $t5, $t5, $t8   #и прибавляем к переходу
  505.     add     $t2, $t2, 1
  506.     add     $t4, $t4, 1
  507.     add     $t2, $t2, 1
  508.     add     $t1, $t1, 1
  509.     b       BEGIN_SECOND_MULT
  510.     nop
  511. END_SECOND_MULT:
  512.  
  513. #допиливание остатка, если он остался
  514.  
  515. THE_LAST_CARRY:
  516.     lb      $t8, ($t2)      #загружаем
  517.     beq     $t8, 0, END_THE_LAST_CARRY  #проверяем нулевой он или нет
  518.     nop
  519.     sub     $t8, $t8, '0'
  520. END_THE_LAST_CARRY:
  521.     add     $t5, $t5, $t8       #прибавляем то что осталось
  522.  
  523.     ble     $t5, 9, THE_LAST_CARRY_LESS_10
  524.     nop
  525.  
  526.     sub     $t5, $t5, 10        # творим магию, чтобы записать остаток в ответ
  527.     add     $t5, $t5, '0'
  528.     sb      $t5, ($t2)
  529.     li      $t5, 1              #пихаем единичку, так как надо будет еще раз записать
  530.     add     $t2, $t2, 1
  531.     add     $t4, $t4, 1         #многоуважаемый размер
  532.     b       THE_LAST_CARRY
  533.     nop
  534.  
  535. THE_LAST_CARRY_LESS_10:
  536.     add     $t5, $t5, '0'
  537.     sb      $t5, ($t2)
  538.     add     $t2, $t2, 1
  539.     add     $t4, $t4, 1
  540.  
  541.     lw      $t8, Temp_size
  542.     nop
  543.     ble     $t4, $t8, END_CHANGE
  544.     nop
  545.  
  546. CHANGE_SIZE:    #если больше, то меняем
  547.     sw      $t4, Temp_size 
  548.     nop
  549. END_CHANGE:
  550.  
  551.     add     $t6, $t6, 1
  552.     add     $t0, $t0, 1
  553.     b       BEGIN_FIRST_MULT
  554.     nop
  555.  
  556. END_FIRST_MULT:
  557.    
  558.     li      $v0, 0
  559.     lw      $ra, 28($sp)
  560.     lw      $fp, 24($sp)
  561.     lw      $s0, 20($sp)
  562.     add     $sp, $sp, 32
  563.     jr      $ra
  564.     nop
  565. #фак еа, все самое страшное позади!!!!!!!!!!!!!!!!
  566.  
  567. #####################
  568. ###END_f_MAKE_MULT###
  569. #####################
  570.  
  571.    
  572.  
  573. ###########
  574. ###PRINT###
  575. ##########
  576. PRINT:
  577.     la      $t0, Temp       #указатель на начало
  578.     lw      $t1, Temp_size
  579.     nop
  580.     add     $t0, $t0, $t1   #указатель на конец
  581.     sub     $t0, $t0, 1
  582.     li      $t9, 0
  583. DELETE_ZEROS:
  584.     lb      $t2, ($t0) 
  585.     nop
  586.     bne     $t2, '0', END_DELETE_ZEROS
  587.     sb      $t9, ($t0)
  588.     sub     $t1, $t1, 1
  589.     sub     $t0, $t0, 1
  590.     b       DELETE_ZEROS
  591.     nop
  592. END_DELETE_ZEROS:
  593.     nop
  594.  
  595.     sw      $t1, Temp_size
  596.     nop
  597.    
  598.     lw      $t2, Temp_size
  599.     la      $t0, Temp           #указатель на на начало($t0)
  600.     la      $t1, Temp
  601.     nop
  602.  
  603.     add     $t1, $t1, $t2       #указатель на конец($t1)
  604.     sb      $zero, ($t1)
  605.     sub     $t1, $t1, 1
  606.  
  607. REVERSE_ANS:
  608.     bge     $t0, $t1, END_REVERSE_ANS
  609.     nop
  610.     lb      $t3, ($t0)
  611.     lb      $t4, ($t1)
  612.     nop
  613.     sb      $t3, ($t1)
  614.     sb      $t4, ($t0)
  615.     nop
  616.     add     $t0, $t0, 1
  617.     sub     $t1, $t1, 1
  618.     b       REVERSE_ANS
  619.     nop
  620. END_REVERSE_ANS:
  621.     nop
  622.    
  623.    
  624.     la      $a0, Temp
  625.     li      $v0, 4
  626.     syscall
  627.  
  628.     li      $v0, 10
  629.     syscall
Add Comment
Please, Sign In to add comment