Advertisement
ItachiSan

Halp plis for recursion

Sep 2nd, 2014
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .data
  2. Sbeginning:         .asciiz "Problema dello zaino (Knapsack)\n"
  3. SinsertWTab:        .asciiz "Inserisci la dimensione orizzontale dello zaino: "
  4. SinsertHTab:        .asciiz "Inserisci la dimensione verticale dello zaino: "
  5. SinsertWRett:       .asciiz "Inserisci la dimensione orizzontale del blocco: "
  6. SinsertHRett:       .asciiz "Inserisci la dimensione verticale del blocco: "
  7. Sreinsert:          .asciiz "La dimensione deve essere un numero positivo.\n"
  8. SnewRett:           .asciiz "Vuoi inserire un altro rettangolo? (1=si, 0/altro=no) "
  9. ScreateRett:        .asciiz "Creo il rettangolo "
  10. SinfoRett1:         .asciiz "Inserisco il rettangolo "
  11. SinfoRett2:         .asciiz " :"
  12. SinBag1:            .asciiz "Ho inserito nello zaino "
  13. SinBag2:            .asciiz " rettangoli su "
  14. SendBad:            .asciiz "Non posso piu' inserire blocchi!\n"
  15. SendGood:           .asciiz "Zaino riempito con successo!\n"
  16. Sfull:              .asciiz "X"
  17. Sempty:             .asciiz "_"
  18. Sreturn:            .asciiz "\n"
  19.  
  20. .text
  21. .globl main
  22.  
  23. main:
  24. ##### Creo lo zaino
  25.     li $v0,4        # Welcome!
  26.     la $a0,Sbeginning
  27.     syscall
  28.  
  29. errorInsertWTab:
  30.     li $v0,4        # Richiesta larghezza zaino
  31.     la $a0,SinsertWTab
  32.     syscall
  33.  
  34.     li $v0,5        # Prendo il valore
  35.     syscall
  36.  
  37.     bgt $v0,$zero,goodWTab
  38.  
  39.     li $v0,4        # Messaggio di errore
  40.     la $a0,Sreinsert
  41.     syscall
  42.    
  43.     j errorInsertWTab
  44. goodWTab:
  45.     move $s0,$v0    # Salvo WTab in s0
  46.  
  47. errorInsertHTab:
  48.     li $v0,4        # Richiesta altezza zaino
  49.     la $a0,SinsertHTab
  50.     syscall
  51.  
  52.     li $v0,5        # Prendo il valore
  53.     syscall
  54.  
  55.     bgt $v0,$zero,goodHTab
  56.  
  57.     li $v0,4        # Messaggio di errore
  58.     la $a0,Sreinsert
  59.     syscall
  60.    
  61.     j errorInsertHTab
  62. goodHTab:
  63.     move $s1,$v0    # Salvo HTab in s1
  64.  
  65. ##  Creo lo zaino (tabella "srotolata" su una riga)
  66.     mul  $t0,$s0,$s1
  67.     sll  $t0,$t0,2  # x4... Altrimenti non siamo allineati
  68.     sub  $sp,$sp,$t0
  69.     move $s2,$sp    # Accedo allo zaino a partire da s2
  70.  
  71. ##### Creo i rettangoli
  72.     add  $s3,$zero,$zero # Giusto per essere sicuri
  73. creaRett:
  74.     addi $s3,1      # s3 contiene il numero di rettangoli inseriti
  75.     li   $v0,4
  76.     la   $a0,ScreateRett
  77.     syscall
  78.     li   $v0,1
  79.     move $a0,$s3
  80.     syscall
  81.     li   $v0,4
  82.     la   $a0,Sreturn
  83.     syscall
  84.    
  85. errorInsertWRett:
  86.     li $v0,4        # Richiesta larghezza rettangolo
  87.     la $a0,SinsertWRett
  88.     syscall
  89.  
  90.     li $v0,5        # Prendo il valore
  91.     syscall
  92.  
  93.     bgt $v0,$zero,goodWRett
  94.  
  95.     li $v0,4        # Messaggio di errore
  96.     la $a0,Sreinsert
  97.     syscall
  98.    
  99.     j errorInsertWRett
  100. goodWRett:
  101.     move $t0,$v0    # Salvo WRett in t0
  102.  
  103. errorInsertHRett:
  104.     li $v0,4        # Richiesta altezza rettangolo
  105.     la $a0,SinsertHRett
  106.     syscall
  107.  
  108.     li $v0,5        # Prendo il valore
  109.     syscall
  110.  
  111.     bgt $v0,$zero,goodHRett
  112.  
  113.     li $v0,4        # Messaggio di errore
  114.     la $a0,Sreinsert
  115.     syscall
  116.    
  117.     j errorInsertHRett
  118. goodHRett:
  119.     move $t1,$v0    # Salvo HTab in t1
  120.  
  121. # Salvo il rettangolo nello stack
  122.     addi $sp,$sp,-12 # In prima posizione inseriro' ra
  123.    sw   $t0,4($sp)
  124.    sw   $t1,8($sp)
  125.  
  126. # Chiedo se vuole un nuovo rettangolo
  127.     li $v0,4
  128.     la $a0,SnewRett
  129.     syscall
  130.  
  131.     li $v0,5        # Prendo il valore
  132.     syscall
  133.  
  134.    addi $t2,1      # Creo un nuovo rettangolo con '1' e non altro
  135.    beq  $v0,$t2,creaRett
  136.  
  137. #### Inserisco i rettangoli
  138.    
  139.     move $a0,$s0 # Per convenzione...
  140.     move $a1,$s1
  141.     move $a2,$s2
  142.     move $a3,$s3
  143.    
  144.     jal knapsack
  145.  
  146.    # Gestione risultato
  147.     beq $v0,$zero,goodEnd
  148.  
  149.     li $v0,4
  150.     la $a0,SendBad # Troppi blocchi
  151.     syscall
  152.     j end
  153. goodEnd:
  154.     li $v0,4
  155.     la $a0,SendGood # Lieto fine
  156.     syscall
  157. end:
  158.     li $v0,10       # Fine
  159.     syscall
  160.    
  161.    
  162.    
  163. ### Funzione di inserimento di un rettangolo nello zaino
  164. # INPUT STATICI
  165. # a0 <--> larghezza zaino
  166. # a1 <--> altezza zaino
  167. # a2 <--> puntatore all'inizio dello zaino
  168. # a3 <--> rettangoli totali
  169. # OUTPUT
  170. # v0 <--> 0 ok, 1 errore
  171. # Stampa il numero di blocchi inseriti
  172.  
  173.  
  174. knapsack:
  175.     sw $ra,0($sp)
  176.     move $s0,$a0 # Per convenzione...
  177.     move $s1,$a1
  178.     move $s2,$a2
  179.     move $s3,$a3
  180.     addi $s4,$s4,1  # Conta il rettangolo che inserisco (s4 รจ 0 a meno di pasticci coi registri)
  181.     move $s5,$zero  # X della casella di partenza inserimento
  182.     move $s6,$zero  # Y della casella di partenza inserimento
  183.     move $s7,$s2    # Posizione della casella in memoria
  184.  
  185.  
  186. k_search:  
  187.     lw   $t0,0($s7)
  188.     bne  $t0,$zero,k_shift_column # Casella piena
  189.     j    k_checkBlock
  190. k_shift_column:
  191.     addi $s5,$s5,1
  192.     addi $s7,$s7,4              # Nuova casella
  193.     beq  $a0,$s0,k_shift_line   # EOL
  194.     j k_search
  195. k_shift_line:
  196.     addi $a1,$a1,1
  197.     beq  $a1,$s1,k_badEnd       # Fine matrice
  198.     move $a0,$zero              # Inizio una nuova linea, resetto la X
  199.     j k_search
  200. k_checkBlock:
  201.     lw   $t2,4($sp)     # Larghezza
  202.     lw   $t3,8($sp)     # Altezza
  203.     mult $t2,$t3
  204.     mflo $t2            # Area blocco
  205.     mult $s0,$s1
  206.     mflo $t3            # Area zaino
  207.     bge  $t2,$t3,k_badEnd
  208.  
  209. k_tryInsert:
  210.     li  $v0,0
  211.     jr  $ra
  212. k_insertLine:
  213.    
  214.  
  215. k_insertNewLine:
  216. k_goodInsertLine:
  217. k_goodInsertNewLine:
  218.  
  219.    
  220.  
  221.  
  222.  
  223.  
  224.  
  225.    
  226. k_badEnd:
  227.     addi $s4,$s4,-1 # "Qualcosa e' andato storto"
  228.     jal  k_blockPrint
  229.     lw   $ra,0($sp)
  230.     li   $v0,1      # Errore
  231.     jr   $ra
  232. k_goodEnd:
  233.     jal  k_blockPrint
  234.     lw   $ra,0($sp)
  235.     li   $v0,0      # Successo!
  236.     jr   $ra
  237. k_blockPrint: # Stampa quanti blocchi ha inserito l'algoritmo
  238.    li   $v0,4
  239.     la   $a0,SinBag1
  240.     syscall
  241.    li   $v0,1
  242.     move $a0,$s4
  243.     syscall
  244.     li   $v0,4
  245.     la   $a0,SinBag2
  246.     syscall
  247.    li   $v0,1
  248.     move $a0,$s3
  249.     syscall
  250.     li   $v0,4
  251.     la   $a0,Sreturn
  252.     syscall
  253.     jr   $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement