0

以下のCコードをMIPSアセンブリ言語に翻訳しようとしていますが、ほとんどは理解していますが、最初の行に相当するものがアセンブリにあるのかわかりません...

int ary[3] = {2,3,4};

誰かが私のCからアセンブリへの「翻訳」を見て、私が正しい軌道に乗っていることを確認していただければ幸いです。

C コード

int ary[3] = {2,3,4};
int i=0;

//loop to double array values
for(i=0; i < 3; i++){
    ary[i] = ary[i]*2;
}

私が試したこと:

add $t0, $s0, $zero #get base address of the array 'ary' (dont understand this part)
addi $t1, baseAddress, 8 #cut off point to stop the loop; array[2]
addi $t1, $zero, $zero #initialize i=0


Start:
lw $t2, base(offset)
sll $t2, $t0, 1 #mutiply $t2 by 2  
sw $t2, base(offset)
addi $t0, $t0, 4 # Increment the address to the next element
bne $t0, $t1, Start # $t0 will keep increasing until reaches stopping point $t1
Exit:
4

3 に答える 3

2

それがローカル配列の場合は、スタックにスペースを割り当ててから、コードから初期化します。C コードの可能な asm 変換は次のようになります。

    addi $sp, $sp, -12     # allocate space for 3 words, $sp is now the address of the array
    addi $t0, $zero, 2
    sw $t0, ($sp)          # ary[0]=2
    addi $t0, $zero, 3
    sw $t0, 4($sp)         # ary[1]=3
    addi $t0, $zero, 4
    sw $t0, 8($sp)         # ary[2]=4

    addi $t0, $zero, 0     # initialize i=0

Start:
    sll $t1, $t0, 2        # i*4 for element size
    add $t1, $t1, $sp      # add base address of array, $t1 is now &ary[i]
    lw $t2, ($t1)          # load ary[i]
    sll $t2, $t2, 1        # mutiply by 2
    sw $t2, ($t1)          # store back to ary[i]
    addi $t0, $t0, 1       # i++
    addi $t1, $t0, -3      # check if i<3 by doing (i-3)<0
    bltz $t1, Start
    addi $sp, $sp, 12      # free the array

あなたの asm コードは少し異なるアプローチをとっていました。C バージョンは次のようになります。

int* end = &ary[3];
for(int* ptr = ary; ptr != end; ptr++)
{
    *ptr = *ptr * 2;
}

そのための修正された asm バージョンは次のとおりです。

    addi $t1, $sp, 12      # end=&ary[3]
    addi $t0, $sp, 0       # ptr=ary

Start:
    lw $t2, ($t0)          # load ary[i]
    sll $t2, $t2, 1        # mutiply by 2
    sw $t2, ($t0)          # store back to ary[i]
    addi $t0, $t0, 4       # ptr++ (note it is incremented by 4 due to element size)
    bne $t0, $t1, Start    # ptr!=end
于 2012-11-16T18:21:27.457 に答える
-2
  #include <iostream>
  using namespace std;

  //prototypes

  int maxIs (int *x, int n);
  int minIs ( int *x, int n);
  void avgIs (int *x, int n, int *theAvg, int *theRem);

  int main(void)
  {
  int n = 8;
  int x[] = {1,2,3,4,5,6,7,8};
  int theMax, theMin, theAvg, theRem;

  theMax = maxIs(x,n);
  theMin = minIs(x,n);
  avgIs(x,n,&theAvg, &theRem);

  cout << "max = " << theMax << "\n";
  cout << "min = " << theMin << "\n";
  cout << "avg = " << theAvg << " " << theRem << "/" << n << "\n";
  cout << "Bye!\n";
  }

  //functions

 int maxIs (int *x, int n )
 {
int i;
int theMax = 0;
for (i=0; i<n; i++)
{
    if (x[i]>theMax) theMax =x[i];
}
return (theMax);
}

int minIs (int *x, int n )
{
int i;
int theMin = 0x7FFF;
for (i=0; i<n; i++)
{
    if (x[i]>theMin) theMin =x[i];
}
return (theMin);
}

void avgIs (int *x, int n, int *theAvg, int *theRem )
{
int i;
int theSum = 0;
for (i=0; i<n; i++)
{
    theSum += x[i];
}
*theAvg = theSum /n;
*theRem = theSum %n;
}
于 2014-04-18T20:17:28.260 に答える