2012-04-22 63 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