Advertisement
Guest User

Untitled

a guest
Apr 10th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .data
  2.     newline:   .asciiz "\n"
  3.     msg_eval:   .asciiz "Expression to be evaluated:\n"
  4.     msg_eq:   .asciiz "="
  5.     #inbuf:   .asciiz "1+3-5"
  6.     #inbuf:   .asciiz "((1 - 3) + 5)"
  7.     inbuf:   .asciiz "1+2+4-5-7+3-6"
  8.     #inbuf:   .space 128
  9.     outbuf:   .space 128
  10.        .text
  11. .globl main
  12.  
  13. main:  
  14.     li $v0, 4 # print_str
  15.     la $a0, msg_eval # "Expression to be evaluated:\n"
  16.     syscall
  17.    
  18.     # Input
  19.     li $v0, 8 # read_string
  20.     la $a0, inbuf
  21.     li $a1, 128
  22.     #syscall
  23.    
  24.     # debug
  25.     li $v0, 4 # print_str
  26.     la $a0, inbuf
  27.     syscall
  28.     li $v0, 4 # print_str
  29.     la $a0, newline
  30.     syscall
  31.    
  32.     # Convert to Postfix
  33.     move $s0, $sp # s0 = stackStart
  34.     la $t0, inbuf # t0 = current char
  35.     la $t4, outbuf # t4 = current out char
  36.     inLoop:
  37.         lbu $t2, ($t0) # t2 = char[t0]
  38.         beq $t2, 0, stack_loop1 # t2 == '\0'
  39.        
  40.         beq $t2, 32, inLoop_continue # skip ' '
  41.         beq $t2, 10, inLoop_continue # skip '\n'
  42.         beq $t2, 43, inLoop_pm # +
  43.         beq $t2, 45, inLoop_pm # -
  44.         beq $t2, 40, inLoop_op # (
  45.         beq $t2, 41, inLoop_cp # )
  46.        
  47.         # default (is a #)
  48.         sb $t2, ($t4) # output += char
  49.         addu $t4, $t4, 1
  50.        
  51.         j inLoop_continue
  52.        
  53.         inLoop_pm: # + | -
  54.             li $a1, 1 # push = true
  55.             jal stack_loop
  56.            
  57.             subu $sp, $sp, 1
  58.             sb $t2, ($sp) # stack push t2
  59.            
  60.             j inLoop_continue
  61.         inLoop_op: # (
  62.             subu $sp, $sp, 1
  63.             sb $t2, ($sp) # stack push t2
  64.            
  65.             j inLoop_continue
  66.         inLoop_cp: # )
  67.             li $a1, 0 # push = false
  68.             jal stack_loop
  69.            
  70.             j inLoop_continue
  71.         inLoop_continue:
  72.             addu $t0, $t0, 1 # t0++
  73.             j inLoop
  74.     stack_loop1:
  75.         beq $sp, $s0, stack_loop1_end # while stack !empty
  76.        
  77.         lb   $t3, ($sp) # stack pop t3
  78.         addu $sp, $sp, 1
  79.        
  80.         sb $t3, ($t4) # output += char
  81.         addu $t4, $t4, 1
  82.        
  83.         j stack_loop1
  84.     stack_loop1_end:
  85.    
  86.     li $t5, 0
  87.     sb $t5, ($t4) # Null terminate string '\0'
  88.    
  89.    
  90.     # Postfix to Tree
  91.     la $t0, outbuf
  92.     loop_postfix:
  93.         lbu $t2, ($t0) # t2 = char[t0]
  94.         beq $t2, 0, loop_postfix_end # t2 == '\0'
  95.        
  96.         beq $t2, 43, loop_postfix_pm # +
  97.         beq $t2, 45, loop_postfix_pm # -
  98.        
  99.         # default (is a #)
  100.         andi $t2, $t2, 0x0F # convert char to int
  101.        
  102.         li $a0, 12 # bytes
  103.         li $v0, 9 # node* = malloc
  104.         syscall
  105.         sw $t2, 0($v0) # val = #
  106.         sw $zero, 4($v0) # a* = 0
  107.         sw $zero, 8($v0) # b* = 0
  108.        
  109.         subu $sp, $sp, 4
  110.         sw $v0, ($sp) # stack push t2
  111.        
  112.         j loop_postfix_continue
  113.        
  114.         loop_postfix_pm: # + | -
  115.             lw $t5, ($sp) # b* = stack pop
  116.             addu $sp, $sp, 4
  117.            
  118.             lw $t6, ($sp) # a* = stack pop
  119.             addu $sp, $sp, 4
  120.            
  121.             li $a0, 12 # bytes
  122.             li $v0, 9 # node* = malloc
  123.             syscall
  124.            
  125.             # init node
  126.             sb $t2, 0($v0)# val = op
  127.             sw $t6, 4($v0)# a*
  128.             sw $t5, 8($v0)# b*
  129.            
  130.             subu $sp, $sp, 4
  131.             sw $v0, ($sp) # stack push node*
  132.         loop_postfix_continue:
  133.             addu $t0, $t0, 1 # t0++
  134.             j loop_postfix
  135.     loop_postfix_end:
  136.    
  137.     # Evaluate Tree
  138.     lw $a1, ($sp) # a1 = head node* !!!!!!!!!!
  139.     jal solve_tree
  140.    
  141.     # Output Postfix Expression
  142.     li $v0, 4 # print_str
  143.     la $a0, outbuf
  144.     syscall
  145.    
  146.     li $v0, 4 # print_str
  147.     la $a0, msg_eq
  148.     syscall
  149.    
  150.     li $v0, 1 # print_int
  151.     move   $a0, $a2 # returned value
  152.     syscall
  153.    
  154.     li $v0, 10 # exit
  155.     syscall
  156.  
  157. stack_loop: # a1 = push
  158.     beq $sp, $s0, stack_loop_end # while stack !empty
  159.    
  160.     lb   $t3, ($sp) # stack pop t3
  161.     addu $sp, $sp, 1
  162.    
  163.     bne $t3, 40, stack_loop_else # char != (
  164.     beq $a1, 0, stack_loop_end # break
  165.    
  166.     subu $sp, $sp, 1
  167.     sb $t3, ($sp) # stack push t3
  168.    
  169.     j stack_loop_end # break
  170.    
  171.     stack_loop_else:
  172.         sb $t3, ($t4) # output += char
  173.         addu $t4, $t4, 1
  174.        
  175.         j stack_loop
  176.     stack_loop_end:
  177.         jr $ra
  178.  
  179. solve_tree: # a1 = node*
  180.     lw $t0, 0($a1) # t0 = value
  181.     lw $t1, 4($a1) # t1 = a
  182.     #lw $t2, 8($a1) # t2 = b
  183.    
  184.     bne $t1, $zero, solve_tree_nested # t1 != 0
  185.    
  186.     move $a2, $t0 # return #
  187.     jr $ra
  188.    
  189.     solve_tree_nested: # t0 == op
  190.         sw   $a1, -4($sp) # stack push node*
  191.         sw   $ra, -8($sp) # stack push ra
  192.         subu $sp, $sp, 8
  193.        
  194.         move $a1, $t1 # a1 = a
  195.         jal solve_tree # a
  196.         lw $ra, ($sp) # stack pop ra
  197.         subu $sp, $sp, 4
  198.         sw   $a2, ($sp) # stack push a
  199.        
  200.         lw $a1, 8($sp) # a1 = node*
  201.         lw $a1, 8($a1) # a1 = b
  202.         subu $sp, $sp, 4
  203.         sw $ra, ($sp) # stack push ra
  204.         jal solve_tree # b
  205.         lw $ra, ($sp) # stack pop ra
  206.         subu $sp, $sp, 4
  207.         sw   $a2, ($sp) # stack push b
  208.        
  209.         lw   $a1, 16($sp) # stack peek node* ????????????
  210.         lw $t0, 0($a1) # t0 = op
  211.         lw $t1, ($sp) # t1 = pop b
  212.         lw $t2, 8($sp) # t2 = pop a
  213.         addu $sp, $sp, 12
  214.        
  215.         lw $ra, ($sp)
  216.         addu $sp, $sp, 8
  217.        
  218.         bne $t0, 43, solve_tree_nested_minus # op != +
  219.         add $a2, $t2, $t1 # return a + b ????????????
  220.         jr $ra
  221.        
  222.         solve_tree_nested_minus:
  223.         sub $a2, $t2, $t1 # return a - b
  224.         jr $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement