【问题标题】:incorrect output in MIPs programMIPs 程序中的错误输出
【发布时间】:2020-05-21 15:21:59
【问题描述】:

我正在实现从 c 到 mips 程序集的以下代码

/*
  Given an array arr terminated by entry -1, transform the array by adding
  to each entry the sum of the remainder of the array after that entry.
  That is, if initially arr == [a_0, a_1, ..., a_n, -1], then finally
  arr == [b_0, b_1, ..., b_n, -1], where b_j = sum(a_i for i in j..n-1).
 */

uint32_t reverse_prefix_sum(uint32_t *arr) {
  uint32_t r;

  if(*arr == -1) return 0;
  r = reverse_prefix_sum(arr+1) + (uint32_t)*arr;
  *arr = r;        /* may discard MSB */
  return(r);
}

我目前的程序如下:

reverse_prefix_sum: # Let the address of array arr be in $a0
    # adjust the stack pointer to save $a0 and $ra
    addi $sp,$sp,-8
    sw $a0,0($sp)
    sw $ra,4($sp)
    # Load *arr
    lw $t0,0($a0)
    beq $t0,-1,exit1 # r is in $v0

    # *arr = *arr + 1
    addu $a0,$a0,4 # recursive call
    jal reverse_prefix_sum
    addu $v0,$v0,$t0
    # restore $a0
    lw $a0,0($sp)
    #restore $ra
    lw $ra,4($sp)
    add $sp,$sp,8
    sw $v0,0($a0)
    jr $ra
exit1:
    # restore $a0
    lw $a0,0($sp)
    #restore $ra
    lw $ra,4($sp)
    addi $sp,$sp,8
    # return 0
    li $v0,0
    jr $ra

输入 1 2 3 4 -1,我得到输出 -4 -3 -2。 我想知道在哪里可以改进以修复输出不正确。

【问题讨论】:

  • 为什么不叫它后缀和呢?此外,您没有跟踪哪些寄存器是调用者保存的,哪些是被调用者保存的,因此您无法重新加载破坏的值。

标签: c assembly mips


【解决方案1】:

问题是 t0 没有在函数调用中保留。函数返回后恢复a0后从0(a0)重新加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多