Solving MIPS Programming: Enter 5 Ints & Reverse Order

  • Thread starter Thread starter missinglink
  • Start date Start date
  • Tags Tags
    Mips Programming
Click For Summary
SUMMARY

The discussion focuses on a MIPS assembly program designed to allow users to input five integers and display them in reverse order. The user encountered an error related to pointer management, specifically when storing values in an array. The issue arises from the incorrect initialization of the array pointer, leading to attempts to write to memory address zero. Recommendations include adding comments for clarity and ensuring the loop correctly tracks the number of inputs.

PREREQUISITES
  • Understanding of MIPS assembly language syntax and structure
  • Familiarity with MIPS system calls for input and output
  • Knowledge of memory addressing and pointer manipulation in assembly
  • Experience with debugging assembly code to identify logical errors
NEXT STEPS
  • Review MIPS assembly language documentation for system calls and memory management
  • Learn about MIPS loop control structures and how to implement them effectively
  • Explore best practices for commenting and structuring assembly code for readability
  • Investigate common debugging techniques for assembly language programs
USEFUL FOR

Students learning MIPS assembly, programmers debugging assembly code, and educators teaching low-level programming concepts.

missinglink
Messages
1
Reaction score
0
I am trying to teach mips to my self and wrote a fairly simple program and it isn't working and found out that the strings I declared in .data are somehow affecting one of my pointers.

Here is the code:

#Write a program that allows the user to enter 5 ints and store these ints in an array and display them in reverse order

.data


msg: .asciiz "Enter your number: "
msg1: .asciiz "Here are your numbers: "
msg2: .asciiz " "
array: .data 20


.text

main:

la $s0, array

add $t0, $s0, $zero

li $t1, 0
li $t2, 5

loop:

li $v0, 4

la $a0,msg

syscall

li $v0, 5

syscall

add $t2, $v0, $zero

sw $t2, 0($t0) # This is the line causing errors

addi $t0, $t0, 4
addi $t1, $t1, 1

slt $t3, $t1, $t2

bne $t3, $zero, loop

li $v0, 4

la $a0, msg1

syscall

li $t5, 0

loop1:

add $t0, $t0, -4

lw $t4, 0($t0)

li $v0, 4

add $a0, $t4, $zero

syscall

li $v0, 4

la $a0, msg2

syscall

addi $t1, $t1, -1

slt $t2, $t5, $t1

bne $t2, $zero, loop1

li $v0, 10

syscall


Can anyone help please?
 
Technology news on Phys.org
When you post code, it's good manners to put [ code ] and [ /code ] tags around it (without the extra spaces). I have done that below.
missinglink said:
I am trying to teach mips to my self and wrote a fairly simple program and it isn't working and found out that the strings I declared in .data are somehow affecting one of my pointers.

Here is the code:
Code:
#Write a program that allows the user to enter 5 ints and store these ints in an array and display them in reverse order

.data 


msg: .asciiz "Enter your number: "
msg1: .asciiz "Here are your numbers: "
msg2: .asciiz " "
array: .data 20


.text

main:

la $s0, array

add $t0, $s0, $zero

li $t1, 0
li $t2, 5

loop:

li $v0, 4

la $a0,msg

syscall

li $v0, 5

syscall

add $t2, $v0, $zero

sw $t2, 0($t0) # This is the line causing errors

addi $t0, $t0, 4
addi $t1, $t1, 1

slt $t3, $t1, $t2

bne $t3, $zero, loop

li $v0, 4

la $a0, msg1

syscall

li $t5, 0

loop1:

add $t0, $t0, -4

lw $t4, 0($t0)

li $v0, 4

add $a0, $t4, $zero

syscall

li $v0, 4

la $a0, msg2

syscall

addi $t1, $t1, -1

slt $t2, $t5, $t1

bne $t2, $zero, loop1

li $v0, 10

syscall

Can anyone help please?

I took a stab at running your code, and hit the same exception at the line you indicated. Since there essentially no comments in your code, it's difficult to tell what you are trying to do. Comments are even more important in assembly code, to help a reader (including yourself) understand what, and more importantly, why you are doing something.

It would be a good idea for you to break up your code into sections, using comments, where each section has a specific purpose.

The first block of code should ask the user to input the five numbers. When I ran your code, it continued asking for numbers well past the fifth. Your loop should keep track of how many times it has run, so that it asks for only five numbers and then moves on.

The final block should print the numbers. The simplest way to do this would be to merely print the numbers in reverse order, starting at the last number in the array (the highest memory address), and working your way to the beginning. I am assuming you don't actually need to reverse the numbers in the array itself.

With regard to the exception you're getting, this code:
Code:
sw $t2, 0($t0)

stores the value at $t2 (R10) at location $t0 + 0 (R8 + 0). When I ran the program, the address in R8 was 0, which meant that the program was trying to store a value in location 0.
 
Last edited:

Similar threads

  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
5K
  • · Replies 1 ·
Replies
1
Views
7K
  • · Replies 2 ·
Replies
2
Views
5K
  • · Replies 5 ·
Replies
5
Views
10K
  • · Replies 1 ·
Replies
1
Views
11K
  • · Replies 1 ·
Replies
1
Views
6K
  • · Replies 1 ·
Replies
1
Views
8K
  • · Replies 5 ·
Replies
5
Views
6K
  • · Replies 20 ·
Replies
20
Views
33K