MIPS使用班次高效

时间:2012-04-22 10:10:13

标签: assembly mips

我有一个家庭作业,我必须在MIPS程序集中编写一个函数,该函数必须使用移位,并且必须是最有效的。

通过func(n1,n2,n3,n4,n5);

在C上调用汇编代码

这是我的代码,它按预期工作。

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访问要乘以的值,但是不知道是否使用了shift我可以访问函数的5参数。

1 个答案:

答案 0 :(得分:2)

  • 即使代码正常工作,您实际上并没有在堆栈上分配足够的空间。您正在分配20个字节,但是您正在使用sb $8,20($29)访问第21个字节。

  • 您不必将寄存器索引为0:如果只执行sw $31,($29),则偏移量隐式为0.

  • 我不知道你班上的约定是什么,但我建议使用别名来表示重要的寄存器,例如$ra而不是$31,{{1}而不是$sp等我发现它更具可读性。

  • 最后,乘法!这是一个提示:

    $29x << y相同。因此x * (2^y)x << 4x * 16x << 3等。

    主方程中的系数是否都是2的幂?对。这就是我的建议:在4处开始循环计数器并向下计数到0.这样你就可以使用循环计数器作为移位值,而且不需要使用11美元。