MIPS 汇编中 lw/sw 操作的格式?
Format of lw/sw Operations in MIPS Assembly?
我目前正在学习架构课程,作为其中的一部分class我正在学习 MIPS 汇编。
据我了解,lw 和 sw 操作是 I 格式指令,允许 2 个寄存器操作数和一个立即操作数:
[opcode] 6-bits, [rs] 5-bits, [rt] 5-bits, [immediate] 16-bits
written as:
lw $rt, offset($rs) # where offset is an immediate value
好的,假设我想访问 A[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]
我感到困惑的是我的教授一直说我们也可以用 3 个寄存器执行这样的 lw 指令:
sll $t0, $s1, 2 # i*4 (offset)
lw $t1, $t0($s7) # $t1 = A[i]
这两种解法都正确吗?还是我的导师不对?您不能使用寄存器作为偏移量,对吗?我认为偏移量必须是立即数。据我了解,您必须在第一个解决方案中执行额外的 add 指令的原因实际上是因为您 cannot 使用寄存器作为偏移量。
lw
/sw
的偏移量必须是立即数。如果您的讲师声称 MIPS 指令集中有一个变体 lw
/sw
接受寄存器偏移量,那么 he/she 是不正确的。
但是,可能有些汇编程序接受 pseudo-instruction 等变体,并将其转换为实际的 MIPS 指令。在这种情况下,可能的翻译可能是:
addu $at,$s7,$t0
lw $t1, 0($at)
我目前正在学习架构课程,作为其中的一部分class我正在学习 MIPS 汇编。
据我了解,lw 和 sw 操作是 I 格式指令,允许 2 个寄存器操作数和一个立即操作数:
[opcode] 6-bits, [rs] 5-bits, [rt] 5-bits, [immediate] 16-bits written as: lw $rt, offset($rs) # where offset is an immediate value
好的,假设我想访问 A[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]
我感到困惑的是我的教授一直说我们也可以用 3 个寄存器执行这样的 lw 指令:
sll $t0, $s1, 2 # i*4 (offset) lw $t1, $t0($s7) # $t1 = A[i]
这两种解法都正确吗?还是我的导师不对?您不能使用寄存器作为偏移量,对吗?我认为偏移量必须是立即数。据我了解,您必须在第一个解决方案中执行额外的 add 指令的原因实际上是因为您 cannot 使用寄存器作为偏移量。
lw
/sw
的偏移量必须是立即数。如果您的讲师声称 MIPS 指令集中有一个变体 lw
/sw
接受寄存器偏移量,那么 he/she 是不正确的。
但是,可能有些汇编程序接受 pseudo-instruction 等变体,并将其转换为实际的 MIPS 指令。在这种情况下,可能的翻译可能是:
addu $at,$s7,$t0
lw $t1, 0($at)