MIPS指令计数是否因实现而改变?

时间:2016-09-28 19:57:08

标签: assembly mips

这是一个非常新的MIPS编码器的一般性问题,但是当将代码从C转换为MIPS时,指令计数是根据实现而改变还是始终相同?例如,我使用一个等式来找到:

for(i=0; i<a; i++)
for(j=0; j<b; j++)
D[4*j] = i+j;

我的指令数是(4 * a)+(8 * a * b)+4。但是,这会根据我实际编写代码的方式而改变吗?谢谢!

1 个答案:

答案 0 :(得分:1)

当然,几乎从来没有一种方法可以做某事。

例如对于那些for循环,有一个&#34;无聊的&#34;在顶部进行测试并无条件地跳回来的方式,并且更加聪明&#34;在底部进行测试并在循环之前从#34;无条件跳转#34;直接进行测试。这是一种特殊形式的循环反转,不需要花费更多代码,但动态执行更少的指令(j不再在循环中,它只发生一次),除非循环有零迭代。

更一般地说,您可以决定将局部变量始终保留在寄存器中,或让它们在内存中花费不同的时间(范围从最愚蠢的#34;每次使用时的加载和每次分配时的存储&#34 ;对于你可能想要移除的许多无意义的装载和存储)。

&#34;你&#34;在这个故事中,显然也可以是编译器。而你(这次是真正的你)通常可以通过给它一些标志来操纵它发出的指令数量。通常告诉它根本不进行优化会导致编译器在每次使用变量时都会发出负载并存储在每个赋值中,而在任何非零优化时它都不应该这样做。