0

MIPSアセンブリで関数をコーディングする必要がある宿題が1つあり、その関数はシフトを使用する必要があり、可能な限り最も効率的である必要があります。

アセンブリコードはCで呼び出されますfunc(n1,n2,n3,n4,n5);

これは私のコードであり、期待どおりに機能しています。

01          .data
02          .text
03          .globl  func
04
05  func:
06      
07      lw      $8, 16($29)     
08      addi    $29,$29, -20        
09      sw      $31,0($29)      
10      
11      # f = 16x1 + 8x2 + 4x3 + 2x4 + x5 This is what the function do
12      
13      
14      li      $9,0        
15      li      $10,0       
16      li      $11,16  
17
18              # Load the five function parameter on function
19      sb      $4,4($29)
20      sb      $5,8($29)
21      sb      $6,12($29)
22      sb      $7,16($29)
23      sb      $8,20($29)
24
25      la      $25,4($29)
26  loop:
27      
28      lb      $24,0($25)
29      mul     $12,$11,$24     
30      add     $9,$9,$12       
31      
32      srl     $11,$11,1       
33      addi    $25,$25,4
34      #addi   $29,$29,1
35      
36      addi    $10,$10,1       
37      ble     $10,4,loop      
38
39      
40      move    $2,$9           
41  end:    
42      
43      lw      $31,0($29)
44      addi    $29,$29,20      
45      jr      $31

だから私が求めているのは、このコードはシフトを使用して最も効率的に実行できるということですか?

srl乗算する値にアクセスするように作成しましたが、シフトを使用して関数の5パラメーターにアクセスできるかどうかわかりません。

4

1 に答える 1

2
  • コードは機能していますが、実際にはスタックに十分なスペースを割り当てていません。20バイトを割り当てていますが、21番目のバイトに。でアクセスしていますsb $8,20($29)

  • レジスタに0でインデックスを付ける必要はありません。そうするだけで、オフセットは暗黙的に0になりますsw $31,($29)

  • クラスの規則が何であるかはわかりませんが、重要なレジスタのエイリアスを使用することをお勧めします。たとえば、の代わりに、などの$ra代わりに使用することをお勧めします。$31$sp$29

  • 最後に、掛け算!ヒントは次のとおりです。

    x << yと同じx * (2^y)です。x << 4です、、x * 16などx << 3ですx * 8

    主方程式の係数はすべて2の累乗ですか?うん。私が提案することは次のとおりです。ループカウンターを4から開始し、0までカウントダウンします。このようにして、ループカウンターをシフト値として使用でき、$11を使用する必要がなくなります。

于 2012-04-22T20:15:36.733 に答える