将伪转换为mips

时间:2019-02-12 03:27:09

标签: mips

我需要帮助将此伪代码转换为mips。我们应该递归地反转整数数组。

/* Function to reverse arr[] from start to end*/
void reverseArray(int arr[], int start, int end)
{
int temp;
if (start>= end)
 return;
reverseArray(arr, start+1, end-1);
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}

/* Utility that prints out an array on a line */
void printArray(int arr[], int size)
{
int i;
for (i=0; i<size; i++)
  printf(”%d ”, arr[i]);
printf(”\n”);
}

/* Driver function to test above functions */
int main()
{
int arr[] ={1, 2, 3, 4, 5, 6};
printf(”Original array is :  ”);
printArray(arr, 6);
reverseArray(arr, 0, 5);
printf(”Reversed array is :  ”);
printArray(arr, 6);
return 0;
}

1 个答案:

答案 0 :(得分:0)

您可以使用堆栈推送和弹出概念反转数组: enter image description here

执行推送和弹出的 MIPS 代码:

.data

space: .asciiz " "

newline: .asciiz "\n"

array:   .word 1, 3, 5, 7, 9, 12, 14, 15, 17, 19
         .word 21, 22, 25, 27, 29, 33, 33, 35, 37, 39
         .word 41, 44, 45, 47, 49, 52, 53, 55, 57, 59
length:  .word 30
    
.text
.globl main
.ent main
main:

#loop to read items from array and push to stack

la $t0 array #array's starting address
li $t1 0     #loop index, i=0
lw $t2 length  #length


pushLoop:
lw $t4 ($t0)   #get array[i]
# printing array
addi $a0,$t4,0
li $v0,1
syscall
# printing space
li $v0, 4
la $a0, space   
syscall

subu $sp $sp 4
sw $t4 ($sp)

addi $t1 $t1 1 #i = i+1
add $t0 $t0 4 #update array address

blt $t1 $t2 pushLoop

#loop to pop items from stack and write into array
la $t0 array  #array's starting index
li $t1 0      #loop index i=0

lw $t2 length

popLoop:
lw $t4 ($sp)
addu $sp $sp 4

sw $t4 ($t0)     #set array [i]

add $t1 $t1 1   #i=i+1
add $t0 $t0 4   #update array address

blt $t1 $t2 popLoop #if i<length continue

#giving space of a line
li $v0,4
la $a0, newline
syscall

la $t0 array  #array's starting index
li $t1 0      #loop index i=0
lw $t2 length

traverseArray:
lw $t4 ($t0)   #get array[i]
# printing array
addi $a0,$t4,0
li $v0,1
syscall
# 
#printing space
li $v0, 4
la $a0, space   
syscall

addi $t1 $t1 1 #i = i+1
add $t0 $t0 4 #update array address

blt $t1 $t2 traverseArray

li $v0 10
syscall
.end main