0

C++ program to be converted to mips assembly language

    #include <iostream>
    using namespace std;

    int main() {

int a = 1; 
int b = 1; 
    int array[a];
   while ( a < 10)
    {   
     array[a] = b + a;
 cout << array[a] << endl; // print elements in array //check values in array
        a +=1;
    }
      system("pause");  
    return 0;
    }

Mips assembly language program

    .data
     str: .ascii "abcdef"
     array: .space 20
    .text
    main: 
     li $s0, 1 # a = 1
     li $s2, 1 # b = 1         
     loop:
     la  $t1, array
     slti $t0, $s0, 3   # t0<- 1 if a < 3
     beq $t0, $zero, exit
     sll $t0, $s0, 2    # t1<- 4*a
     add $t1, $t1, $t0  # new base addr
     add $t2, $s2, $s0  # t2<- a+b   
     sw  $t1, 0($t2)    # D[a]=a+b
     addi $s0, $s0, 1   # a = a +1
     j loop             # goes to loop: label 
     exit:
     li $v0, 10 # v0<- (exit)
     syscall 

I've tried lw, sw, lb, sb to put the value of register $t2 in the array, but I continue to get an error when I single step run program in Mars compiler

Updated Mips assembly language program

     .data
     str: .ascii "abcdef"
     .align 2
     array: .space 40
     .text
     main: 
     li $s0, 1 # a = 1
     li $s2, 1 # b = 1
     loop:
     la  $t1, array
     slti $t0, $s0, 3   # t0<- 1 if a < 3
     beq $t0, $zero, exit
     sll $t0, $s0, 2   # t1<- 4*a
     addu $t2, $t1, $t0 # new base addr
     add $s1, $s0, $s2 # s1<- a+b
     sw  $s1, 0($t2)   # D[a]=a+b

     li  $v0, 1        # load appropriate system call code into register $v0;
               # code for printing integer is 1
     lw $a0, 0($t0)
     addiu $t0, $t0, 4
     syscall           # call operating system to perform print operation

     addi $s0, $s0, 1  # a = a +1
     j loop            # goes to loop: label          
     exit:
     li $v0, 10 # v0<- (exit)
     syscall

I run this program and I get this error: "address out of range 0x00000004" I want to print the values of my array to check if it is right.

4

2 回答 2

2

您的代码中有几个错误。关于数组中项目的存储,你必须将数组的基地址与索引相加(乘以4)才能得到要存储的项目的地址。

假设$s0持有 a 并$s2持有 b,要存储D[a] = a + b您将:

la $t1, array
sll $t0, $s0, 2
addu $t2, $t1, $t0  # $t2 is &D[a]
add $s1, $s0, $s2    # $s1 = a + b
sw $s1, 0($t2)  # D[A] = a + b

请注意,您没有保留足够的内存来保存数组 D 中的 10 个项目,假设一个 int 是 32 位宽,那么每个项目是 4 个字节长,因此您应该保留 40 个字节...

您还应该确保数组在字边界处正确对齐。为此,您可以指示汇编器使用.align 2指令为您进行对齐,例如:

.align 2
array: .space 40
于 2012-10-22T21:29:30.383 回答
0
intN;
cout<<"Enter the array size: ";
cin>>N; //size must be less than MAX_SIZE

int one[MAX_SIZE]; 
int two[MAX_SIZE]; 
cout<<"Ente the elements of array one:"<<endl;
for(inti = 0; i<N;i++)
    cin>>one[i];

cout<<"Ente the elements of array two:"<<endl;
for(inti = 0; i<N;i++)
    cin>>two[i];

int result = compare(one,two,N);

if(result == 0)
    cout<<"Array one is Equal to array two"<<endl;
elseif(result==-1)
    cout<<"Array one is less than array two"<<endl;
elseif(result==1)
    cout<<"Array one is greater than array two"<<endl;
于 2015-04-04T16:47:10.933 回答