Assembly 在MIPS中递增重新注册

Assembly 在MIPS中递增重新注册,assembly,mips,Assembly,Mips,我的教授给了我们一份关于MIPS的工作表,但从未真正给出过示例,所以我需要假设我对说明的解释是正确的。我相当确定大多数问题都需要ADD和ADDI,但我想再次检查我是否正确使用了它 提供执行以下操作的序列: 到2010年增加15美元 我想这是ADDI$15,$15,2010 增加工作会更好吗?有没有办法实现这一点 还有一个问题是,在内存位置65528的字中放入值12345的序列,这让我感到困惑。addi是一种标准的方法,可以添加一个我们称之为“立即”值的文本,从而将i in addi添加到寄存器的

我的教授给了我们一份关于MIPS的工作表,但从未真正给出过示例,所以我需要假设我对说明的解释是正确的。我相当确定大多数问题都需要ADD和ADDI,但我想再次检查我是否正确使用了它

提供执行以下操作的序列:

到2010年增加15美元

我想这是ADDI$15,$15,2010

增加工作会更好吗?有没有办法实现这一点

还有一个问题是,在内存位置65528的字中放入值12345的序列,这让我感到困惑。

addi是一种标准的方法,可以添加一个我们称之为“立即”值的文本,从而将i in addi添加到寄存器的值中

如果你不允许使用addi,有些学校不允许,你可以将add和li结合使用。li$reg,imm将imm的值加载到寄存器$reg中

就更好的工作方式而言,如果有任何差别,那就可以忽略不计了。如果有的话,addi将更快一个CPU周期。差别是不容忽视的,在大多数情况下,这并不重要。在学术环境中,这几乎肯定不重要

至于你的第二个问题:它的措辞不是很清楚,但你被要求将一个立即值存储到内存中的一个位置。除非你的教授真的没有谈论这些指导,否则你的工作表上至少应该有一条指导可以做类似的事情

看看sw。你需要做一点预处理,但它会让你上路的


这里有一些例子如何做到这一点,不一定是最佳的指令序列

ADDI将立即数值添加到寄存器,并将结果存储在另一个寄存器中,而ADD将添加两个寄存器,并将值存储在第三个寄存器中

例如,您的ADD2010任务可以通过任何一种方式完成,尽管使用ADDI更简单,因为您需要先将值2010存储在寄存器中才能使用add

例如,

ORI $1, $0, 2010         ; store the value 2010 in $1
ADD $15, $15, $1         ; add $1 with $15, store result in $15
在这种情况下,ADDI更简单。如果要添加的值不符合ADDIs immediate value允许的16位有符号值,则使用ADD更有意义

作为第二个问题的示例,您可以轻松地将所需的值存储在寄存器中

ORI $14, $0, 12345
ORI $15, $0, 65528
…然后您可以使用SW来存储单词

SW $14, 0($15)

如果你的教授的教学列表没有提供足够的信息,这是一个很好的起点,尽管如果你环顾四周,MIPS教学集在网络上有很好的文档记录。

如果你不允许使用addi,有些学校不会。呵呵。真奇怪。考虑到li是伪指令,而addi是实际的MIPS指令,这取决于课程内容。任何关于汇编编程的课程都可能会让你使用它,但我曾经上过一门关于编译的课程,这门课程要求我们使用lis而不是MIPS指令。LUI将16位常量加载到寄存器的上16位,并将下16位置零。要加载32位常量,请执行LUI,后跟ADDI或ORI.ADDIU,ADDI仅将16位有符号常量加载到寄存器的较低16位。您需要使用LUI将常量加载到上面的16位。很抱歉在这里过于迂腐:-立即数值是16位有符号常量,因此65528不是合法值。像ADDIU、SUBU这样的操作码中的U表示不捕获整数溢出,它并不表示无符号。@markgz啊,现在我明白你的意思了*bops head*。更改了ADDIU的误用,感谢您纠正我:
SW $14, 0($15)