【问题标题】:C to MIPS Decimal to Binary Converter Using Recursion使用递归的 C 到 MIPS 十进制到二进制转换器
【发布时间】:2018-05-10 14:17:13
【问题描述】:

我是 MIPS 的新手,我编写了一个基本格式,我认为我编写的 C 文件中的代码相当于 MIPS。 我的任务是将以下我编写的 C 文件转换为 MIPS 应该是的直接翻译。我当前的 C 代码是:

#include <stdio.h>
int d2b(int d)
{
    if(d == 0)
    {
        return;
    }
    else
    {
        return (d %2 + 10 * d2b(d/2));
    }
}

int main()
{
    int d = 99;
    int b;

    b = d2b(d);
    printf("Input => %d  \n", d);
    printf("Output => %d ", b);

    return;
}

到目前为止,我有以下内容:

.data
 msg1   .asciiz “Number is “
 msg2   .asciiz “\nConverted to \n“
.text
.globl main 

main:
    li $v0, 4        
    la $a0, msg1 
    syscall

    li $v0, 5      #Exit syscall
    syscall 
    add $a0, $v0, $zero
    jal fact

    add $a0, $v0, $zero
    li $v0, 1
    syscall

    li $v0, 10
    la $a0, msg2 
    syscall


fact:   
    li      $t0     0               #load 0
    beq     $a0,    $t0,    skip    #test n
    li      $v0 0
    jr      $ra
skip:   
    subu    $sp,    $sp, 32
    sw      $ra     20($sp)
    sw      $fp,    16($sp)
    addiu   $fp,    $sp, 28
    sw      $a0,    0($fp)      #save n
    li      $t1 2               #load 2
    divu    $a0 $t1             #n / 2
    mfhi    $t2                 #remainder
    mflo    $t3                 #quotient
    move    $a0,    $t3         #n = quotient
    addi    $v0,    $a1,    10
    jal     fact
    lw      $a0,    0($fp)      #restore n
    multu   $v0,    $a0 
    lw      $ra,    20($sp)
    lw      $fp,    16($sp)
    addiu   $sp,    $sp,    32
    jr      $ra

我的主要问题是不知道如何使用系统调用,也没有真正理解 MIPS 中的递归函数。请指出我的错误和错误!

【问题讨论】:

  • 也许你应该检查这个网站:codereview.stackexchange.com 并在那里提交你的问题。
  • 如果代码不起作用,那么它就不适合了,@siserte。从最后一句话来看,代码似乎不起作用,因此很可能会在发布到 Code Review 后不久关闭。

标签: c recursion mips


【解决方案1】:

您的 MIPS 系统调用在此部分中

li $v0, 4        
la $a0, msg1 
syscall

li $v0, 5      #Exit syscall
syscall 
add $a0, $v0, $zero
jal fact

add $a0, $v0, $zero
li $v0, 1
syscall

li $v0, 10
la $a0, msg2 
syscall

他们的评论不正确

在 MIPS 系统调用中,$v0 包含“系统调用函数”或英文,即您希望操作系统执行的服务。 There's a table of them here.

$a0 将保存传递给调用的第一个参数。要设置此参数,一种技术是将输入值添加到零并将结果存储到$a0 这就是为什么你有这么多这样的行

add $a0, $v0, $zero # this adds $v0 to the number zero and storing in $a0

最后,您使用的系统调用是(4 => 打印字符串、5 => 读取整数、1 => 打印整数和 10 => 退出)

因此,您的代码的正确注释示例将是

la $a0, msg1         # load string as parameter
li $v0, 4            # load operation "print string"
syscall              # request "print string" for msg1

li $v0, 5            # load operation "read integer"
syscall              # request "read integer"
add $a0, $v0, $zero  # load the read integer into $a0 
jal fact

add $a0, $v0, $zero  # load the value of $v0 into $a0
li $v0, 1            # load operation "print integer"
syscall              # request "print integer"

如您所见,我的困惑并非来自您使用系统调用的能力,而是来自您对您认为使用系统调用做什么的描述。

您声明要从十进制输入中打印一个二进制数,例如 01001010。这通常涉及在循环中分解十进制数,在每个二进制数位置打印出零或一。由于这需要对二进制数中的每个占位符进行循环,因此似乎不可能对“打印整数”进行一次调用(除非输入仅限于十进制“1”和“0”,或者输入仅限于如此小的数字,以至于它的二进制表示,以十进制格式表示小于 max_int)。

因此,对于 5 的输入,所需的输出将是 101,这将是 3 次打印调用,顺序为“1”、“0”、“1”。我相信这种在循环中打印数字的方法会给您带来更大的成功,并允许您打印输入的每个正十进制数。

简而言之,我认为您的系统调用命令很好,但您仍在为如何执行循环和解决汇编中的问题而苦苦挣扎。尝试弄清楚如何使用铅笔和纸手动确定所需顺序的数字,然后尝试将其编码到您的程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2014-12-05
    相关资源
    最近更新 更多