Guest User

Untitled

a guest
May 15th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 13.34 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.     sw      $s1, 16($sp)
  409.     sw      $s2, 12($sp)
  410.     add     $fp, $fp, 32
  411.    
  412.     move    $t0, $a0   
  413.     move    $t1, $a1
  414.  
  415.     lw      $t2, A_size
  416.     lw      $t3, B_size
  417.  
  418.     add     $t0, $t0, $t2
  419.     sub     $t0, $t0, 1
  420.  
  421. DELETE_ZEROS_IN_A:
  422.     lb      $t5, ($t0)
  423.     bne     $t5, '0', END_DELETE_ZEROS_IN_A
  424.     nop
  425.     sub     $t0, $t0, 1
  426.     sub     $t2, $t2, 1
  427.     b       DELETE_ZEROS_IN_A
  428.     nop
  429. END_DELETE_ZEROS_IN_A:
  430.     nop
  431.  
  432.     add     $t1, $t1, $t3
  433.     sub     $t1, $t1, 1
  434.  
  435. DELETE_ZEROS_IN_B:
  436.     lb      $t5, ($t1)
  437.     bne     $t5, '0', END_DELETE_ZEROS_IN_B
  438.     nop
  439.     sub     $t1, $t1, 1
  440.     sub     $t3, $t3, 1
  441.     b       DELETE_ZEROS_IN_B
  442.     nop
  443. END_DELETE_ZEROS_IN_B:
  444.     nop
  445.  
  446.     li      $t5, 0      #текущая позиция в A
  447.     sw      $t5, Temp_size
  448.     nop
  449.  
  450.     move    $t0, $a0
  451.     move    $t1, $a1
  452.  
  453. MULT:       #цикл по числу A
  454.     beq     $t5, $t2, END_MULT
  455.     nop
  456.     li      $t6, 0      #текущая позиция в B
  457.     li      $t7, 0      #переходящий остаток
  458.     li      $t4, 0      #чтобы выбрать максимальный размер ответа
  459.     la      $s0, Temp   #указатель на начало ответа
  460.     add     $s0, $s0, $t5   #извеменяем размер
  461.     add     $t4, $t4, $t5   #первый символ куда записывать ответ(так как он i+j), будет просто номер текущей рассматриваемой цифры в A, а потом увеличиваться на единичку, когда цифра A будет умножаться на B
  462.  
  463. DO_MULT:    #цикл по числу B
  464.     beq     $t6, $t3, END_DO_MULT
  465.     nop
  466.     lb      $t8, ($t0)
  467.     nop
  468.     sub     $t8, $t8, '0'
  469.    
  470.     lb      $t9, ($t1)
  471.     nop
  472.     sub     $t9, $t9, '0'
  473.  
  474.     mul $t8, $t8, $t9
  475.     add     $t8, $t8, $t7
  476.     lb      $s1, ($s0)  #смотрим что там у нас в ответе лежит, ноль или какой-нить символ
  477.     beq     $s1, 0, END_MAKE_NUMBER
  478.  
  479.     sub     $s1, $s1, '0'
  480. END_MAKE_NUMBER:
  481.     nop
  482.    
  483.     add     $t8, $t8, $s1   #теперь у нас в т8 хранится полный ответ того, что надо записать
  484.     li      $s2, 10
  485.     div     $t8, $s2            #смотрим скока надо в переход, скока записать
  486.     mfhi    $t8             #скока записать
  487.     add     $t8, $t8, '0'
  488.     sb      $t8, ($s0)      #записываем
  489.     nop
  490.     mflo    $t7             #переходящий остаток
  491.    
  492.     add     $t6, $t6, 1
  493.     add     $t4, $t4, 1
  494.     add     $s0, $s0, 1
  495.     add     $t1, $t1, 1
  496.     b       DO_MULT
  497.     nop
  498. END_DO_MULT:
  499.     nop
  500.  
  501. ##запишем если остался какой-то остаток после умножения
  502.  
  503.     lb      $s1, ($s0)
  504.     beq     $s1, 0, END_MAKE_NUMBER_IN_MULT
  505.     sub     $s1, $s1, '0'
  506. END_MAKE_NUMBER_IN_MULT:
  507.     add     $t7, $t7, $s1   #добавляем к переходящему остатку
  508.     li      $s2, 10
  509.     div     $t7, $s2
  510.  
  511.     mfhi    $t7         #остаток от деления на 10
  512.     add     $t7, '0'
  513.     sb      $t7, ($s0)
  514.     nop
  515.     mflo    $t7
  516.  
  517.     beq     $t7, 0, END_MAKE_CARRY_IN_MULT
  518.     add     $s0, $s0, 1
  519.     add     $t7, '0'
  520.     sb      $t7, ($s0)
  521.     add     $t4, $t4, 1     #заодно и размер увеличим
  522.  
  523. END_MAKE_CARRY_IN_MULT:
  524.     nop
  525.  
  526.     ##тут можно было проверять, не увеличился ли размер ответа, но на последней итерации он итак будет самым большим
  527.     sw      $t4, Temp_size
  528.     add     $t0, $t0, 1
  529.     add     $t5, $t5, 1
  530.     b       MULT
  531.     nop
  532. END_MULT:
  533.     nop
  534.  
  535.     li      $v0, 0
  536.     lw      $ra, 28($sp)
  537.     lw      $fp, 24($sp)
  538.     lw      $s0, 20($sp)
  539.     lw      $s1, 16($sp)
  540.     lw      $s2, 12($sp)
  541.     add     $sp, $sp, 32
  542.     jr      $ra
  543.     nop
  544. #фак еа, все самое страшное позади!!!!!!!!!!!!!!!!
  545.  
  546. #####################
  547. ###END_f_MAKE_MULT###
  548. #####################
  549.  
  550.    
  551.  
  552. ###########
  553. ###PRINT###
  554. ##########
  555. PRINT:
  556.     la      $t0, Temp       #указатель на начало
  557.     lw      $t1, Temp_size
  558.     nop
  559.     add     $t0, $t0, $t1   #указатель на конец
  560.     sub     $t0, $t0, 1
  561.     li      $t9, 0
  562. DELETE_ZEROS:
  563.     lb      $t2, ($t0) 
  564.     nop
  565.     bne     $t2, '0', END_DELETE_ZEROS
  566.     sb      $t9, ($t0)
  567.     sub     $t1, $t1, 1
  568.     sub     $t0, $t0, 1
  569.     b       DELETE_ZEROS
  570.     nop
  571. END_DELETE_ZEROS:
  572.     nop
  573.  
  574.     sw      $t1, Temp_size
  575.     nop
  576.    
  577.     lw      $t2, Temp_size
  578.     la      $t0, Temp           #указатель на на начало($t0)
  579.     la      $t1, Temp
  580.     nop
  581.  
  582.     add     $t1, $t1, $t2       #указатель на конец($t1)
  583.     sb      $zero, ($t1)
  584.     sub     $t1, $t1, 1
  585.  
  586. REVERSE_ANS:
  587.     bge     $t0, $t1, END_REVERSE_ANS
  588.     nop
  589.     lb      $t3, ($t0)
  590.     lb      $t4, ($t1)
  591.     nop
  592.     sb      $t3, ($t1)
  593.     sb      $t4, ($t0)
  594.     nop
  595.     add     $t0, $t0, 1
  596.     sub     $t1, $t1, 1
  597.     b       REVERSE_ANS
  598.     nop
  599. END_REVERSE_ANS:
  600.     nop
  601.    
  602.    
  603.     la      $a0, Temp
  604.     li      $v0, 4
  605.     syscall
  606.  
  607.     li      $v0, 10
  608.     syscall
Add Comment
Please, Sign In to add comment