1

我真的是 MIPS 的新手,我有这些问题,我为他们找到了很多不同的答案……如果有人可以提供帮助,那就太好了。谢谢

这段代码需要多少个时钟周期?

#Macro Instructions
li  $t0, 32         #  1 or 2 cycles ?      
                    #                lui $at, Upper 16-bits of value 
                    #                ori Rd, $at, Lower 16-bits of value
                    #                -----------------------------------
                    #                ori Rt, $0, value
                    #
                    #  Which set of instructions will be executed?


div $t2, $t2, $t0   #  41 cycles?          
                    #                bne Rt, $0,
                    #                break $0
                    #                ok: div Rs, Rt
                    #                mflo Rd

#Integer Instruction

lw  $t2, 0($t13)    #  1  cycles?
sw  $t2, 0($t3)     #  1  cycles?

这 4 行代码如何显着改进?通过避免使用宏或...?

4

1 回答 1

2
  • li $t0, 32

您可以通过反汇编可执行文件或目标文件轻松检查这一点。objdump从 MIPS 工具链中使用or-d选项-D。我猜想汇编器足够聪明,不会lui为这么小的值生成 a 。


  • div $t2, $t2, $t0

由于您是除以二 (32) 的幂,因此有一种更快的方法:按log2(divisor)位右移(即 5 位):

srl $t2, $t2, 5   # if $t2 is unsigned

或者

sra $t2, $t2, 5   # if $t2 is signed
于 2013-06-29T18:36:30.293 回答