Fathima Reeza
Fathima Reeza

Reputation: 1

Finding factorial of a number using recursive call in MIPS programming

This is the C source code

#include <stdio.h>

int main() {
    
    printf("The Factorial of 10 is %d\n", fact(10));
}

int fact(int n) {

    if (n < 1)
        return (1);
    else
        return (n * fact(n - 1));
}

I am converting a C Programming function to a MIPS, but when I run the MIPS program I am getting an error for the .ascii section.

    .text
    .globl main
main:
    subu    $sp,$sp,32  # Stack frame is 32 bytes long
    sw  $ra,20($sp)     # Save return address
    sw  $fp,16($sp)     # Save old frame pointer
    addiu   $fp,$sp,28  # Set up frame pointer

    li  $a0,10      # Put argument (10) in $a0
    jal     fact        # Call factorial function
    la  $a0,$LC     # Put format string in $a0
    move    $a1,$v0     # Move fact result to $a1
    jal     printf      # Call the print function

    lw  $ra,20($sp)     # Restore return address
    lw  $fp,16($sp)     # Restore frame pointer
    addiu   $sp,$sp,32  # Pop stack frame
    jr  $ra         # Return to caller
    
    .rdata
$LC:
    .ascii “The factorial of 10 is %d\n\000”

    .text
fact:
    subu    $sp,$sp,32  # Stack frame is 32 bytes long
    sw  $ra,20($sp)     # Save return address
    sw  $fp,16($sp)     # Save frame pointer
    addiu   $fp,$sp,28  # Set up frame pointer
    sw  $a0,0($fp)  # Save argument (n) to use for Recursive Call
    
    lw  $v0,0($fp)  # Load n
    bgtz    $v0,$L2     # Branch if n > 0
    li  $v0,1       # Return 1
    jr  $L1         # Jump to code to return
$L2:
    lw  $v1,0($fp)  # Load n
    subu    $v0,$v1,1   # Compute n - 1
    move    $a0,$v0     # Move value to $a0
    
    jal     fact        # Call factorial function
    lw  $v1,0($fp)  # Load n
    mul     $v0,$v0,$v1     # Compute fact(n-1) * n
    
$L1:                # Result is in $v0
    lw  $ra, 20($sp)    # Restore $ra
    lw  $fp, 16($sp)    # Restore $fp
    addiu   $sp, $sp, 32    # Pop stack
    jr  $ra         # Return to caller

It's giving me an error for the .ascii code section saying it shouldn't be in the .text:

Error in ".ascii" directive cannot appear in text segment

It's also saying that:

"$L1": operand is of incorrect type

Upvotes: 0

Views: 1038

Answers (1)

Intu
Intu

Reputation: 100

It's giving me an error for the .ascii code section saying it shouldn't be in the .text:

Error in ".ascii" directive cannot appear in text segment"

I am going out on a limb here because I am not 100% sure what you are running this on, but some sims like MARS don't recognize the rdata segment. You can try using just .data.

Also, if you are on something like WinMIPS64, you may want to try placing the .data segment at the top of the code. I understand what you are doing is right in some environments and but doesn't work in others, so give it a whirl.

May I suggest you try these things separately, just in case.

Upvotes: 2

Related Questions