Question

In: Computer Science

3. Translate the following C code to MIPS assembly code (in two separate files). int main()...

3. Translate the following C code to MIPS assembly code (in two separate files). int main() { printf(“before subroutine!\n”); Subfunc(); printf(“after subroutine!\n!”); } void Subfunc() {printf(“I am subroutine!\n”);}

4. Translate the following C code to MIPS assembly (in two separate files). Run the program step by step and observe the order of instructions being executed and the value of $sp. int main() { int x=2; z=Subfunc(x); printf(“Value of z is: %d”, z); } int Subfunc(int x) { return x+1;}

Solutions

Expert Solution

Answer 3

Step 1

Step 1:-

Given:-

Program in c language:-

#include<stdio.h>

void subfunc();         //Function Declaration

int main()

{

    printf ("before subroutine");

    subfunc ();                             //Call the function

    printf ("after subroutine");

    return 0;

}

void subfunc()               //Function definition

{

    printf("I am subroutine");

}

Step 2

Step 2:-

Convert the C code into Mips assembly code:-

code:-

$LC0:

        .ascii  "before subroutine\000"

$LC1:

        .ascii  "after subroutine\000"

main:

        addiu   $sp,$sp,-32

        sw      $31,28($sp)

        sw      $fp,24($sp)

        move    $fp,$sp

        lui     $2,%hi($LC0)

        addiu   $4,$2,%lo($LC0)

        jal     printf

        nop

        jal     subfunc

        nop

        lui     $2,%hi($LC1)

        addiu   $4,$2,%lo($LC1)

        jal     printf

        nop

        move    $2,$0

        move    $sp,$fp

        lw      $31,28($sp)

        lw      $fp,24($sp)

        addiu   $sp,$sp,32

        j       $31

        nop

$LC2:

        .ascii  "I am subroutine\000"

subfunc:

        addiu   $sp,$sp,-32

        sw      $31,28($sp)

        sw      $fp,24($sp)

        move    $fp,$sp

        lui     $2,%hi($LC2)

        addiu   $4,$2,%lo($LC2)

        jal     printf

        nop

        nop

        move    $sp,$fp

        lw      $31,28($sp)

        lw      $fp,24($sp)

        addiu   $sp,$sp,32

        j       $31

        nop

Answer 4.

Step 1:

Value of $sp before and after the program execution remains the same. Only during function call it will decrease that to store the saved registers like return value , stack pointer or if some values are changed. But, here in this program it won't matter much but mainly in recursive kind of functions stack usage is very much crucial.

Step 2

MIPS PROGRAM :-

.data

print_prompt: .asciiz "Value of z is: "

.text

.globl main

main:

#int x = 2

addi $a0, $zero, 2

#z = Subfunc(x)

jal Subfunc

move $t0, $v0

#printf("Value of z is: %d ")

addi $v0, $zero, 4

la $a0, print_prompt

syscall

addi $v0, $zero, 1

move $a0, $t0

syscall  

#system exit

addi $v0, $zero , 10

syscall

  

Subfunc:

#creating stack

addiu $sp, $sp, -4

sw $fp, 4($sp)

#return x+1

addiu $v0, $a0, 1

#releasing stack

addiu $sp, $sp, 4

jr $ra

Kindly upvote please,

Thank you.


Related Solutions

3. Translate the following C code to MIPS assembly code (in two separate files). int main()...
3. Translate the following C code to MIPS assembly code (in two separate files). int main() { printf(“before subroutine!\n”); Subfunc(); printf(“after subroutine!\n!”); } void Subfunc() {printf(“I am subroutine!\n”);} Submission file: Lab4_3a.asm for the main routine and Lab4_3b.asm for the sub-routine.
4. Translate the following C code to MIPS assembly (in two separate files). Run the program...
4. Translate the following C code to MIPS assembly (in two separate files). Run the program step by step and observe the order of instructions being executed and the value of $sp. int main() { int x=2; z=Subfunc(x); printf(“Value of z is: %d”, z); } int Subfunc(int x) { return x+1;} Submission file: Lab4_4a.asm and Lab4_4b.asm
Translate c++ code into mips assembly: int main() {                 cout << "Numbers:" << endl;            &nbs
Translate c++ code into mips assembly: int main() {                 cout << "Numbers:" << endl;                                 int x[] = {18, 12, 6, 500, 54, 3, 2, 122};                 int i;                                 for (i=0; i<8; i++)                 {                                                 cout << x[i] << endl;                 }                 return 0; } below is my code: .data        str1: .ascii "Numbers:"     str2: .ascii "\n"    x: .word 18,12,6,500,54,3,2,122       .text                      ...
convert following C++ code into MIPS assembly: int main() {                                 &
convert following C++ code into MIPS assembly: int main() {                                         int x[10], occur, count = 0;                                                              cout << "Type in array numbers:" << endl; for (int i=0; i<10; i++) // reading in integers                               { cin >> x[i];        } cout << "Type in occurrence value:" << endl;                                 cin >> occur;                                                 // Finding and printing out occurrence indexes in the array                                  cout << "Occurrences indices are:" <<...
Translate the following function f to MIPS assembly code. int f(int a, int b, int c,...
Translate the following function f to MIPS assembly code. int f(int a, int b, int c, int d) { return func(func(a,b), func(b+c,d)); } Assume the followings. • The prototype of function func is “int func(int a, int b);”. • You do not need to implement function func. The first instruction in function func is labeled “FUNC”. • In the implementation of function f, if you need to use registers $t0 through $t7, use the lower-numbered registers first. • In the...
Translate the following C code to MIPS assembly. The main function and subfunction are translated to...
Translate the following C code to MIPS assembly. The main function and subfunction are translated to two separate .asm files. Finish the assembly code segment for the above requirement. int main() { int x=2; int y=1; int z=0; z=Subfunc(x,y); printf(“Value of z is: %d”, z); } int Subfunc(int x, int y) { int t1=0; t1=x+y+100; return t1;} File 1: .data str: .asciiz "The value of z:" .text #.globl main main: addi $s0, $0,2 #x addi $s1, $0,1 #y addi $s2,...
2. Translate the following C/Java code to MIPS assembly code. Assume that the values of a,...
2. Translate the following C/Java code to MIPS assembly code. Assume that the values of a, i, and j are in registers $s0, $t0, and $t1, respectively. Assume that register $s2 holds the base address of the array A (add comments to your MIPS code). j = 0; for(i=0 ; i<a ; i++) A[i]=i+j++;
4.Translate the following C code to MIPS assembly code. Assume that the value of i is...
4.Translate the following C code to MIPS assembly code. Assume that the value of i is in register $t0, and $s0 holds the base address of the integer MemArray if (i > 10) MemArray[i] = 0; else MemArray[i] = -MemArray[i]; 6.Translate the following C code to MIPS assembly code. Use a minimum number of instructions. Assume that the values of a, b, i, and j are in registers $s0, $s1, $t0, and $t1, respectively. Also, assume that register $s2 holds...
1.) Translate the following C code to MIPS assembly code. Assume that the variables f, g,...
1.) Translate the following C code to MIPS assembly code. Assume that the variables f, g, h, i, and j are assigned to registers $s0, $s1, $s2, $s3, and $s4, respectively. Assume that the base address of the arrays A and B are in registers $s6 and $s7, respectively   B[8] = A[i-j]; 2.Translate the following C code to MIPS assembly code. Assume that the values of v in $a0, k in $a1, temp in $t0.    // leaf procedure that...
Translate the following C code into MIPS Assembly code, assuming Loop Variable k is in $s0...
Translate the following C code into MIPS Assembly code, assuming Loop Variable k is in $s0 and initially containing 0 . Also assume base of array Arr is in $s3 while ( k < = 10 ) { Arr[k] = k ; k = k + 1; }
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT