Advertisement
Guest User

Untitled

a guest
Oct 15th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .text
  2.  
  3. ## bool
  4. ## board_done(unsigned short board[16][16]) {
  5. ##   for (int i = 0 ; i < 16 ; ++ i) {
  6. ##     for (int j = 0 ; j < 16 ; ++ j) {
  7. ##       if (!has_single_bit_set(board[i][j])) {
  8. ##         return false;
  9. ##       }
  10. ##     }
  11. ##   }
  12. ##   return true;
  13. ## }
  14.  
  15. .globl board_done
  16. board_done:
  17.     sub $sp, $sp, 16        # allocate stack
  18.     sw  $ra, 0($sp)     # save $ra
  19.     sw  $s0, 4($sp)     # save $s0
  20.     sw  $s1, 8($sp)     # save $s1
  21.     sw  $s2, 12($sp)        # save $s2
  22.  
  23.     move    $s0, $a0        # save &board because it will be overwritten before jal
  24.  
  25.     li  $s1, 0          # i = 0
  26.  
  27. outer_loop:
  28.     li  $s2, 0          # j = 0
  29.  
  30. inner_loop:
  31.     mul $t0, $s1, 16        # i * N
  32.     add $t0, $t0, $s2       # (i * N) + j
  33.     mul $t0, $t0, 2     # ((i * N) + j) * sizeof(element)
  34.  
  35.     move    $a0, $s0        # restore $a0
  36.     add $t0, $t0, $a0       # &board[i][j]
  37.     lhu $a0, 0($t0)     # board[i][j]
  38.     jal has_single_bit_set  # has_single_bit_set(board[i][j])
  39.    
  40.     beq $v0, 1, end_loop    # if (!has_single_bit_set(board[i][j]))
  41.     move    $v0, $zero      # return false
  42.     lw  $ra, 0($sp)     # restore $ra
  43.     jr  $ra
  44.    
  45. end_loop:
  46.     add $s2, $s2, 1     # ++j
  47.     blt $s2, 16, inner_loop # j < 16
  48.  
  49.     add $s1, $s1, 1     # ++i
  50.     blt $s1, 16, outer_loop # i < 16
  51.  
  52.     add $v0, $zero, 1       # return true
  53.  
  54.  
  55.     lw  $ra, 0($sp)     # restore $ra
  56.     lw  $s0, 4($sp)     # restore $s0
  57.     lw  $s1, 8($sp)     # restore $s1
  58.     lw  $s2, 12($sp)        # restore $s2
  59.     add $sp, $sp, 16        # deallocate stack
  60.  
  61.     jr  $ra
  62.  
  63.    
  64. ## void
  65. ## print_board(unsigned short board[16][16]) {
  66. ##   for (int i = 0 ; i < 16 ; ++ i) {
  67. ##     for (int j = 0 ; j < 16 ; ++ j) {
  68. ##       int value = board[i][j];
  69. ##       char c = '*';
  70. ##       if (has_single_bit_set(value)) {
  71. ##         int num = get_lowest_set_bit(value) + 1;
  72. ##         c = symbollist[num];
  73. ##       }
  74. ##       putchar(c);
  75. ##     }
  76. ##     putchar('\n');
  77. ##   }
  78. ## }
  79.  
  80. .globl print_board
  81. print_board:
  82.     sub $sp, $sp, 28        # allocate stack
  83.     sw  $ra, 0($sp)     # save $ra
  84.     sw  $s0, 4($sp)     # save $s0
  85.     sw  $s1, 8($sp)     # save $s1
  86.     sw  $s2, 12($sp)        # save $s2
  87.     sw  $s3, 16($sp)        # save $s3
  88.     sw  $s4, 20($sp)        # save $s4
  89.     sw  $s5, 24($sp)        # save $s5
  90.     #sw $s6, 28($sp)        # save $s6
  91.  
  92.     move    $s0, $a0        # save $a0
  93.     li  $s1, 0          # i = 0
  94.  
  95. outer_loop2:
  96.     li  $s2, 0          # j = 0
  97.  
  98. inner_loop2:
  99.     mul $t0, $s1, 16        # i * N
  100.     add $t0, $t0, $s2       # (i * N) + j
  101.     mul $t0, $t0, 2     # ((i * N) + j) * sizeof(element)
  102.  
  103.     move    $a0, $s0        # restore $a0
  104.     add $t0, $t0, $a0       # &board[i][j]
  105.     lhu $a0, 0($t0)     # value = board[i][j]
  106.     li  $s3, '*'        # c = '*'
  107.     jal has_single_bit_set  # has_single_bit_set(value)
  108.     beq $v0, $zero, skip    # if (has_single_bit_set(value)
  109.     jal get_lowest_set_bit  # get_lowest_set_bit(value)
  110.     add $s4, $v0, 1     # num = get_lowest_set_bit(value) + 1
  111.  
  112.     la  $s5, symbollist     # &symbollist
  113.     #mul    $s4, $s4, 1     # num *= 4
  114.     add $s4, $s4, $s5       # num += &symbollist
  115.     lb  $s3, 0($s4)     # c = symbollist[num]
  116. skip:
  117.     move    $a0, $s3        # putchar(c)
  118.     li  $v0, 11
  119.     syscall
  120.  
  121. end_loop2:
  122.     add $s2, $s2, 1     # ++j
  123.     blt $s2, 16, inner_loop2    # j < 16
  124.  
  125.     li  $a0, '\n'       # putchar('\n')
  126.     li  $v0, 11
  127.     syscall
  128.  
  129.     add $s1, $s1, 1     # ++i
  130.     blt $s1, 16, outer_loop2    # i < 16
  131.  
  132.     lw  $ra, 0($sp)     # restore $ra
  133.     lw  $s0, 4($sp)     # restore $s0
  134.     lw  $s1, 8($sp)     # restore $s1
  135.     lw  $s2, 12($sp)        # restore $s2
  136.     lw  $s3, 16($sp)        # restore $s3
  137.     lw  $s4, 20($sp)        # restore $s4
  138.     lw  $s5, 24($sp)        # restore $s5
  139.     #lw $s6, 28($sp)        # restore $s6
  140.     add $sp, $sp, 28        # deallocate stack
  141.  
  142.     jr  $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement