I'm writing MIPS program that will examine a list of 10 numbers to be input from the terminal. And these numbers will output on the terminal in an ascending order. And below are my MIPS program...please can someone help me look into it, because i m running and isn't working proply....
.data
array: .space 40
prompt: .asciiz "Enter a number: "
spacee: .asciiz " "
output: .asciiz "The numbers are: "
.text
main:
li $t1,10
la $a1,array
loop:
addi $t1,$t1,-1
li $v0,4
la $a0,prompt
syscall
li $v0,5
syscall
sw $v0,0($a1)
addi $a1,$a1,4
bnez $t1,loop
li $t1,9
li $t2,9
la $a1,array
loop1:
beqz $t2,here
addi $t2,$t2,-1
lw $t5,0($a1)
lw $t6,4($a1)
add $a1,$a1,4
ble $t5,$t6,loop1
sw $t5,0($a1)
sw $t6,-4($a1)
bnez $t2,loop1
here:
la $a1,array
addi $t1,$t1,-1
add $t2,$t2,$t1
bnez $t1,loop1
li $v0,4
la $a0,output
syscall
la $a1,array
li $t1,10
loop2:
li $v0,1
lw $a0,0($a1)
syscall
li $v0,4
la $a0,spacee
syscall
add $a1,$a1,4
addi $t1,$t1,-1
bnez $t1,loop2
li $v0,10 #exit
syscall
-
To begin with, you are using some instructions the wrong way.
add $a1,$a1,4
should be
addiu $a1,$a1,4
Because you are adding an inmediate,not two registers.
In addition to that, you should take a look to your comparing logic. It's quite confusing and error prone.
-
If you use addi instead of add, does it work? Also with assembly, it sometimes helps to comment a lot since it doesn't read anywhere close to a natural language.
.data array: .space 40 prompt: .asciiz "Enter a number: " spacee: .asciiz " " output: .asciiz "The numbers are: " .text main: li $t1,10 #load 10 into $t1 la $a1,array #load a pointer to array into $a1 loop: addi $t1,$t1,-1 #subtract 1 from $t1, save to $t1 li $v0,4 #load 4 into $v0 (print string) la $a0,prompt #load prompt text into $a syscall #display prompt li $v0,5 #load 5 into $v0 (read integer) syscall #prompt for input sw $v0,0($a1) #store input int to array addi $a1,$a1,4 #add 4 to $a1, save to $a1 bnez $t1,loop #if $t1 isn't zero,goto loop li $t1,9 #if $t1 is zero, load 9 into $t1 li $t2,9 #and load 9 into $t2 la $a1,array #load array pointer into $a1 loop1: beqz $t2,here #if $t2 is zero, goto here addi $t2,$t2,-1 #subtract 1 from $t2, save to $t2 lw $t5,0($a1) #load an input int into $t5 lw $t6,4($a1) #load the next one into $t6 addi $a1,$a1,4 #add 4 to $a1, save to $a1 ble $t5,$t6,loop1 #if $t5 <= $t6, goto loop1 sw $t5,0($a1) #else, store $t5 in $a1 sw $t6,-4($a1) #and store $t6 in $a1-4 (swapping them) bnez $t2,loop1 #if $t2 is not zero, to go loop1 here: la $a1,array #load array into $a1 addi $t1,$t1,-1 #subtract 1 from $t1, save to $t1 add $t2,$t2,$t1 #add $t2 to $t1, save to $t2 bnez $t1,loop1 #if $t1 isn't zero, goto loop1 li $v0,4 #load 4 into $v0 (print string) la $a0,output #load 'the numbers are' into $a0 syscall #display message to screen la $a1,array #load array pointer into $a1 li $t1,10 #load 10 into $t1 loop2: li $v0,1 #load 1 into $v0 (print int) lw $a0,0($a1) #load $a1 into $a0 syscall #print first number to screen li $v0,4 #load 4 into $v1 (print string) la $a0,spacee #load ' ' into $a0 syscall #print ' ' to screen addi $a1,$a1,4 #add 4 to $a1, save to $a1 addi $t1,$t1,-1 #subtract 1 from $t1, save to $t1 bnez $t1,loop2 #if $t1 isn't zero, goto loop2 li $v0,10 #exit syscall
I don't have a MIPS processor, but this worked in C: #include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[]) { int t1; int t2; int* a1; int t5; int t6; int arr[10] = {10,9,8,7,6,5,4,3,2,1}; t1 = 9; t2 = 9; a1 = arr; loop1: if(t2 == 0) goto here; t2 = t2 - 1; t5 = *a1; t6 = *(a1 + 1); a1 = a1 + 1; if(t5 <= t6) goto loop1; *a1 = t5; *(a1-1) = t6; if(t2 != 0) goto loop1; here: a1 = arr; t1 = t1 - 1; t2 = t2 + t1; if(t1 != 0) goto loop1; printf("the numbers are\n"); a1 = arr; t1 = 10; loop2: printf("%i ", *a1); a1 = a1 + 1; t1 = t1 - 1; if(t1 != 0) goto loop2; return 0; }
MStodd : correction, that didn't work, i liedMStodd : now it works...
0 comments:
Post a Comment