HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

MIPS assembly addition program

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
assemblyadditionprogrammips

Problem

I am new to assembly and have made a simple addition program to sum two integers read from the keyboard. The program outputs correctly, but I want to know if there is a way to streamline my code. It seems a bit cumbersome for such a simple program and I may have instructions that are unnecessary.

```
# Author: Evan Bechtol
# Description: This program prompts the user to enter 2 integers and computes their sum.
#---------------------------------------------------------------------------------------#
.data
A: .word # Store the number 4 as an integer in var1 # $t0 is used
B: .word # Store the number 2 as an integer in var2 # $t1 is used
S: .word # Store the sum of A and B # $t2 is used
Prompt1: .asciiz "Please enter first number: "
Prompt2: .asciiz "Please enter second number: "
Result: .asciiz "The sum of A and B is: "
.text
main:
#--------------------------------------------------------#
#Display first prompt
li $v0, 4 # Load instruction "print string"
la $a0, Prompt1 # Load prompt into $a0
syscall

#Read first integer
li $v0, 5 # Read 1st integer
la $t0, A # $t0 = A
syscall

#Store first integer into memory
move $t0, $v0 # Move contents in $v0 to $t0
sw $t0, A # A = value at $t0
#--------------------------------------------------------#

#Display second prompt
li $v0, 4 # Load instruction "print string"
la $a0, Prompt2 # Load prompt into $a0
syscall

#Read second integer
li $v0, 5 # Read 1st integer
la $t1, B # $t0 = A
syscall

#Store second integer into memory
move $t1, $v0 # Move contents in $v0 to $t0
sw $t1, B # A = value at $t0
#--------------------------------------------------------#

#Add the two variables
la $t2, S # $t2 = S
add $t2, $t0, $t1 # $t2 = $t0 + $t1
sw $t2, S #

Solution

-
The comments are misleading:

#Read second integer
li  $v0, 5      # Read 1st integer
la  $t1, B      # $t0 = A


umm... are we reading second or 1st? Bottomline is, do not overcomment the code.

-
syscall 5 leaves a value in $v0. The contents of $t0 (or $t1) is irrelevant during the syscall. Set them up when you need them:

li $v0, 5
syscall
la $t0, A
move    $t0, $v0


-
You store data to memory just to load them back. This is very anti-assembly. Generally you want to use registers as much as possible, and avoid memory as much as possible:

li $v0, 5
syscall
move $t0, $v0
...
li $v0, 5
syscall
# At this moment you have first integer in $t0, and the second in $v0.
# Just add them together. No memory access is necessary.


Consult your documentation on which registers are guaranteed to survive a syscall (I suspect, all of them besides $v0).

-
Nothing to simplify reading and printing.

Code Snippets

#Read second integer
li  $v0, 5      # Read 1st integer
la  $t1, B      # $t0 = A
li $v0, 5
syscall
la $t0, A
move    $t0, $v0
li $v0, 5
syscall
move $t0, $v0
...
li $v0, 5
syscall
# At this moment you have first integer in $t0, and the second in $v0.
# Just add them together. No memory access is necessary.

Context

StackExchange Code Review Q#82188, answer score: 5

Revisions (0)

No revisions yet.