【发布时间】:2017-08-03 06:21:47
【问题描述】:
我最近开始探索 MIPS,我不确定我是否很好地理解了这段代码。
addi s4, $0, 0 // s4 = 0;
addi s1, $0, 7 // s1 = 7;
addi t2, $0, 7 // t2 = 7;
addi s0, $0, 1 // s0 = 1;
addi t1, $0, 21 // t1 = 21;
L1: addi s1, $0, 0 // s1 has new value s1 = 0;?
L2: addi s4, s4, 7 // s4 += 7;
addi s1, s1, 1 // s1 += 1;
slt t3, s1, t2 // t3 = (s1 < t2) ? 1 : 0;
bne t3, $0, L2 // if t3 != 0 go to L2
nop
addi s0, s0, 1 // s0 =+ 1;
slt t3, s0, t1 // t3 = (s0 < t1) ? 1 : 0;
bne t3, $0, L1 // if t3 != 0 go to L1
nop
L3: nop
问题是这个汇编代码末尾的 s4 的值是多少。 我想 C 翻译会是:
for(int i = 1; i < 21; i++)
for(int j = 0; j < 7; j++)
s4 += 7;
但是我很关心这条线。
L1: addi s1, $0, 0
在我看来,我覆盖了 s1 = 7;与 s1 = 0;。这会在 L1 的每次迭代中发生还是仅发生一次?我之所以问是因为L2: addi s4, s4, 7这行代码会在 L2 循环的每次迭代中发生。
由于我的假设,我不确定我对 C 的翻译是否正确。提前感谢您澄清此代码中发生的情况。
【问题讨论】:
-
当然
j = 0发生在外循环的每次迭代中。 -
将其放入 SPIM/MARS/... MIPS asm+emulator 中应该有点容易(尤其是如果您以后必须在以后的任务中使用其中之一,那么尽早熟悉它们不要浪费时间),并尝试在调试器中逐条指令运行它。 value 的覆盖可能感觉很奇怪,因为原始的
s1 = 7没有在任何地方使用,但就是这样。一旦你用 CPU 跳转到“L1:”,就无法避免该指令,所以当然每次在滴答开始时pc等于L1时都会执行它。 C 版本看起来正确,但运行它以确保安全。