Assembly MIPS组件中lw/sw操作的格式?

Assembly MIPS组件中lw/sw操作的格式?,assembly,mips,mips32,Assembly,Mips,Mips32,我目前正在学习一门建筑课程,作为该课程的一部分,我正在学习MIPS组装 据我所知,lw和sw操作是I格式指令,允许两个寄存器操作数和一个立即数操作数: [opcode] 6-bits, [rs] 5-bits, [rt] 5-bits, [immediate] 16-bits written as: lw $rt, offset($rs) # where offset is an immediate value [操作码]6位、[rs]5位、[rt]5位、[immed

我目前正在学习一门建筑课程,作为该课程的一部分,我正在学习MIPS组装

据我所知,lw和sw操作是I格式指令,允许两个寄存器操作数和一个立即数操作数:

[opcode] 6-bits, [rs] 5-bits, [rt] 5-bits, [immediate] 16-bits written as: lw $rt, offset($rs) # where offset is an immediate value [操作码]6位、[rs]5位、[rt]5位、[immediate]16位 写为: lw$rt,偏移量($rs)#其中偏移量为立即值 好的,假设我想访问一个[I]。假设A的基址在寄存器$s7中,而索引(i)在寄存器$s1中,则我必须按照以下方式进行操作:

sll $t0, $s1, 2 # i*4 (offset) add $t0, $s7, $t0 # $t0 = &A[i] lw $t1, 0($t0) # $t1 = A[i] sll$t0、$s1、2#i*4(抵销) 加上$t0、$s7、$t0#$t0=&A[i] lw$t1,0($t0)#$t1=A[i] 我感到困惑的是,我的教授一直说,我们也可以用3个寄存器来执行这样的lw指令:

sll $t0, $s1, 2 # i*4 (offset) lw $t1, $t0($s7) # $t1 = A[i] sll$t0、$s1、2#i*4(抵销) lw$t1,$t0($s7)#$t1=A[i]
这两种解决方案都正确吗?还是我的导师不正确?偏移量不能用寄存器,对吗?我认为偏移量必须是一个立即数。我的理解是,在第一个解决方案中必须执行额外的add指令的原因实际上是因为不能使用寄存器作为偏移量。

lw/
sw
的偏移量必须是立即数。如果您的讲师声称MIPS指令集中存在接受寄存器偏移的
lw
/
sw
变体,则他/她是不正确的

然而,可能有汇编器接受这种变体作为伪指令,并将其转换为实际的MIPS指令。在这种情况下,可能的翻译为:

addu $at,$s7,$t0
lw  $t1, 0($at)

lw
/
sw
的偏移量必须是立即数。如果您的讲师声称MIPS指令集中存在接受寄存器偏移的
lw
/
sw
变体,则他/她是不正确的

然而,可能有汇编器接受这种变体作为伪指令,并将其转换为实际的MIPS指令。在这种情况下,可能的翻译为:

addu $at,$s7,$t0
lw  $t1, 0($at)

要学究的话,(过时的)MIPS DSP架构扩展包括允许寄存器用作偏移量的
lwx$rd,$rxxx($ryyy)
指令。要学究的话,(过时的)MIPS DSP架构扩展包括
lwx$rd,$rxxx($ryyy)
允许寄存器用作偏移量的指令。汇编语言作为一种语言,由汇编程序定义,即读取寄存器并从寄存器中生成机器代码的程序。它通常不是(如有)标准化语言,如C++或java,某些委员会的某个地方。MIPS已经有了常用的伪指令,这可能是某些特定汇编程序的另一个伪指令。汇编语言作为一种语言是由汇编程序定义的,汇编程序读取它并从中生成机器代码。它通常不是(如有)标准化语言,如C++或java,某些委员会的某个地方。MIPS已经有了常用的伪指令,这可能是某些特定汇编程序的另一条伪指令。