Translate the following C++ program to MIPS assembly program. *Please explain each instruction of your code by a comment and submit a .asm file*#include using namespace std; void myfunction(int arr[], int n) { int writes = 0; for(int start = 0; start <= n-2; start++){ int item = arr[start]; int pos = start; for(int i = start+1; i< n; i++) if (arr[i]

Respuesta :

Answer:

Check the explanation

Explanation:

ASM of MIPS gcc 5.4:

myfunction(int*, int):

       addiu   $sp,$sp,-56

       sw      $31,52($sp)

       sw      $fp,48($sp)

       move    $fp,$sp

       sw      $4,56($fp)

       sw      $5,60($fp)

       sw      $0,24($fp)

       sw      $0,28($fp)

$L16:

       lw      $2,60($fp)

       nop

       addiu   $3,$2,-2

       lw      $2,28($fp)

       nop

       slt     $2,$3,$2

       bne     $2,$0,$L17

       nop

       lw      $2,28($fp)

       nop

       sll     $2,$2,2

       lw      $3,56($fp)

       nop

       addu    $2,$3,$2

       lw      $2,0($2)

       nop

       sw      $2,44($fp)

       lw      $2,28($fp)

       nop

       sw      $2,32($fp)

       lw      $2,28($fp)

       nop

       addiu $2,$2,1

       sw      $2,36($fp)

$L5:

       lw      $3,36($fp)

       lw      $2,60($fp)

       nop

       slt     $2,$3,$2

       beq     $2,$0,$L3

       nop

       lw      $2,36($fp)

       nop

       sll     $2,$2,2

       lw      $3,56($fp)

       nop

       addu    $2,$3,$2

       lw      $3,0($2)

       lw      $2,44($fp)

       nop

       slt     $2,$3,$2

       beq     $2,$0,$L4

       nop

       lw      $2,32($fp)

       nop

       addiu   $2,$2,1

       sw      $2,32($fp)

$L4:

       lw      $2,36($fp)

       nop

       addiu   $2,$2,1

       sw      $2,36($fp)

       b       $L5

       nop

$L3:

       lw      $3,32($fp)

       lw      $2,28($fp)

       nop

       beq     $3,$2,$L18

       nop

$L6:

       lw      $2,32($fp)

       nop

       sll     $2,$2,2

       lw      $3,56($fp)

       nop

       addu    $2,$3,$2

       lw      $3,0($2)

       lw      $2,44($fp)

       nop

       bne     $3,$2,$L8

       nop

       lw      $2,32($fp)

       nop

       addiu   $2,$2,1

       sw      $2,32($fp)

       b       $L6

       nop

$L8:

       lw      $3,32($fp)

       lw      $2,28($fp)

       nop

       beq     $3,$2,$L9

       nop

       lw      $2,32($fp)

       nop

       sll     $2,$2,2

       lw      $3,56($fp)

       nop

       addu    $3,$3,$2

       addiu   $2,$fp,44

       move    $5,$3

       move    $4,$2

       jal     void std::swap<int>(int&, int&)

       nop

       lw      $2,24($fp)

       nop

       addiu   $2,$2,1

       sw      $2,24($fp)

$L9:

       lw      $3,32($fp)

       lw      $2,28($fp)

       nop

       beq     $3,$2,$L7

       nop

       lw      $2,28($fp)

       nop

       sw      $2,32($fp)

       lw      $2,28($fp)

       nop

       addiu   $2,$2,1

       sw      $2,40($fp)

$L13:

       lw      $3,40($fp)

       lw      $2,60($fp)

       nop

       slt     $2,$3,$2

       beq     $2,$0,$L11

       nop

       lw      $2,40($fp)

     nop

       sll     $2,$2,2

       lw      $3,56($fp)

       nop

       addu    $2,$3,$2

       lw      $3,0($2)

       lw      $2,44($fp)

       nop

       slt     $2,$3,$2

       beq     $2,$0,$L12

       nop

       lw      $2,32($fp)

       nop

       addiu   $2,$2,1

       sw      $2,32($fp)

$L12:

       lw      $2,40($fp)

       nop

       addiu   $2,$2,1

       sw      $2,40($fp)

       b       $L13

       nop

$L11:

       lw      $2,32($fp)

       nop

       sll     $2,$2,2

       lw      $3,56($fp)

       nop

       addu    $2,$3,$2

       lw      $3,0($2)

       lw      $2,44($fp)

       nop

       bne     $3,$2,$L14

       nop

       lw      $2,32($fp)

       nop

       addiu   $2,$2,1

       sw      $2,32($fp)

       b       $L11

       nop

$L14:

       lw      $2,32($fp)

       nop

       sll     $2,$2,2

       lw      $3,56($fp)

       nop

       addu    $2,$3,$2

       lw      $3,0($2)

       lw      $2,44($fp)

       nop

       beq     $3,$2,$L9

       nop

       lw      $2,32($fp)

       nop

       sll     $2,$2,2

       lw      $3,56($fp)

       nop

       addu    $3,$3,$2

       addiu   $2,$fp,44

       move    $5,$3

       move    $4,$2

       jal     void std::swap<int>(int&, int&)

       nop

       lw      $2,24($fp)

       nop

       addiu   $2,$2,1

       sw      $2,24($fp)

       b       $L9

       nop

$L18:

       nop

$L7:

       lw      $2,28($fp)

       nop

       addiu   $2,$2,1

       sw      $2,28($fp)

       b       $L16

       nop

$L17:

       nop

       move    $sp,$fp

       lw      $31,52($sp)

       lw      $fp,48($sp)

       addiu   $sp,$sp,56

       j       $31

       nop

$LC0:

       .ascii "array:\000"

$LC1:

       .ascii " \000"

main:

       addiu   $sp,$sp,-72

       sw      $31,68($sp)

       sw      $fp,64($sp)

       move    $fp,$sp

       li      $2,1                        # 0x1

       sw      $2,32($fp)

       li      $2,8                        # 0x8

       sw      $2,36($fp)

       li      $2,3                        # 0x3

       sw      $2,40($fp)

       li      $2,9                        # 0x9

       sw      $2,44($fp)

       li      $2,10                 # 0xa

       sw      $2,48($fp)

       li      $2,2                        # 0x2

       sw      $2,52($fp)

       li      $2,4                        # 0x4

       sw      $2,56($fp)

       li      $2,7                        # 0x7

       sw      $2,28($fp)

       addiu   $2,$fp,32

       lw      $5,28($fp)

       move    $4,$2

       jal     myfunction(int*, int)

       nop

       lui     $2,%hi($LC0)

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

       lui     $2,%hi(_ZSt4cout)

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

       jal     std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

       nop

       move    $3,$2

       lui     $2,%hi(_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_)

       addiu   $5,$2,%lo(_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_)

       move    $4,$3

       jal     std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))

       nop

       sw      $0,24($fp)

$L21:

       lw      $3,24($fp)

       lw      $2,28($fp)

       nop

       slt     $2,$3,$2

       beq     $2,$0,$L20

       nop

       lw      $2,24($fp)

       nop

       sll     $2,$2,2

       addiu   $3,$fp,24

       addu    $2,$3,$2

       lw      $2,8($2)

       nop

       move    $5,$2

       lui     $2,%hi(_ZSt4cout)

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

       jal     std::basic_ostream<char, std::char_traits<char> >::operator<<(int)

       nop

       move    $3,$2

       lui     $2,%hi($LC1)

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

       move    $4,$3

       jal     std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

       nop

       lw      $2,24($fp)

       nop

       addiu   $2,$2,1

       sw      $2,24($fp)

       b       $L21

       nop

$L20:

       move    $2,$0

       move    $sp,$fp

       lw      $31,68($sp)

       lw      $fp,64($sp)

       addiu   $sp,$sp,72

       j       $31

       nop

void std::swap<int>(int&, int&):

       addiu   $sp,$sp,-24

       sw      $fp,20($sp)

       move    $fp,$sp

       sw      $4,24($fp)

       sw      $5,28($fp)

       lw      $2,24($fp)

       nop

       lw      $2,0($2)

       nop

       sw      $2,8($fp)

       lw      $2,28($fp)

       nop

       lw      $3,0($2)

       lw      $2,24($fp)

       nop

       sw      $3,0($2)

       lw      $2,28($fp)

       lw      $3,8($fp)

       nop

       sw      $3,0($2)

       nop

       move    $sp,$fp

       lw      $fp,20($sp)

       addiu   $sp,$sp,24

       j       $31

       nop

__static_initialization_and_destruction_0(int, int):

       addiu   $sp,$sp,-32

       sw      $31,28($sp)

       sw      $fp,24($sp)

      move    $fp,$sp

       sw      $4,32($fp)

       sw      $5,36($fp)

       lw      $3,32($fp)

       li      $2,1                        # 0x1

       bne     $3,$2,$L26

       nop

       lw      $3,36($fp)

       li      $2,65535                    # 0xffff

       bne     $3,$2,$L26

       nop

       lui     $2,%hi(_ZStL8__ioinit)

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

       jal     std::ios_base::Init::Init() [complete object constructor]

       nop

       lui     $2,%hi(__dso_handle)

       addiu   $6,$2,%lo(__dso_handle)

       lui     $2,%hi(_ZStL8__ioinit)

       addiu   $5,$2,%lo(_ZStL8__ioinit)

       lui     $2,%hi(_ZNSt8ios_base4InitD1Ev)

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

       jal     __cxa_atexit

       nop

$L26:

       nop

       move    $sp,$fp

       lw      $31,28($sp)

       lw      $fp,24($sp)

       addiu   $sp,$sp,32

       j       $31

       nop