2012-04-22 39 views
0

我有一项家庭作业,我必须在MIPS Assembly中编写一个函数,并且该函数必须使用移位,并且必须是最有效的可能。MIPS高效使用移位

汇编代码是由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参数。

回答

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

  • 您不必通过0为寄存器编制索引:如果您只是执行sw $31,($29),则偏移量隐含为0。

  • 我不知道是什么的惯例是在你的类,但我建议使用的别名重要的寄存器,如$ra而不是$31$sp代替$29,等我找到它更具可读性。

  • 最后,乘法!以下是提示:

    x << yx * (2^y)相同。所以x << 4x * 16x << 3x * 8

    在主方程的系数为2的所有权力?对。这是我的建议:在4开始你的循环计数并倒计数到0。这样你可以使用循环计数器作为移位值,并且它消除了使用$ 11的需要。

+0

非常感谢您的解释。我的数学背景不是最好的,所以这个小东西变得不稳定:) – Favolas 2012-04-23 08:16:10