Reputation: 41
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.
Upvotes: 0
Views: 5997
Reputation: 1
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;
Upvotes: 0
Reputation: 22585
There are several errors in your code. Regarding the storing of items in the array, you have to add the base address of the array with the index (multiplied by 4) to get the address of the item to be stored.
Assuming that $s0
holds a and $s2
holds b, to store D[a] = a + b
you would:
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
Note that you didn't reserve enough memory to hold 10 items in array D, assuming an int is 32 bits-wide, then each item is 4 bytes long, therefore you should reserve 40 bytes...
You should also ensure that the array is properly aligned at a word boundary. To do that, you can instruct the assembler to do the alignment for you with the .align 2
directive, e.g:
.align 2
array: .space 40
Upvotes: 2