【问题标题】:Mips to C ConversionMips 到 C 的转换
【发布时间】:2013-03-04 17:35:09
【问题描述】:

我正在尝试将其转换为 C 代码,我知道它将是一个从 50 开始并向下运行的 forloop。但是我迷失在其他一些过程中,例如当我们进入中间时。

addi $t1, $0, 50
LOOP: lw $s1, 0($s0)
add $s2, $s2, $s1
lw $s1, 4($s0)
add $s2, $s2, $s1
addi $s0, $s0, 8
subi $t1, $t1, 1
bne $t1, $0, LOOP

【问题讨论】:

  • “当我们进入中间时”是什么意思?
  • 为什么根本没有 cmets(在您的代码中)?

标签: c assembly mips


【解决方案1】:

它可能看起来像这样:

    t1 = 0 + 50;
LOOP:
    s1 = *s0;
    s2 = s2 + s1;
    s1 = *s0 + 4;
    s0 = s0 + 8;
    t1 = t1 - 1;
    if (t1 != 0) goto LOOP;

goto 转换为for 循环:

int *s0 = /* ... */;
int s2 = /* ... */;

for (t1 = 50; t1 != 0; t1--) {
    s2 += *s0;
    s0 += 8;
}

【讨论】:

  • 既然它将0(s0)4(s0) 添加到s2,那么“C”循环体不应该是s2 += s0[0]; s2 += s0[1]; s2 += 8; 吗?
【解决方案2】:

直接翻译为:

int32_t* s0;
int32_t i = 50;
int32_t s2;
do {
    s2 += s0[j];
    s2 += s0[j+1];
    s0 += 2;
} while(--i);

s0 和 s2 的初始值在汇编代码中没有给出,但我相信你可以弄清楚

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多