【发布时间】:2021-09-21 01:13:45
【问题描述】:
这是作业问题:假设寄存器 $s2 保存数组“A”内存中的基地址,寄存器 $s3 保存数组“B”内存中的基地址。编写 MIPS 代码将 A[2] 的内容与 B[2] 交换。
为了澄清,我们只学过 I 型和 R 型指令,我们只知道基本的 sw、lw、加法和减法,没有更复杂的了。我不确定我是否正确理解 lw 和 sw。这是我的尝试:
lw $t2, 8($s2) #load A[2] into temp
lw 8($s2), 8($s3) #load B[2] into previous A[2], or is lw 8($s2), 8($s3) not allowed?
sw $t2, 8($s3) #store previous A[2] value into previous B[2], sw is reversed of lw right?
Here's another 有点类似的问题,不同之处在于它是 A[4] 和 A[9] 在同一个数组中,明显的错误是假设 32 位缺少 4 位缩放,所以 16 不是 4 和 36 不是9. 但对我来说这更优雅,这是汇编交换的正确语法吗?它们还存储在一个临时文件中。
lw $t0, 4($s1)
sw 4($s1), 9($s1)
sw 9($s1), $t0
他们给出的答案是这样,但我仍然想知道三个陈述答案中的一个是否有效,它不是直接的交换,但我仍然可以这样做:
lw $t0, 16($s1)
lw $t1, 36($s1)
sw $t0, 36($s1)
sw $t1, 16($s1)
【问题讨论】:
-
lw和sw都不接受两个内存操作数。不会是“负载”或“商店”吗? Load 总是从内存中读取到寄存器中,而 store 则将寄存器的内容写入到内存中。不幸的是,您的解决方案无效。使用汇编程序或查阅指令集参考可以确认这一点。 -
谢谢,我真的可以使用汇编IDE,我的教授建议SPIM,我有qtSpim,但它似乎不允许输入,我不确定我是否有错误的东西? @小丑
-
QtSpim 允许输入。您需要使用控制台窗口。
-
我试过了,但也许它不像现代编辑器那样工作,我回去看看能不能解决,谢谢!
-
MARS 在某些方面更好,并且在 x86 上模拟了与 SPIM 相同类型的机器(相同的玩具系统调用,相同的默认小端 MIPS,没有分支延迟槽),并且相同的 asm 语法(旧式 MIPS,与 MIPS 的 GAS / clang 语法的语义不太一样,例如
.align很奇怪)。 IIRC、qtSPIM 的内置编辑器和保存/构建/调试周期有点笨拙。顺便说一句,Jester 是在谈论用于运行代码的文本 I/O,而不是在编辑器的 IDE 中“输入代码”。我想qtSPIM有一个编辑器,但我忘记了。