0

我有一个家庭作业,我必须在 MIPS 汇编中编写一个函数,并且该函数必须使用轮班并且必须是最有效的。

汇编代码在 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 个字节,但您正在使用sb $8,20($29).

  • 您不必按 0 对寄存器进行索引:如果您只是这样做,则偏移量隐式为 0 sw $31,($29)

  • 我不知道您的课程中的约定是什么,但我建议对重要的寄存器使用别名,例如$ra代替$31$sp代替$29等。我发现它更具可读性。

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

    x << y是一样的x * (2^y)x << 4x * 16x << 3x * 8,等等。

    主方程中的系数是 2 的所有幂吗?是的。这是我的建议:从 4 开始循环计数器并倒数到 0。这样您可以使用循环计数器作为移位值,并且无需使用 11 美元。

于 2012-04-22T20:15:36.733 回答