MIPS Assembly Dynamically Allocating memory example:
Enter player's name, points and minutes, and then sorting using dynamically allocating techniques.
Expected results:
MIPS Assembly Code for dynamically allocating memory:
.data buffer: .space 28 done_str: .asciiz "DONE" enter_players_name: .asciiz "Enter player's last name: " enter_players_points: .asciiz "Enter player's points per game: " enter_players_minutes: .asciiz "Enter player's minutes per game: " newline: .asciiz "\n" blank_text: .asciiz " " .text main: addi $s4,$zero,0 # count number of players loop_in:la $a0,enter_players_name li $v0, 4 syscall # load and print asking for player's last name li $v0, 8 # take the last name of the player la $a0,buffer li $a1,28 syscall # count number of characters in the last name la $t1, buffer # lower array pointer = array base la $t2, buffer # start upper pointer at beginning LengthLp: lb $t3, ($t2) # grab the character at upper ptr beqz $t3, LengthDn # if $t3 == 0, we're at the terminator addi $t2, $t2, 1 # count the character b LengthLp # repeat the loop LengthDn: addi $t2, $t2, -1 sub $s7,$t2,$t1 # number of characters are entered addi $t3,$zero,4 beq $s7,$t3,compDone # compare with "DONE" to finish the program loop_i1:la $a0,enter_players_points li $v0, 4 syscall # load and print asking for player's points per game li $v0, 6 # read float 1 syscall # do it mov.s $f1, $f0 la $a0,enter_players_minutes li $v0, 4 syscall # load and print asking for player's minutes per game li $v0, 6 # read float 2 syscall # do it mov.s $f2, $f0 mtc1 $zero, $f3 #move to FP registers cvt.s.w $f4, $f3 c.eq.s $f1, $f4 bc1t zero_float c.eq.s $f2, $f4 bc1t zero_float div.s $f5, $f1, $f2 #--------------DONE ASKING--------## $s4: number of players zero_back: beq $s4,$zero,first_player addi $s4,$s4,1# Add new players and allocate new memory, deallocate the old memory addi $t3,$zero,4 addi $t4,$zero,28 mult $s4,$t4 mflo $t5 # new number of bytes of name memory mult $s4,$t3 mflo $t6 # new number of bytes of point/min memory li $v0,9 # Allocate new memory for name memory move $a0,$t5 syscall # $v0 <= address of name memory move $s1,$v0 # new address of name memory li $v0,9 # Allocate new memory for point/min memory move $a0,$t6 syscall # $v0 <= address of point/min memory move $s2,$v0 #new address of point/min memory #---Copy data from old mem to new mem --# # $s4-1: number of players in old mem # $s5: address of old name memory # $s6: address of old point/min memory # $s1: address of new name memory # $s2: address of new point/min memory addi $s7,$zero,0 loop_copy: addi $t3,$zero,28 mult $s7,$t3 mflo $t4 addi $t5,$zero,4 mult $s7,$t5 mflo $t6 add $t0,$t4,$s5 # copy names add $t1,$t4,$s1 add $t2,$t6,$s6 # copy point/min add $t3,$t6,$s2 # change number of characters addi $t7,$zero,0 loop1: add $s0,$t0,$t7 add $t4,$t1,$t7 lw $t5,0($s0) # copy name of the player sw $t5,0($t4) addi $t7,$t7,4 addi $t5,$zero,28 bne $t7,$t5,loop1 l.s $f3,0($t2) s.s $f3,0($t3) # copy point/min of the player addi $s7,$s7,1 addi $t0,$s4,-1 beq $s7,$t0,save_new_player #save until the end of the old memory j loop_copy save_new_player: addi $t0,$s4,-1 addi $t3,$zero,28 mult $t0,$t3 mflo $t4 addi $t5,$zero,4 mult $t0,$t5 mflo $t6 la $a0,buffer add $t1,$t4,$s1 add $t3,$t6,$s2 # change number of characters addi $t7,$zero,0 loop2: add $s0,$a0,$t7 add $t4,$t1,$t7 lw $t5,0($s0) # copy name of the player sw $t5,0($t4) addi $t7,$t7,4 addi $t5,$zero,28 bne $t7,$t5,loop2 s.s $f5,0($t3) # save point/min of the player #deallocate the old memory move $a0,$s5 # address of old memory addi $t5,$zero,28 addi $t6,$s4,-1 mult $t6,$t5 mflo $t6 move $a1, $t6 # number of bytes of old memory jal zeroMem move $a0,$s6 # address of old memory addi $t5,$zero,4 addi $t6,$s4,-1 mult $t6,$t5 mflo $t6 move $a1, $t6 # number of bytes of old memory jal zeroMem move $s5,$s1 #update old memory of name move $s6,$s2 #update old memory of point/min j loop_in first_player: li $v0,9 # Allocate a block of memory for name array li $a0,28 syscall # $v0 <= address of name array move $s5,$v0 li $v0,9 # Allocate a block of memory for value array li $a0,4 syscall # $v0 <= address of value array move $s6,$v0 #--save data--# la $a0,buffer # change number of characters addi $t7,$zero,0 loop3: add $s0,$a0,$t7 add $t4,$s5,$t7 lw $t5,0($s0) # copy name of the player sw $t5,0($t4) addi $t7,$t7,4 addi $t5,$zero,28 bne $t7,$t5,loop3 s.s $f5,0($s6) addi $s4,$s4,1 j loop_in compDone: # Compare the string in address $a0 with "DONE" la $t1, buffer # lower array pointer = array base la $t3, done_str lb $t4, 0($t1) lb $t5, 0($t3) bne $t4,$t5,loop_i1 lb $t4, 1($t1) lb $t5, 1($t3) bne $t4,$t5,loop_i1 lb $t4, 2($t1) lb $t5, 2($t3) bne $t4,$t5,loop_i1 lb $t4, 3($t1) lb $t5, 3($t3) bne $t4,$t5,loop_i1 la $a0,newline li $v0, 4 # print string syscall # do it addi $t0,$zero,1 beq $s4,$t0,print_one # DONE ACCEPTING PLAYER's DATA # Continue on sorting move $t0, $s6 # Copy the base address of point/min memory addi $t4,$zero,4 addi $t5,$s4,-1 mult $t5,$t4 mflo $t5 add $t0, $t0, $t5 # 4 bytes per data * $s4 outterLoop: # Used to determine when we are done iterating over the Array add $t1, $0, $0 # $t1 holds a flag to determine when the list is sorted move $a0, $s6 # Set $a0 to the base address of the Array move $a1,$s5 innerLoop: # The inner loop will iterate over the Array checking if a swap is needed l.s $f2, 0($a0) # sets $f2 to the current element in array l.s $f3, 4($a0) # sets $f3 to the next element in array c.lt.s $f2, $f3 bc1f continue add $t1, $0, 1 # if we need to swap, we need to check the list again #SWAP point/min and player's name s.s $f2, 4($a0) s.s $f3, 0($a0) # change number of characters addi $t7,$zero,0 addi $t6,$zero,28 loop4: add $s0,$a1,$t7 add $t4,$a1,$t6 lw $t2,0($s0) lw $t3,0($t4) sw $t2,0($t4) sw $t3,0($s0) addi $t7,$t7,4 addi $t6,$t6,4 addi $t5,$zero,28 bne $t7,$t5,loop4 continue: addi $a0, $a0, 4 # advance the array to start at the next location from last time addi $a1, $a1, 28 bne $a0, $t0, innerLoop bne $t1, $0, outterLoop # $t1 = 1, another pass is needed, jump back to outterLoop #---print data OUT-----# printOut: move $a2,$s6 move $a3,$s5 addi $t4,$zero,4 multu $s4,$t4 mflo $t5 move $a1,$t5 beq $a1, $zero, endPrint # if length == 0, branch to endPrint addi $s0, $a2, 0 addi $s1, $a1, 0 addi $s3,$a3,0 addi $t0, $zero, 0 # t0 = 0 addi $t7, $zero, 0 # t7 = 0 printLoop: # PRINT NAME AND POINT/MIN # print name addi $t3, $zero, 0 add $s7,$s3,$t7 # increase the index of players #li $v0, 4 # print characters #move $a0,$s7 #syscall # do it # print byte by byte move $t2,$s7 print_loop1: add $t2,$s7,$t3 lb $t6,0($t2) addi $t4,$t6,-10 beqz $t4, print_next li $v0, 11 # print character move $a0,$t6 syscall # do it addi $t3,$t3,1 addi $t4,$zero,28 bne $t3,$t4,print_loop1 # print point/min print_next: li $v0, 4 la $a0,blank_text syscall add $t1, $s0, $t0 l.s $f12, 0($t1) li $v0,2 syscall li $v0, 4 # v0 = 4 la $a0, newline syscall addi $t7, $t7, 28 addi $s1, $s1, -4 # s1 = s1 -4 addi $t0, $t0, 4 # t0 = t0 + 4 (next element) bne $t0, $t5, printLoop # if s1 != 0, branch to printLoop endPrint: li $v0,4 # v0 = 4 la $a0, newline syscall # print string "\n" done1: li $v0, 10 # set $v0 = 10 to exit syscall # exit # Deallocate or set zeros to memory # $a0 = address of block of memory # $a1 = number of bytes to set to zero zeroMem: beq $a1,$zero,done sb $zero,0($a0) addiu $a0,$a0,1 addi $a1,$a1,-1 j zeroMem done: jr $ra zero_float: mtc1 $zero, $f3 #move to FP registers cvt.s.w $f4, $f3 mov.s $f5,$f3 j zero_back print_one: addi $t3,$zero,0 move $t2,$s5 move $s7,$s5 print_loop2: add $t2,$s7,$t3 lb $t6,0($t2) addi $t4,$t6,-10 beqz $t4, print_next1 li $v0, 11 # print character move $a0,$t6 syscall # do it addi $t3,$t3,1 addi $t4,$zero,28 bne $t3,$t4,print_loop2 print_next1: li $v0, 4 la $a0,blank_text syscall l.s $f12, 0($s6) # print point/min li $v0,2 syscall li $v0, 4 # v0 = 4 la $a0, newline syscall li $v0, 10 # set $v0 = 10 to exit syscall # exit
You may like this:
VHDL code for D Flip Flop
Verilog code for D Flip Flop
Verilog code for a comparator
Verilog code for FIFO memory
VHDL code for FIFO memory
Verilog code for D Flip Flop
Verilog code for a comparator
Verilog code for FIFO memory
VHDL code for FIFO memory
Verilog code for 16-bit single-cycle MIPS microprocessor
Programmable digital delay timer in Verilog
Basic digital logic components in Verilog HDL
FIR Filter in VHDL
What is an FPGA? Why FPGA?
A complete 8-bit Microcontroller in VHDL
Verilog code for 32-bit unsigned Divider
Fix-point matrix multiplication in Verilog[Full code and tutorials]
Verilog code for a Carry Look Ahead Multiplier
Programmable digital delay timer in Verilog
Basic digital logic components in Verilog HDL
FIR Filter in VHDL
What is an FPGA? Why FPGA?
A complete 8-bit Microcontroller in VHDL
Verilog code for 32-bit unsigned Divider
Fix-point matrix multiplication in Verilog[Full code and tutorials]
Verilog code for a Carry Look Ahead Multiplier
No comments:
Post a Comment