关于代码中MIPS指令的问题

时间:2012-11-01 03:00:03

标签: assembly mips

我对以下代码中的几条MIPS指令有疑问 1. addi是算术指令,它的用途是什么? 2.为什么nopj之后有beqnopaddi之后有多个if(a==b) x=3; /* simple C code */ else x=4; y=5; lw $1,a # possible unoptimized assembly language lw $2,b # no ($0) shown on memory access nop # wait for b to get into register 2 nop # wait for b to get into register 2 beq $1,$2,lab1 nop # branch slot, always executed ********* addi $1,4 # else part nop # wait for 4 to get into register 1 nop # wait for 4 to get into register 1 sw $1,x # x=4; j lab2 nop # branch slot, always executed ********* lab1: addi $1,3 # true part nop # wait for 3 to get into register 1 nop # wait for 3 to get into register 1 sw $1,x # x=3; lab2: addi $1,5 # after if-else, always execute nop # wait for 5 to get into register 1 nop # wait for 5 to get into register 1 sw $1,y # y=5; ? 谢谢!

{{1}}

3 个答案:

答案 0 :(得分:3)

addi是“立即添加”,它向寄存器的内容添加一个立即值(常量,整数)。另一个添加变量是寄存器添加寄存器。

addi之后的nops和描述从mips的角度来看根本没有意义。 Mips很好地用于教育目的,并且您正在使用或正在教授的特定实现可能需要时间来使addi指令解码并执行并将结果存储到寄存器文件中,然后该寄存器可用作另一指令的输入。通常情况下,mips内核(或任何现代流水线处理器)将阻塞下一条指令或使用其他解决方案来缩短作为后续指令输入的一条指令的结果。

不仅是addi而且还有lw,你看到这些nops用于延迟时间,因为评论说结果存储在寄存器中。

至少要考虑基本步骤,获取,解码,执行,存储结果。这段代码似乎允许至少部分步骤完成,即使真正的mips不需要。

在分支之后有一个延迟槽是一个很简单的事情(确定其他人这样做但是它比普通的更罕见)。简单的方法是在每个分支或跳跃后放一个小块并浪费周期。最后,您将了解何时可以在分支之前执行其中一条说明并将其放在之后,否则如果找不到则使用no​​p。

一般来说代码看起来很好。为了使addi指令工作以使代码代表C代码,addi确实需要使用寄存器0,它始终为零。 Addi接受一个寄存器并立即将它们加在一起并将结果放在一个不同的寄存器中,有两个寄存器用于addi和一个常量...你只有一个寄存器的代码。对于addi在该代码中的所有用法,如果你这样想:

addi $1,4 
changes to 
addi $1,$0,4
register $0 is always zero so this instruction really means
$1 = 0 + 4 = 4
$1 = 4

我从正式的角度和从机器代码的角度来看mips指令,也许addi $ 1,4是一个代表更正式的addi $ 1,$ 0.4的快捷方式。组装代码然后检查该指令的机器代码,你可能会看到两个寄存器$ 1和$ 0,即4。

Mips没有mov指令,您可以在一个镜头中立即移动整个寄存器。 lui指令用于将位置于寄存器的上半部分中,而将零位置置于下半部分中。 Lui后面跟一个addi或ori可以作为一个团队立即加载。或者,如果高位为零,则可以使用带寄存器0($ 0)的addi或ori来设置单个指令中的低位。对于这个asm来表示C代码,后者必须是这种情况。

答案 1 :(得分:1)

我不知道MIP汇编程序我在猜测以下内容(在阅读Wiki文章MIPS Architecture之后)

  1. 作者知道a = 0,因此$ 1 = 0,因此addi $ 1,4将$ 1 = 4设置为sw为x。
  2. NOP没有意义 - 除非作者知道指令是并行的,因此插入时钟周期等待以确保先前的指令完成。
  3. 代码是否有更多上下文(即x和a,b等的设置)

答案 2 :(得分:1)

在正常的MIPS汇编程序中addi $1,4addi $1,$1,4的简写,即将4加到$ 1。将常量加载到寄存器中的常规简写是li $1,4,汇编程序通常将其转换为ori $1,$0,4。 (寄存器$ 0总是包含零。)

教师的示例似乎不正确,除非已知a始终为零。在这种情况下,有更好的方法来实现此代码。