0

mipsアセンブリ言語に変換されるC++プログラム

    #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アセンブリ言語プログラム

    .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 

lw、sw、lb、sbを試し、レジスタ$ t2の値を配列に入れようとしましたが、Marsコンパイラでプログラムをシングルステップ実行するとエラーが発生し続けます。

更新されたMipsアセンブリ言語プログラム

     .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

このプログラムを実行すると、次のエラーが発生します。「アドレスが範囲外0x00000004」配列の値を出力して、正しいかどうかを確認したい。

4

2 に答える 2

2

コードにいくつかのエラーがあります。配列へのアイテムの格納に関しては、格納するアイテムのアドレスを取得するために、配列のベースアドレスにインデックス(4を掛けたもの)を追加する必要があります。

$s0それがaを保持し、bを保持すると仮定すると$s2、保存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

intが32ビット幅で、各アイテムの長さが4バイトであると仮定すると、配列Dに10個のアイテムを保持するのに十分なメモリを予約しなかったことに注意してください。したがって、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 に答える