我有一个家庭作业,我必须在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
访问要乘以的值,但是不知道是否使用了shift我可以访问函数的5参数。
答案 0 :(得分:2)
即使代码正常工作,您实际上并没有在堆栈上分配足够的空间。您正在分配20个字节,但是您正在使用sb $8,20($29)
访问第21个字节。
您不必将寄存器索引为0:如果只执行sw $31,($29)
,则偏移量隐式为0.
我不知道你班上的约定是什么,但我建议使用别名来表示重要的寄存器,例如$ra
而不是$31
,{{1}而不是$sp
等我发现它更具可读性。
最后,乘法!这是一个提示:
$29
与x << y
相同。因此x * (2^y)
为x << 4
,x * 16
为x << 3
等。
主方程中的系数是否都是2的幂?对。这就是我的建议:在4处开始循环计数器并向下计数到0.这样你就可以使用循环计数器作为移位值,而且不需要使用11美元。