【发布时间】:2011-11-30 05:28:37
【问题描述】:
我正在研究 MIPS 汇编语言,并在书中遇到了这个例子,对我来说这似乎是不正确的。如果是这样,那将不是我在这本书中发现的第一个错误。
变量f和g分别分配给寄存器$s0和$s1,数组A和B的基地址分别是$s6和$s7。
c代码示例为:
f = g - A[B[4]];
而提供的相应MIPS程序集是:
lw $t0, 16($s7)
lw $s0, 0($t0)
sub $s0, $s1, $s0
据我了解,上述 MIPS 代码会从内存中的$t0 提供的地址加载一些随机数据,然后从$s1 中减去它,而不访问$s6 中表示的数组的索引$t0。
根据我的理解,正确的 MIPS 程序集应该是:
lw $t0, 4($s7)
add $t0, $t0, $s6
sll $t0, $t0, 2
lw $s0, 0($t0)
sub $s0, $s1, $s0
我是正确的,这是书中的错误还是我误解了什么。
编辑:修复了 Chris Dodd 指出的更正 mips 代码中的错误
【问题讨论】:
-
我认为你是对的。干得好!
-
你的解释很好。该代码没有做它应该做的事实的最大证据是,没有提到
$s6,所以它不可能从数组A中检索一个元素。 -
假设数组 A 是每个元素 4 个字节(数组 B 似乎是 - 您使用 16 的偏移量来获取元素 4,并使用 lw 指令来获取 4 个字节),您还需要在此处添加乘以 4(或等效移位 2)
-
很好,克里斯·多德,错过了。
-
正确。书中的代码充其量是未定义的,最坏的情况是产生段错误。