ln206
ln206

Reputation: 169

Sum of two numbers in MIPS

I'm trying to practice my coding skill in MIPS (this is my first time ever learning an assembly language). I wrote this code below to sum up two user's inputs, and it is correct. However, the code is quite long..so, is there any way to optimize this code so it will be shorter? i need some suggestions. Thanks

.data
    n1: .asciiz "enter your first number: "
    n2: .asciiz "enter your second number: "
    result: .asciiz "result is "

.text
    #getting first input.
    la $a0, n1
    li $v0, 4
    syscall
    li $v0, 5
    syscall
    move $t0, $v0

    #getting second input.
    la $a0, n2
    li $v0, 4
    syscall
    li $v0, 5
    syscall
    move $t1, $v0

    #calculate and print out the result.
    la $a0, result
    li $v0, 4
    syscall
    add $t3, $t0, $t1
    move $a0, $t3
    li $v0, 1
    syscall

    #end program.
    li $v0, 10
    syscall

I also have wrote a program to calculate a factorial number. There are better ways to do this?

.data
 str: .asciiz "Enter a number: "
 result: .asciiz "The result is: "

.text
 la $a0, str
 li $v0, 4
 syscall
 li $v0, 5
 syscall
 move $s0, $v0 # move N into s0     
 li $s2, 1 # c = 1
 li $s1, 1 # fact = 1

 LOOP:
 blt $s0, $s2, PRINT # if (n < c ) print the result
 mul $s1, $s1, $s2 # fact = fact * c
 add $s2, $s2, 1 # c = c + 1
 j LOOP

 PRINT:
 la $a0, result
 li $v0, 4
 syscall
 add $a0, $s1, $zero
 li $v0, 1
 syscall
 li $v0, 10
 syscall

Upvotes: 1

Views: 15598

Answers (1)

markgz
markgz

Reputation: 6266

The programs look ok, except for the use of the temporary registers $t0,...,$t9. These registers are not guaranteed to be preserved when another function is called, or when a syscall is issued. The $s0,...,$s7 registers are preserved across calls.

You need to replace: move $t0, $v0 with move $s0, $v0; move $t1, $v0 with move $s1, $v0 and add $t3, $t0, $t1 with add $s3, $s0, $s1.

Upvotes: 1

Related Questions